wordpress-404-errorPro ty, kteří řeší výskyt chyb 404 ve wordpresu a jejich možná řešení. Článek vznikl jako reakce na Zase ty chyby 404 na webu 404m.com. V článku je totiž mimo kromě pěkného rozboru příčin chyb, většinou nastíněné řešení "opravit ručně". Rád bych všem usnadnil práci a ukázal lepší řešení.

Protože článek není jen pro čtenáře 404m, uvedu stručně o jakou chybu se jedná, kdo chcete vědět víc přečtěte si původní Dragův článek.

 

Chyby způsobené komentujícími

Wordpress umožňuje snadné přidávání komentářů. Pokud přidáte možnost, aby komentující zanechali také odkaz na svůj web, může kvůli překlepům Google vyhodnotit špatný odkaz jako vnitřní url na váš web. Konkrétně jak se uvádí v článku na webu 404m.com pokud se nepovede odkaz pak

http:://www.domena.tld/ googlebot interpretuje jako http://404m.com/adresare/prispevek/http:://www.domena.tld/
podobně
http:domena.tld googlebot interpretuje jako http://404m.com/adresare/prispevek/www.domena.tld/

Řešení na vstupu

Ideální by bylo řešení už na úrovni vstupu. Wordpress zřejmě odeslanou URL neposílá na nějaký kontrolní parser, nebo není dostatečně dobrý. Protože ale zásah přímo do kódu Wordpress není ideální, kvůli aktualizacím, které by naši změnu časem přepsali, řešení na úrovni vstupu bych viděl formou pluginu, který by nahradil parsovací funkci Wordpressu, případně funkci pro uložení komentáře, kde by se přidal opravný krok navíc. Vytvoření takového pluginu by nemělo být nic náročného.

Řešení na úrovni databáze

Na úrovni databáze je řešení ještě o něco lehčí. Nejprve je třeba zjistit, jak moc špatných URL a v jakých tvarech na webu máme. K tomu stačí v phpAdminu spustit nad databází Wordpressu tento kód:

SELECT `comment_author_url`
FROM `wp_comments` 
WHERE ( 
  (LEFT(`comment_author_url`,7) <> 'http://') 
  OR (SUBSTRING(`comment_author_url`,8,1) RLIKE '[^[:alnum:]]') 
) AND (`comment_author_url` <> '')

Takto napsaný SQL zkontroluje zda někde v tabulce není textový vzor který zleva neodpovídá "http://" tedy například překlep, přidaná dvojtečka apod. Pozor bude to vyhazovat i https://, které zde netestuji. Druhá část se substringem testuje zda za druhým lomítkem je alfanumerický znak. Pokud není jde opět o chybu. Takto vyjedeme seznam chybných řádků a víme jaké chyby musíme napravovat.

Opravný kód pro chyby zmíněné výše. Tedy překlepy "http:://" a "http:///" je pak pomocí dvou SQL dotazů. Šlo by to sice jedním, ale pro vyšší pravděpodobnost chyby zůstaňme u jednoduchého řešení.

UPDATE `wp_comments` 
SET `comment_author_url` = REPLACE(`comment_author_url`, 'http:://','http://') 
WHERE (LEFT(`comment_author_url`,8) = 'http:://')

a

UPDATE `wp_comments` 
SET `comment_author_url` = REPLACE(`comment_author_url`, 'http:://','http://') 
WHERE (LEFT(`comment_author_url`,8) = 'http:://')

V kódu počítám s tím, že v DB Wordpressu je použit standardní "wp_" prefix pro tabulky. Pokud chceme opravy trochu víc automatizovat je ideální udělat si script, který bude daná SQL pravidelně pouštět pomocí CRONu. Na závěr může být spuštěn třeba testovací SQL script co jsme použili výše a pokud vrátí víc než 0 řádků, tak by měl administrátorovi poslat email "Máme v DB odkazy co ještě neumím automaticky opravit, potřebuji lidskou asistenci".

Vlastní přehlédnutí chyby

Stejný druh chyby jako v předchozím popisu, jenom zapříčiněná autorem a její výskyt tak není v komentáři, ale v textu. Nalezení takových chyb opět podoběn pomocí SQL dotazu, jen místo tabulky wp_comments projdeme tabulku wp_posts. Zde jen drobná připomínka, pokud bude chyba v jednom článku, na úrovni tabulky bude na více řádcích. Protože Wordpress ukládá do tabulky různé verze článku jako jeho historii. Ideální je opravit to pak všude.

SELECT `post_content`
FROM `wp_posts`
WHERE
  `post_content` LIKE '%http:///%'
  OR `post_content` LIKE '%http:://%'

Bohužel takto najdeme jen známé tvary překlepů. Navíc v textu občas může být takový text schválně, jako třeba v tomto článku. Opravu je tedy velice vhodné dělat opravdu ručně. Nicméně je pravděpodobné, že takových chyb nebude mnoho. Také pozor na to, že 'post_content' mohou před vypsáním v článku změnit různé pluginy. Například Smart Youtube PRO používá změněnou URL ve tvaru httpv://, které pak následně při generování stránky zamění za youtube kód s videem.

Spamboti

Tady hodně záleží na zdroji, na tom zda vkládají funkční nebo nefunkční odkazy, ale řešením bude spíš nějaká systémová změna nebo ochrana před spamboty, než následné řešení problémů. Jak píše Drago ve svém článku, tady opravdu pomůže pouze mazání, zabránění spambotům v přidávání odkazů a nebo přepis na něco jiného.

Problém se smazaným postem

Pokud už z nějakého důvodu smažete obsah, je celkem škoda nechat stránku se 404 chybou. Na článek mohly vést odkazy, zbytečně si zvyšujete bounce rate místo abyste zkusili potencionálního čtenáře zaujmout něčím jiným. Ideálním nástrojem pro to je plugin Redirection, který umožňuje přesměrovat neexistující stránka na konkrétní obsah, jestli to bude nová URL, úvodní stránka, nebo nějaká stránka s přehledem podobných článků to už je na vaší fantazii. Velkou výhodou tohoto pluginu je, že umí sledovat všechny 404 chyby, tedy nejen výše zmíněné a umožnit snadné přesměrování jinam pomocí 301 redirectu. Tedy s předáním váhy odkazů z původního smazaného postu.

 

Komentáře   

drago
+1 #1 drago 2013-01-23 12:34
To řešení na úrovni databáze je dobrý nápad, jak najít chyby. Určitě lepší než čekat na GWT.
Radek
+2 #2 Radek 2013-01-24 14:06
Díky za návod. Pomohlo to :-)
Stanislav Duben
+1 #3 Stanislav Duben 2013-01-24 14:18
Radku dík za komentář, jsem rád že jsem to nepsal jen tak.

Přidat komentář


Bezpečnostní kód
Obnovit