Neočekávaný výstup (unexpected output) při aktivaci pluginu

Po vydání WordPressu 3.0 se mnoha uživatelům objevila během aktivace některých pluginů chybová hláška o vygenerovaném neočekávaném výstupu (unexpected output). I přesto, že plugin v mnoha případech nakonec v pořádku fungoval, tak to rozhodně nebyl ideální první dojem na uživatele, kteří si plugin nainstalovali a chtěli ho vyzkoušet (nehledě na možné zástupné problémy). Kde se tato hláška vzala, co přesně znamená a jak mohou autoři pluginů zjistit, v čem vlastně vězí chyba?

Tento článek není určen pro „běžné“ uživatele WordPressu, ale jde spíše o shrnutí pro programátory pluginů a hlavně abych nezapomněl nalezené řešení :-) Nejdříve si upřesníme konkrétní texty objevujících se chyb (za X si můžete dosadit libovolné číslo), následuje česká a anglická verze:

Plugin vygeneroval během aktivace X znak(ů) neočekávaného výstupu. Pokud se objevila i nějaká chyba obsahující text „Headers already sent“ či jiné problémy (např. se zobrazením RSS zdroje), zkuste tento plugin deaktivovat nebo smazat.

The plugin generated X characters of unexpected output during activation. If you notice „headers already sent“ messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.

Samotná aktivace pluginu sice nakonec proběhne i přes tuto chybu, ale pokud je během ní vygenerován nějaký neočekávaný výstup (unexpected output), může jít buď o nějakou drobnou chybku (např. mezera na začátku souboru před/za označením, že jde o PHP skript) nebo došlo během aktivace k nějaké závažnější chybě, kvůli které nemusely správně proběhnout všechny funkce spouštěné při aktivaci pluginu (většinou je pak uveden větší počet znaků, který obsahuje celou chybu i s příslušným HTML). Celý problém souvisí s novou verzí WordPressu 3.0 (chyba už patrně v pluginu byla dříve, ale dosud nebyla objevena), kde nově přibyla další kontrola správné funkčnosti pluginů. Původně byla během vývoje tato kontrola navržena ještě přísněji, kdy při výskytu této chyby nebyl plugin vůbec aktivován, ale vzhledem k tomu, že se problém vyskytoval u mnoha pluginů a obvykle nešlo o příliš závažné chyby, bylo nakonec povoleno plugin aktivovat i přes neočekávaný výstup a na existující problém byli uživatelé pouze upozorněni právě zmiňovanou chybovou hláškou. Každopádně i přesto, že způsobené chyby nejsou závažné, může docházet např. k problémům se zobrazováním RSS zdroje a je vhodné se podobných (neopravených) pluginů raději vyvarovat.

A řešení? Bohužel nestačí v tomto případě zapnout WP_DEBUG, ale můžeme vcelku jednoduše tento neočekávaný výstup (chybu) zachytit (a uložit do nějakého souboru), čímž zjistíte o co konkrétně jde a pak už to můžete opravit. Zatím jsem nenašel (patrně ani neexistuje) žádné řešení, které by šlo použít bez modifikování souboru jádra WordPressu, ale programátorům to snad na chvíli nevadí. Takže nejdříve otevřete soubor wp-admin/plugins.php (cca kolem 65. řádku), kde najdete následující funkci:

strlen($result->get_error_data())

Pomocí funkce strlen je získáván konkrétní počet znaků do chybové hlášky o neočekávaném výstupu, takže nám už stačí jen získat obsah (samotný text chyby). Použijeme proto jednoduchou funkci (inspirace), kterou si uložíme do samostatného PHP souboru (např. neocekavany_vystup.php) i vlastního adresáře, kam se nám pak bude ukládat soubor s vygenerovaným výstupem (např. wp-content/plugins/neocekavany-vystup) a použijeme ji jako plugin, který aktivujeme přímo z administrace (doplňte si ještě nějakou hlavičku pluginu).

if ( !defined( 'NEOCEKAVANY_VYSTUP_DIR' ) ) { define( 'NEOCEKAVANY_VYSTUP_DIR', WP_PLUGIN_DIR . '/' . dirname(plugin_basename(__FILE__)) ); }

function zachytit_vystup($vystup) {
 $filename = NEOCEKAVANY_VYSTUP_DIR . '/neocekavany_vystup.log';
 if ( is_file($filename) ) { chmod ($filename, 0777); }
 $handle = fopen( $filename, "a" );
 fputs( $handle, var_export($vystup, TRUE) . "\n" );
 $status = fclose($handle);
 if ( is_file($filename) ) { chmod ($filename, 0644); }
}

Nyní už tedy máme aktivní plugin s funkcí pro zápis libovolné proměnné do našeho vlastního logovacího souboru a stačí upravit soubor wp-admin/plugins.php, kam přidáme (opět někam kolem 65. řádku) následující kód:

if ( function_exists( "zachytit_vystup" ) ) { zachytit_vystup($result->get_error_data()); }

Hotovo. Příště až aktivujete nějaký plugin a ohlásí se problém s neočekávaným výstupem, budete mít obsah chybové hlášky automaticky uložen (např. v souboru wp-content/plugins/neocekavany-vystup/neocekavany_vystup.log) a můžete tak jednoduše zjistit, o co se konkrétně jedná. Pokud je to váš plugin, tak můžete problém samozřejmě následně opravit, pokud jste pouze uživatelé problémového pluginu, tak můžete zkusit upozornit autora.

Do budoucna by se určitě hodilo nějaké pokročilé zobrazování chyb bez nutnosti zásahů do zdrojových souborů jádra WordPressu a snad se v některé z dalších verzí dočkáme nějakého zlepšení (třída WP_Error). Setkali jste se někdo s problémem neočekávaného výstupu a podařilo se vám ho vyřešit? Poznámky a komentáře vítány…

6 komentářů u „Neočekávaný výstup (unexpected output) při aktivaci pluginu“

  1. Aktivoval jsem několik plug-inů do verze WP 3.0.1. a vše bylo vždy bez problémů. Až dnes se to stalo …
    Nahrál jsem si plug-in All in One SEO Pack a při aktivaci mi to hodilo tuhletu nepěknou hlášku. Takže jsem plug-in deaktivoval a smazal. Co zbývá? Počkat na novou verzi WP, kde tato chyba bude odstraněna, nebo najít jiný plug-in s podobnou funkcí?

  2. Denda: WordPress je v pořádku, je to chyba pluginu All in One SEO Pack(testováno a projevilo se to také – můžeš to s pomocí našeho návodu vyzkoušet). Každopádně problém jsem sice popsal přímo autorovi pluginu do fóra, ale není to vůbec nic závažného (jen taková chybka, která se projevuje pouze při aktivaci) a plugin můžeš bez problémů (a obav) používat…

  3. Tak jsem znova nahrál a aktivoval All in SEO Pack a aktivace proběhla bez výše uvedené hlášky.

  4. Denda: Ano, chyba se projevuje pouze při první aktivaci pluginu, poté už se tam nainstalují příslušná data a při další chybě se tedy hláška neobjeví…

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>