WordPress – Cannot modify header information – headers already sent by

  Chyby a problémy

Pokud se na vašem WordPressu začala objevovat chyba Cannot modify header information – headers already sent by …, tak máte vcelku velký problém, protože by váš WordPress neměl fungovat 🙂

Tento druh chyb se dá opravit zhruba v 90% případů přímým zásahem do kódu. Ovšem je to často poměrně časově náročné, navíc je nutná dobrá znalost PHP a alespoň základy WordPress. Proto se také volí spíše varianta nahrání zálohy anebo přeinstalování problémové části.

Co je Cannot modify header information – headers already sent by

Jedná se o chybu, kterou vyhlásí PHP, většinou v důsledku jiné chyby, která vypsala varování, ještě než byla dokončená práce s hlavičkami (headers). Což je pro laika trochu složité, takže si to probereme postupně.

Při komunikaci mezi prohlížečem a serverem se nejdříve musí zpracovat hlavička (header). Ta má například zdělit jakým protokolem se bude komunikovat, že se má začít pracovat s koláčky (cookies), jaký soubor vlastně posíláte (jestli se jedná o HTML stránku anebo třeba obrázek. PHP totiž umí generovat například grafy).

Vtip je v tom, že hlavička se musí vyřešit před jakýmkoliv textem a generuje se pouze jedenkrát. Pokud skript tedy před jakoukoliv funkcí která s ní pracuje něco vypíše, tak dojde právě k této chybě. Nejčastěji se to stává, když se v skriptu nachází jiná chyba, třeba při generování hlavičky, ta se vypíše, pak dojde k úpravě hlavičky a máme tu Cannot modify header information – headers already sent by.

To bude také převážná část problémů, s kterými se v případě této chyby setkáte.

Jak se opravuje

Ve většině případů stačí opravit předchozí chybu. Tedy pokud vidíte chybu, či varování a následuje Cannot modify header information – headers already sent by, je třeba opravit tu první. V ní také uvidíte umístění problému skriptu. Může se například jednat o chybu způsobenou špatně provedenou aktualizací, problém se zápisem do souboru, chybějících skriptů atd. Možností je nepřeberné množství a vy se musíte rozhodnout jestli to vyřešíte opravu skriptu, zrušením výpisu varování (pokud se nejedná o chybu ale jen varování, lze to takto řešit v některých případech) anebo nahráním zálohy či přeinstalací.

Oprava skriptu

No opravovat WordPress není dobrý nápad, pokud narazíte na problém tak je lepší vadnou část nahradit soubory z čisté instalace dané verze (opravdu si dávejte pozor na rozdíl verzí). U šablon a pluginů je situace jiná. Tam záleží na vašich schopnostech. Ideální situace je nějaká externí chyba. Například plugin nemůže zapisovat do adresáře, tak upravíte práva, tak aby mohl a zároveň nebyla ohrožena bezpečnost.

Jestli ale dojde na přímou úpravu skriptu, tak se nad tím zamyslete jestli za to opravdu stojí. Při nejbližší aktualizaci totiž budete muset všechno přepisovat znovu. Zkuste kontaktovat tvůrce šablony/pluginu pokud o něj tak stojíte.

Samozřejmě máme tu i jednoduché chyby, kdy se dá pár příkazy vše dát dohromady. Namátkou třeba plugin nefunguje, protože používáte IDN doménu a on tam má nějaký test. Stačí tento test obejít. Ovšem záleží na složitosti.

Chybička se objevila sama

Je to málo pravděpodobné, ale občas se může vloudit chybička tak nějak sama. Nahrajete novou šablonu a ona začne házet tuto chybu. Prohlížíte si detailně skript a nevidíte problém. Vše je v pořádku. Po chvilce přiznáte, že jste se v šabloně “hrabali” ale nic neměnili. Jen jste tam překládali nějaké texty či podobně. Jenomže přitom váš editor na začátek souboru vložil neviditelnou mezeru či jiný neviditelný znak. Pozor pokud se jedná třeba malou vkládanou funkci může být i na konci souboru.

Takovéto neviditelné znaky se dobře odhalují přes hexeditor. Viz. následující obrázek (použitý program PSPad).

Neviditelný znak by před odesláním headers způsobil chybu.

Na takovéto záludnosti je třeba dávat si opravdu pozor.

Schování problému

Existuje jeden postup, který nedoporučuje nikdo. PHP rozlišuje mezi chybou a varováním. V případě varování (warning) jede skript dále, jen se vypíše právě to varování. U chyby se skript zastaví. Takže pokud se před dokončením práce s hlavičkou vypíše varování, je možné pro daný skript kompletně varování vypnout. Stačí na začátek skriptu dát:

error_reporting(0);

Lez umístit třeba do wp-config.php.

Samozřejmě tato varianta se nedoporučuje, protože to varování tam není jen tak bez důvodu. Prakticky to může vést k čemukoliv. Od toho, že něco nebude občas fungovat až po bezpečnostní riziko. Takže toto použít jen pokud víte, co děláte.

Oprava ze zálohy, přeinstalování

Ve většině případů se postupuje nahráním ze zálohy anebo přeinstalací problémového pluginu či šablony. Časově to vyjde většinou nejlépe.

Napiš komentář