WordPress 301 Moved Permanently Redirection – Błąd HTTP 404 spowodowany zmianą ścieżek do kategorii, a Google SEO

Bardzo łatwo spaść w wynikach wyszukiwania (szczególnie Google), gdy robot sieciowy wykryje jakieś problemy na naszej stronie. Jednym z najczęstszych problemów tego typu są błędy HTTP 404, spowodowane tym, iż zmieniliśmy ścieżki do naszych kategorii w Wordpresie. Żeby to zobrazować – najpierw nasze kategorie były dostępne pod adresami formatu

http://programowanie.opole.pl/category/php

ale zmieniliśmy zdanie i zmieniliśmy je na format typu

http://programowanie.opole.pl/archives/category/php

Jeżeli postąpimy w ten sposób, to zrobimy bardzo lekkomyślną rzecz. Google jeszcze przez bardzo długi czas będzie zgłaszał na stronach Webmasters Tools błędy indeksowania o poniższej treści, które w krótkim czasie doprowadzą do spadku w rankingach.

URL: http://programowanie.opole.pl/category/php
Szczegóły: 404 (Nie znaleziono)
Link: Liczba stron: 9
Wykryto: 18 gru 2011

Aby nie wpaść w tę spiralę błędów, mamy dwa rozwiązania. Po pierwsze możemy stare linki przekierować na nowe za pomocą kodu statusu HTTP 301 Moved Permanently. Drugim rozwiązaniem jest sytuacja, gdzie oba linki będą działać poprawnie.

W przypadku drugiego rozwiązania musimy uważać, aby Google nie wykazał nam błędów podwojonej zawartości. Aby się przed tym uchronić musimy zastosować na stronach które są dostępne pod tymi linkami takie same linki kanoniczne. Linki kanoniczne do dyrektywy umieszczone w sekcji HEAD naszej strony o postaci

<link rel=”canonical” href=”http://programowanie.opole.pl/archives/category/php” />

które mówią robotom wyszukiwawczym, że strona dostępna pod starym linkiem oraz pod nowym linkiem to tak na prawdę ta sama strona, której prawdziwy adres jest właśnie taki jak w linku kanonicznym.

Jeżeli chodzi o pierwsze rozwiązanie to je opiszę poniżej. Od razu nadmienie, że dostępnych jest wiele Pluginów do WordPressa, które robią to automacznie, ale najczęściej nie robią tego o co nam chodzi, albo w ogóle nie działają. Metoda, którą podam nie jest ‘najczystszym’ rozwiązaniem, gdyż wymaga zmiany w pliku źródła WordPressa, ale jest bardzo prosta i skuteczna zrazem. A więc chodzi nam o to, aby linki postaci

http://programowanie.opole.pl/category/php

dawały status HTTP 301 Moved Permanently wskazujący na analogiczne linki postaci

http://programowanie.opole.pl/archives/category/php

Analizując sytuację widzimy, że cały zabieg sprowadza się do tego, aby rozpoznać te zapytania, w których po adresie domeny, a przed nazwą kategorii znajduje się tylko i wyłącznie fraza category, a dalej zastąpić ją frazą archives/category.

Edytujemy więc plik wp-includes/class-wp.php. W okolicach wiersza o numerze 184 będzie znajdowała się linia taka jak poniżej.

$this->request = $request;

I właśnie pod tą linią umieścimy poniższy kod.

//-----------------------------------------
// Hard 301 Redirection
//-----------------------------------------
$protech_matched = preg_match( '/(archives\/)*(category\/)([a-zA-Z0-9-]*)/', $request, $protech_matches );
if( $protech_matched AND $protech_matches[1] == '' ) {
	Header( "HTTP/1.1 301 Moved Permanently" );
	Header( "Location: http://programowanie.opole.pl/archives/category/$protech_matches[3]" );
	exit;
}
//-----------------------------------------

Najpierw za pomocą wyrażeń regularnych sprawdzamy zawartość zmiennej $request, w której w tym miejscu WordPress trzyma część adresu URL zapytania, która jest umieszczona po adresie domeny. Sprawdzamy, czy to co się w niej znajduje pasuje do schematu:

- opcjonalny człon: archives/
- wymagany człon: category/
- opcjonalny człon alfanumeryczny dowolnej długości.

Do tego schematu pasują zarówno żadania postaci category/php oraz archives/category/php. Rozpoznanie, który to z tych wariantów następuje w następnej linii, która sprawdza, czy ten pierwszy opcjonalny człon (który albo jest pusty, albo zawiera frazę archives/) jest pusty. Jeżeli jest pusty to wysyłamy nagłówek z przekierowaniem i kończymy skrypt.