Mariusz Gąsiewski

Usuwanie Duplicate Content w WordPress

W jednym z poprzednich postów Wyniki uzupełniające w Google pisałem o kwestiach zduplikowanej treści w serwisach i wynikającego z tego problemu wyników uzupełniających, które są swego rodzaju indeksem drugiego sortu w Google. Problem zduplikowanej treści szczególnie często pojawia się przy okazji blogów, gdzie w wielu przypadkach ta sama treść jest dostępna pod tymi samymi adresami.

W dzisiejszym poście postaram się przedstawić jeden ze sposobów rozwiązania problemu zduplikowanej treści w systemie WordPress.

1. Adres z www i bez www

  • Problem

Pierwszą i podstawową kwestią, na którą warto zwrócić uwagę jest poruszana przeze mnie kilka razy kwestia adresów z www i bez www serwisów. Dla robotów Google adresy http://www.ittechnology.us/ i http://ittechnology.us/ są dwiema różnymi stronami. W przypadku kiedy jeden z tych adresów nie zostanie przekierowany na drugi z nich będziemy mieli dwie witryny, na których siłą rzeczy zawsze będzie ta sama treść.

  • Rozwiązanie

Problem ten można rozwiązać dodanie prostego kodu do pliku .htaccess

[code lang=”html”]
RewriteCond %{HTTP_HOST} ^ittechnology.us
RewriteRule ^(.*)$ http://www.ittechnology.us/$1 [R=permanent,L]
[/code]

2. Ta sama treść w postach, kategoriach, Tagach

  • Problem

Budowa WordPressa sprawia, że w wielu miejscach bloga mamy tę samą treść dostępną pod różnymi adresami. Nie ma znaczenie przecież czy wybierzemy http://www.ittechnology.us/2007/01/ czy też http://www.ittechnology.us/category/pozycjonowanie-optymalizacja/ , http://www.ittechnology.us/tag/optymalizacja. Pod tymi wszystkim adresami mamy te same posty przedstawiane w różnej kolejności i różnym układzie.

  • Rozwiązanie 1

Po części problem zduplikowanej treści można rozwiązać w WordPress poprzez zastosowanie znacznika More”. W takiej sytuacji na podstronach serwisu , podstronach kategorii i itp. będą się wyświetlały tylko fragmenty postów, a ich cała treść będzie dostępna dla użytkownika po klikniecie linka „Więcej”.

Opis zaimplementowania treści opartej na znaczniku więcej można znaleźć pod adresem: http://codex.wordpress.org/Customizing_the_Read_More

W najprostszym wydaniu tego rozwiązania wystarczy użyć quicktagu More w Panelu Sterowania (w Administration > Write > Post mamy takie tagi jak bold, italic, more, link). Wystarczy ustawić kursor w miejscu gdzie chcemy zakończyć nasze wprowadzenie postu i kliknąć tag „more”, co spowoduje wklejenie w tym miejscu odpowiedniego znacznika tagu funkcjonalności „More”.

Uwaga: aby widzieć te znaczniki trzeba wyłączyć edytor WYSIWYG w Wordoress, co można zrobić w Opcje > Publikacja > Opcje publikacji wpisów poprzez odznaczenie „Włączaj domyślnie edytor WYSIWYG”

  • Rozwiązanie 2

Trochę bardziej skomplikowanym i jednocześnie najbardziej skutecznym rozwiązaniem problemu zduplikowanych adresów w WordPressie jest nakazywanie robotom wyszukiwarek indeksowanie tylko części adresów poprzez które udostępniamy swoją treść.

W przypadku kiedy chcemy, aby roboty indeksowały tylko adresy postów i adresy stron plus adres strony głównej (czyli tylko http://www.ittechnology.us/ bez http://www.ittechnology.us/page/2/ i itp.) można wkleić w sekcję HEAD pliku header.php naszej skórki WordPressa kod:

[code lang=”php”]

<?php if ( $paged >1 ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_search() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_archive() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_trackback() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>

[/code]

Jeżeli stosujemy również tagi na naszej stronie kod ten może wyglądać

[code lang=”php”]

<?php if ( $paged >1 ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_search() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_archive() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_tag() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>
<?php if (is_trackback() ) {
echo ‚<meta name="robots" content="noindex,follow"/>’;
}?>

[/code]

Kod ten będzie nakazywał robotom nieindeksowanie kolejnych stron serwisu poza adresem strony głównej, archiwów, treści trackback, wyników wyszukiwania, a w drugim przypadku również adresów tagów.

3. Treści RSS

  • Problem

Roboty Google indeksują wszystko co się daje zindeksować, w tym również treści postów w formacie xml tworzone na potrzeby czytników RSS (w postaci np. http://www.ittechnology.us/najczestsze-bledy-w-adwords/feed/ ). Indeksowane treści są uznawane przez roboty Google za zduplikowaną treść. Nierzadko się zdarza, że robot indeksuje wówczas tylko treść RSS, uznając, że sama treść postu jest tylko jego kopią.

  • Rozwiązanie

Warto przekonwertować wszystkie dostępne kanały dostępu do naszego serwisu w jeden poprzez implementację wtyczki FeedBurner. Implementacja tej wtyczki została pokrótce opisana w poście
Wtyczki WordPressa – część 4
. Wówczas to przekonwertowane kanały RSS naszych postów są dostępne pod jednym adresem w domenie FeedBurner.com (dla serwisu http://www.ittechnology.us/ jest to np. http://feeds.feedburner.com/MarketingWInternecie )

Jeżeli wcześniej jakieś adresy RSS dla naszych postów zostały zindeksowane przez Google warto usunąć je z indeksu Google. Można to zrobić tworząc przekierowanie 301 na adresy postów (po kliknięciu na adres adresu RSS w wynikach Google zostaniemy przeniesieni na odpowiadający danej treść RSS post).

  • Przykład

W serwisie http://www.ittechnology.us/ adresy postów miały postać http://www.ittechnology.us/patenty-google/feed/ . Aby przekierować wszystkie adresy RSS na adresy postów wystarczyło do pliku .htaccess dodać kod:

[code lang=”html”]
RewriteRule ^(.+/)feed/?$ /$1 [R=301,L]
[/code]

Przedstawione wyżej proste zabiegi powinny zapobiec problemowi zduplikowanej treści w WordPressie. Oczywiście nie wyczerpują one tematu, a jedynie naprawiają najpoważniejsze problemy związane z tym zagadnieniem. Wszelkie kody pokazane w poście można modyfikować według swoich potrzeb i dostosowywać je do charakteru swojego bloga.

Jeżeli ktoś ma jeszcze jakieś pomysłu na dodanie czegoś do tematu, zachęcam do dyskusji :).

W przypadku, kiedy uznasz strone za przydatna dodaj na swojej stronie link do niej.
Po prostu skopiuj i wklej link podany nizej (Ctrl+C to copy)
Wyglad linku po wklejeniu na stronie: Usuwanie Duplicate Content w WordPress

Dodaj link do:
| | | Y! MyWeb | +Google

51 komentarzy to “Usuwanie Duplicate Content w WordPress”

  1. groadinon 24 sty 2007 at 18:38

    Kolejny świetny wpis :-). Wkrótce rady z niego zastosuję u siebie.

    Jak zwykle mam małe uwagi / poprawki 😉
    1. A propos wyłączania edytora WYSIWYG, oprócz tej opcji o której napisałeś (lub zamiast) trzeba w Autorzy -> Twój Profil odznaczyć opcję “Używaj edytora WYSIWYG przy publikacji wpisów” (ostatnio próbowałem wyłączyć to się trochę naszukałem:-P).
    2. Zamieszczony kod PHP zamieniłbym na taki (to ten drugi kod z tagami):
    [code lang=”php”]
    < ?php if ( $paged >1 OR is_search() OR is_archive() OR is_tag() OR is_trackback() )
    echo ‘’;

    [/code]

    Pozdrawiam 🙂

  2. groadinon 24 sty 2007 at 18:41

    Oj sory myślałem że masz wklejanie PHP włączone, kog oczywiście jest taki:

    [code lang=”php”]
    < ?php if ( $paged >1 OR is_search() OR is_archive() OR is_tag() OR is_trackback() )
    echo ‘’;
    ?>
    [/code]

  3. adminon 24 sty 2007 at 21:13

    No tak masz rację, kod będzie wtedy dużo krótszy i prostszy 🙂 No cóż programowanie to nie jest moja mocna strona 🙂

  4. adminon 24 sty 2007 at 21:20

    Co do kodu to używam wtyczki do koloryzowania kodu. Jak chcesz, aby się jakiś kod php ładnie wyświetlał to wrzucasz go pomiędzy znaczniki

    [code lang=”php”]

    [code lang=”php”]
    [/code]

    [/code]

    Mam nadzieję, że moje rady się przydadzą :). Polecam jeszcze zastosowanie SEO Title i Head Meta Description. Są one opisane w
    Wtyczki WordPressa – część 3
    .

  5. Arekon 24 sty 2007 at 22:23

    A co z adresami z komentarzami czyli np. http://www.ittechnology.us/usuwanie-duplicate-content-w-wordpress/#comments
    Przecie to ma te samą treść, co post. Czyż nie?

  6. adminon 24 sty 2007 at 22:40

    Roboty nie będą indeksowały adresów po znaku „#”. Z tego względu nie ma tutaj problemu z Duplicate Content

  7. wallaceon 26 sty 2007 at 01:03

    A propo adresu z www czy bez www, Google proponuje po prostu ustawić to w Google sitemaps.

  8. adminon 26 sty 2007 at 07:30

    Masz rację. Warto to uściślić również w SiteMaps W sumie warto zrobić jedno i drugie 🙂 Kod w .htaccess usuwa problem z zduplikowanymi adresami z WWW i bez www dla adresów, które zostały już zindeksowane przez Google.

  9. Wordpress - optymalizacja pod SEOon 25 mar 2007 at 20:37

    […] Szczegółowy opis wszystkich aspektów usuwania zduplikowanych adresów w obrębie serwisu, opartego na Wordpresie można znaleźć w moim poście: Usuwanie Duplicate Content w WordPress. […]

  10. rtofvnton 02 kw. 2007 at 21:08

    … no tak – wklejam ten kawałek do .htaccess i przestają działać linki na stronie … tzn. wszystkie przekierowują na główną.

    A mam tam też takie coś:

    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress

    Co zrobić ?

  11. adminon 02 kw. 2007 at 21:22

    Witam serdecznie. O który kawałek Ci dokładnie chodzi?
    Coś w stylu

    RewriteCond %{HTTP_HOST} ^jakasstrona.pl
    RewriteRule ^(.*)$ http://www.jakasstrona.pl/$1 [R=permanent,L]

    ?

  12. adminon 03 kw. 2007 at 06:38

    Spróbuj w takiej postaci – jeżeli dobrze zgaduje, że o to Ci chodziło

    [code lang=”php”]
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^csselite.pl
    RewriteRule ^(.*)$ http://www.csselite.pl/$1 [R=permanent,L]


    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]


    [/code]

    Powinno działać 🙂

  13. rtofvnton 03 kw. 2007 at 08:41

    Tak 🙂 Dzięki serdeczne – czasami łatwiej mi zrozumieć moją żonę niż ten .htaccess …

  14. adminon 03 kw. 2007 at 10:31

    Cieszę się, że się przydało. .htaccess to dość cięzka rzecz. Na szczęcie tak naprawdę sprawę z nim załatawia parę skryptów, które się nieustannie przewijają. 🙂

  15. henryon 12 maja 2007 at 16:45

    Witam !
    Dzieki za przydatne informacje
    własnie stawiam na bazie Word Pressa
    nową strone internetowa Polska w internecie
    zapraszam już wkrótce
    Henry

  16. adminon 12 maja 2007 at 17:13

    Oczywiście odwiedzę. Pamiętaj jednak, że najważniejsza jest wartościowa treść, dopiero później optymalizacja – a najlepiej i jedno i drugie 🙂

  17. hmmon 10 sie 2007 at 18:22

    Zamiast kombinować z FeedBurnerem nie wystarczy dodać
    /feed
    /*/feed
    i całej reszty do robots.txt?

  18. adminon 10 sie 2007 at 18:26

    Tak też można. W przypadku np. tagów, dodatkowych stron po stronie głównej, wyników wyszukiwania i itp lepszym wyjściem są znaczniki. Już nawet przedstawianie fragmentów postów na stronach z wynikami rozwiązuje częściowo problem.

  19. hmmon 13 sie 2007 at 21:30

    Znaczniki czyli to o czym piszesz w notce?

  20. adminon 13 sie 2007 at 22:38

    Tak, np:
    [code lang=”php”]

    [/code]

  21. hmmon 13 sie 2007 at 22:56

    Dlaczego są lepszym wyjściem? U Ciebie ich nie widzę 🙂

  22. adminon 14 sie 2007 at 09:26

    Zobacz adresy typu:
    http://www.ittechnology.us/tag/adwords
    http://www.ittechnology.us/page/2/

    Tam są znaczniki 🙂

  23. hmmon 14 sie 2007 at 17:20

    Mógłbyś opisać jak je tam powstawiałeś 🙂

  24. adminon 15 sie 2007 at 13:42

    Opisałem to właśnie w tym poście w punkcie 2 w podpunkcie 2 rozwiązanie.
    Wklejasz w sekcję HEAD pliku header.php naszej skórki WordPressa kod:
    [code lang=”php”]
    < ?php if ( $paged >1 ) {
    echo ‘’;
    }?>
    < ?php if (is_search() ) { echo ‘’;
    }?>
    < ?php if (is_archive() ) { echo ‘’;
    }?>
    < ?php if (is_trackback() ) { echo ‘’;
    }?>
    [/code]

  25. wallaceon 15 sie 2007 at 14:29

    dla ścisłości i przejrzystości:
    [code lang=”php”]

    < ?php if ( $paged >1 || is_trackback() || is_search() || is_archive() )
    echo ‘’;
    ?>

    [/code]

  26. wallaceon 15 sie 2007 at 14:30

    oj, wcieło kod 😉

  27. hmmon 15 sie 2007 at 15:27

    is_tag odnosi się do domyślnych wordpressowych kategorii czy tagów z jakieś wtyczki?

  28. hmmon 15 sie 2007 at 15:37

    Ale już na takiej http://www.ittechnology.us/2007/08/ podstronie znaczników nie widzę. Dlaczego?

    wallace: tak, wiem – chodzi Ci o to co wyżej zaproponował groadin.

  29. adminon 15 sie 2007 at 15:52

    @hmm – is_tag odnosi się do tagów tworzonych przy okazji wtyczki http://www.neato.co.nz/ultimate-tag-warrior/ (u mnie jest to połowicznie zaimplementowane – z braku czasu 🙁 ). Jeśli chodzi o daty to z nimi dałem sobie już spokój (wymagało by to dodatkowej pracy, a znów kłania się brak czasu 🙂 )
    @wallace – naprawione 🙂

  30. hmmon 15 sie 2007 at 17:12

    Daty można wrzucić do robots.txt właśnie. Tak samo będę chyba musiał zrobić ze standardowymi kategoriami.

  31. hmmon 15 sie 2007 at 17:15

    A is_archive do czego w takim razie się odnosi?

  32. wallaceon 15 sie 2007 at 18:28

    Oj, nie zauważyłem komentarza groadina.
    Z tym, że dałbym (isset($paged) && $paged>1) zamiast samego $paged > 1 (na wszelki wypadek, gdyby zmienna $paged nie była inicjowana).

    is_archive – wyświetlanie postów wg kategorii, autora lub daty.

    Osobiście stosuje robots.txt:

    User-agent: *
    Disallow: /wp-admin
    Disallow: /feed
    Disallow: /comments/feed
    Disallow: /tag/
    Disallow: /category/
    Disallow: /2006/
    Disallow: /2007/
    Disallow: /page/

  33. adminon 15 sie 2007 at 19:20

    Dzięki wallace za info. Sam kiedyś będę musiał z tym wszystkim zrobić porządek, problem jest tylko z czasem…
    Hmm rzeczywiście robots.txt może być najprostszym rozwiązaniem (zwłaszcza z zastosowaniem Narzędzi dla Webmasterów)

  34. hmmon 15 sie 2007 at 20:38

    wallace:
    Disallow: /comments/feed
    „>

    Chyba /*/feed ?

  35. wallaceon 16 sie 2007 at 17:28

    hmm: no hmm, a coś obsługuje „gwiazdki” w ścieżkach (może google to ostatnio wprowadziło, ale nie jestem pewien) ?

  36. hmmon 16 sie 2007 at 19:45

    No hmm w zasadzie nie wiem ale zobacz ile tu http://www.ittechnology.us/robots.txt ich jest 😉

  37. wallaceon 16 sie 2007 at 20:57

    No ale to właśnie tylko dla Googla (wiedziałem) 😉

  38. hmmon 16 sie 2007 at 21:30

    Tylko dla Googla? Chyba aż 🙂

    A tak poza tym to chyba

    Disallow: /2007/
    Disallow: /page/

    powinno wyglądać tak

    Disallow: /2007
    Disallow: /page

    bo

    http://www.spiders.pl/robots_txt-syntax.php

    Zamiast pisać: 'Disallow: /tmp/*' napisz: 'Disallow: /tmp'.

  39. wallaceon 16 sie 2007 at 22:13

    Nie zgodzę się. Mimo, że to nie są rzeczywiste katalogi, tak powinny być traktowane i przedstawiane – z prawym ukośnikiem na końcu. Teoretycznie WP powinien przekierować taki adres bez slasha na adres ze slashem (tak jak to robi każdy demon WWW przy rzeczywistych katalogach).
    Więc nie zgodzę się ze względu na spójność.
    Aczkolwiek za Twoją formą przemawia właśnie fakt, że WP pozwala na obie formy, nie przekierowuje i wyświetla tą samą treść (duplicate content?).
    Z drugiej strony WP generuje linki ze slashem na końcu, więc jeżeli ręcznie nie podamy Google adres bez slasha, nie ma takiego problemu.
    Podsumowjąc, sprawa dyskusyjna 😉
    Ja zostaje przy swoich slashach, działają sprawnie 😉
    ps. przytoczony tekst odnosi się do korzystania z gwiazdki, a nie czy na końcu ma być slash czy nie 😉 Treść tekstu widać powstała nim G nauczyło się obsługiować gwiazdki 😉
    ps2. może i AŻ, ale mimo wszystko chciałbym, aby wszystkie roboty rozumiały co ja do nich mówie w robots.txt (tworząc strone też chcesz, aby uzytkownik każdej przegladarki ją zobaczył tak jak Ty chcesz ;p). powstaje pytanie, co zrobią inne roboty z gwiazdką? a może już wprowadziły podobne usprwanienia? czy może traktują ją po prostu jako część istniejącej ścieżki?

  40. hmmon 16 sie 2007 at 22:26

    „ps. przytoczony tekst odnosi się do korzystania z gwiazdki, a nie czy na końcu ma być slash czy nie”

    Tak tylko ja miałem na myśli brak slasha jako „otwartość” czyli dowolność po /page bo jak to zamkniemy /page/ to wydaje się już nie być „otwartość” a „zamkniętość”.

  41. hmmon 16 sie 2007 at 22:27

    Czyli nie uwzględnianie np. /page/2/

  42. wallaceon 16 sie 2007 at 22:39

    Nie nie, /page/2/ zawarte jest zarówno w /page jak i /page/
    Jedyne czego nie zawiera /page/ to /page

  43. hmmon 16 sie 2007 at 22:53

    Ok.

    Właśnie zauważyłem że na wielu blogach opartch na wordpressie adresy strony statycznych zakończone są slashem a gdy wpiszę adres bez slasha to jest przekierowanie. U mnie coś takiego nie występuje i widzę że u Ciebie wallace też.

  44. adminon 18 sie 2007 at 00:37

    Ożywiona dyskusja 🙂 Faktycznie moje wpisy w robots i template powstały jakiś czas temu i nie do końca nieraz były spójne. Czesto pisanie samego bloga zabierało mi tyle czasu, że już niewiele czasu mogłem poświęcić na sprawy techniczne i optymalizacyjne 🙁

  45. tomekon 18 lis 2007 at 10:46

    wszystko pieknie ale czy nikt nie czuje potrzeby np. okresowego czesania wszystkich wpisow pod katem duplicate content ?

    Mowie o automacie ktory moznaby zapuszczac okresowo, przeciez majac 20 blogow recznie nikt tego nie zrobi a ryzyko tego ze po jakims czasie zaczna sie pojawiac identyczne wpisy w sieci jest bardzo duze. Wszyscy pisza o tym jak dostosowac wp do tego aby strona z www i bez www nie byla traktowana jak duplicate content a nie znalazlem ani jednego postu (szukam od dwoch tygodni) na temat jakiegos narzedzenia sprawdzajacego unikalnosc wpisow.

  46. adminon 18 lis 2007 at 11:45

    1. Ten tutorial był sporządzony dla bloggerów, aby pomóc im chronić swoją treść, a nie dla tworzenia spamerskiego „zaplecza”, które najczęściej jest tworzone w ten sposób, że się „podbiera” bez zgody autorów treść z wielu blogów i się próbuje ją miksować
    2. Unikalność treści można sprawdzać na http://www.copyscape.com

  47. Henryon 18 lis 2007 at 15:32

    Zgadzam sie w pełni .
    To w jakim stopniu jest zaśmiecony internet zależy od nas samych
    Serdecznie pozdrawiam Henry

  48. Grejfon 19 lis 2008 at 15:46

    Dla najprostszego rozwiązania duplicate contet w WP, to wtyczka All in One SEO Plugin Options:

    http://semperfiwebdesign.com/portfolio/wordpress/wordpress-plugins/all-in-one-seo-pack/

    pozdrawiam 🙂

  49. matruson 09 gru 2010 at 22:07

    Witam,
    a ja mogę polecić wtyczkę All in One Seo.
    Po zainstalowaniu nie trzeba się martwić duplicate content:
    – w tagach
    – kategoriach
    – archiwach
    itp.
    Sprawdźcie.
    Pozdrawiam

  50. […] http://www.ittechnology.us/usuwanie-duplicate-content-w-wordpress […]

  51. Emilon 05 kw. 2013 at 23:26

    Ja zastosowałem następująco:
    1. tagi – opisałem je w meta czyli mają swoje opisy a wyświetlane posty pod nimi to skróty
    2. Wyłączyłem z indeksacji archiwa dat
    3. Nie indeksuję niewykorzystywanych typów i formatów treści
    4. Adres główny z przekierowaniem na www
    Ale nie wiem jak wykluczyć page-1,2,3 bo nie chce mi zaakceptować kodu jaki podałeś.
    Pozdrawiam