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 icon smile Usuwanie Duplicate Content w Wordpress .

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 Odpowiedzi to “Usuwanie Duplicate Content w WordPress”

  1. groadinon 24 stycznia 2007 at 6:38 po południu

    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 stycznia 2007 at 6:41 po południu

    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 stycznia 2007 at 9:13 po południu

    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 stycznia 2007 at 9:20 po południu

    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 stycznia 2007 at 10:23 po południu

    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 stycznia 2007 at 10:40 po południu

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

  7. wallaceon 26 stycznia 2007 at 1:03 przed południem

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

  8. adminon 26 stycznia 2007 at 7:30 przed południem

    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 marca 2007 at 8:37 po południu

    [...] 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 kwietnia 2007 at 9:08 po południu

    … 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 kwietnia 2007 at 9:22 po południu

    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 kwietnia 2007 at 6:38 przed południem

    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 kwietnia 2007 at 8:41 przed południem

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

  14. adminon 03 kwietnia 2007 at 10:31 przed południem

    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 4:45 po południu

    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 5:13 po południu

    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 sierpnia 2007 at 6:22 po południu

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

  18. adminon 10 sierpnia 2007 at 6:26 po południu

    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 sierpnia 2007 at 9:30 po południu

    Znaczniki czyli to o czym piszesz w notce?

  20. adminon 13 sierpnia 2007 at 10:38 po południu

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

    [/code]

  21. hmmon 13 sierpnia 2007 at 10:56 po południu

    Dlaczego są lepszym wyjściem? U Ciebie ich nie widzę :-)

  22. adminon 14 sierpnia 2007 at 9:26 przed południem

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

    Tam są znaczniki :)

  23. hmmon 14 sierpnia 2007 at 5:20 po południu

    Mógłbyś opisać jak je tam powstawiałeś :-)

  24. adminon 15 sierpnia 2007 at 1:42 po południu

    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 sierpnia 2007 at 2:29 po południu

    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 sierpnia 2007 at 2:30 po południu

    oj, wcieło kod ;)

  27. hmmon 15 sierpnia 2007 at 3:27 po południu

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

  28. hmmon 15 sierpnia 2007 at 3:37 po południu

    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 sierpnia 2007 at 3:52 po południu

    @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 sierpnia 2007 at 5:12 po południu

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

  31. hmmon 15 sierpnia 2007 at 5:15 po południu

    A is_archive do czego w takim razie się odnosi?

  32. wallaceon 15 sierpnia 2007 at 6:28 po południu

    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 sierpnia 2007 at 7:20 po południu

    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 sierpnia 2007 at 8:38 po południu

    wallace:
    Disallow: /comments/feed
    “>

    Chyba /*/feed ?

  35. wallaceon 16 sierpnia 2007 at 5:28 po południu

    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 sierpnia 2007 at 7:45 po południu

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

  37. wallaceon 16 sierpnia 2007 at 8:57 po południu

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

  38. hmmon 16 sierpnia 2007 at 9:30 po południu

    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 sierpnia 2007 at 10:13 po południu

    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 sierpnia 2007 at 10:26 po południu

    “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 sierpnia 2007 at 10:27 po południu

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

  42. wallaceon 16 sierpnia 2007 at 10:39 po południu

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

  43. hmmon 16 sierpnia 2007 at 10:53 po południu

    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 sierpnia 2007 at 12:37 przed południem

    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 listopada 2007 at 10:46 przed południem

    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 listopada 2007 at 11:45 przed południem

    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 listopada 2007 at 3:32 po południu

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

  48. Grejfon 19 listopada 2008 at 3:46 po południu

    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 grudnia 2010 at 10:07 po południu

    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. Problem duplicate content | Być Widocznym Online!on 30 października 2012 at 2:09 po południu

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

  51. Emilon 05 kwietnia 2013 at 11:26 po południu

    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

Trackback URI | Comments RSS

Odpowiedz komentarzem