Vnitřní logika WordPressu je propracovaná a pokud ji neznáte, budete věční lepiči kódu. Cokoliv upravíte, se vám při aktualizaci přepíše, takže radši přestanete aktualizovat, čímž odsoudíte systém k zániku. Naučte se tedy principy, jak to ve WordPressu funguje, provádějte změny na konkrétním místě a s ohledem na udržitelnost.
Kód se neupravuje. Nikdy
Jsem velký fanoušek open-source softwaru už od roku cca 2002. Zapojil jsem se do mnoha aktivit a odvedl docela dost práce, třeba při organizování různých konferencí, školení nebo při psaní článků a knih. Takže mě nepodezřívejte ze zrady, když vám tvrdím:
Zdrojový kód WordPressu, pluginů nebo šablon se neupravuje. Nikdy.
Má to jediný důvod – není to udržitelné. Když změníte soubory „jádra“ WordPressu, tedy něco v adresářích wp-includes, případně wp-admin, nebo přímo v koupené šabloně, abyste změnili chování, děláte to špatně.
Ano, je to open source a ten si přece můžete upravit podle sebe. Souhlasím. Ale WordPress má dynamický styl vývoje, v průměru každé dva měsíce se objevuje nové verze, takže riziko, že budou vaše změny přepsány, se blíží jistotě.
Raději se zajímejte o to, jak to autoři vymysleli, když není vhodné upravovat kód, ale mnoho provozovatelů – včetně vás – požaduje, aby se jejich instalace WordPressu v tom nebo onom chovala jinak než to dělá instalace standardní, čistá.
Jak to tedy udělat?
Hooky
Ke změnám chování se používají hooky, česky asi nejlépe háky, háčky. V kódu WordPressu jsou na mnoha místech (je jich několik tisíc) místa, do kterých můžete umístit pomocí hooku svůj kód. Funguje to zhruba následovně, uvádím nejjednodušší příklady.
Akce, action
Představte si, že v nějaké šabloně je pod článkem zobrazen odkaz „Upravit“, po jehož kliknutí se dostanete na editaci článku. A před ním je ikona tužky. Kód vypadá třeba nějak takto:
... // Zobrazení ikony a textu <?php do_action('template_display_edit_icon'); ?> <a href="<?php the_permalink(); ?>"><?php _e('Edit', 'template');?></a> ...
Jak vidíte, ikona se nezobrazuje přímo, dokonce se ani nevolá funkce, která zobrazuje ikonu. Provádí se zde akce, které jsou navázány na hook jménem template_display_edit_icon.
Tyto akce se k hook přiřazují (zavěšují) takto:
// Navázání akce na hook, první je název hooku, pak funkce add_action('template_display_edit_icon', 'system_template_display_edit_icon');
// Zobrazení konkrétní ikony function system_template_display_edit_icon() { ?> <img src="pen.png' alt='Pen' width="32" height="32"> <?php }
Pokud se rozhodnete, že chcete ikonu změnit, pak si ve svém pluginu nebo souboru functions.php vytvoříte vlastní funkci display_another_icon, která zobrazí ikonu (nebo vlastně cokoliv jiného). A zavěsíte ji na hook:
add_action('template_display_edit_icon', 'display_another_icon');
V původním kód se budou akce vykonávat pořád stejně, tam se nic nemění. Ale fronta akcí hooku template_display_edit_icon bude delší o jednu akci, tu vaši. Jak asi tušíte, provedou se všechny. Výsledkem tedy budou dvě ikony – ta původní i ta vaše. Zbývá tedy tu původní akci odstranit.
remove_action('template_display_edit_icon', 'system_template_display_edit_icon');
Nyní proběhne jen vaše akce display_another_icon navěšená na hook. Zobrazí se jen vaše ikona.
Filtr
Existuje ještě druhý typ háku, kromě akce – je to filtr. Zatímco výsledkem akce smí být výstup na obrazovku, výsledek filtru se nesmí zobrazit, musí se předat jako výsledek funkce k dalšímu zpracování. Upravme si náš příklad následovně.
... // Zobrazení ikony a textu <img src="<?php apply_filters('template_edit_icon_filename', 'get_edit_icon_filename); ?>' alt='Icon' width="32" height="32"> <a href="<?php the_permalink(); ?>"><?php _e('Edit', 'template');?></a> ...
Nyní automaticky generujeme ikonu o daných rozměrech, takže uživatel má na výběr pouze jednu možnost – smí změnit jméno souboru s obrázkem ikony, vše ostatní je pevně dáno. Jméno se získá tím, že se provádějí činnosti zavěšené na hook template_edit_icon_filename. Pokud by tam nebyl žádné uživatelsky definované (což lze očekávat a bude to běžné), pak se provede výchozí akce definovaná někde v systému či šabloně (pořád se pohybujeme v rámci vymyšleného příkladu):
function get_edit_icon_filename() { return 'pen.png'; }
Ale pokud chceme zavěsit vlastní hook, tedy funkci, která vrací jiné jméno souboru pro ikonu, pak to uděláme takto:
add_filter('template_edit_icon_filename', 'get_mytemplate_edit_icon_filename'); function get_mytemplate_edit_icon_filename() { return 'new-pen-icon.png'; }
Zde není potřeba odstraňovat předchozí akci navázanou na hook, protože data se předávají zřetězeně a hodnota tedy prochází každou akcí, která ji může měnit – proto jde o filtr. V tomto jednoduchém případě se mezi jednotlivými rutinami nepředávají žádná data.
Další parametry hooku
U hooků lze používat parametry a priority. Pak se v add_action nebo add_filter určuje počet předávaných argumentů a číslo od 0 do 100, které určuje prioritu (vyšší číslo označuje pozici směrem ke konci fronty aktivit, tedy vyšší se vykonává později). Např. tento zápis znamená, že obslužná funkce přebírá dva parametry a vykonává se naposledy:
add_action ('some_hook', 'some_function', 2, 99); function some_function($arg1, $arg2) { }
Možné nejasnosti
Často je problém najít odpovídající hook. Stává se, že akci navěsíte na špatný hook. Zlozvykem je taky zavěšování mnoha akcí na základní hook init. Podobně je to s názvy systémově zavěšených funkcí a jejich priorit, musíte hledat v kódu, abyste je mohli korektně odstranit. Neexistuje aktuální a kompletní seznam hooků, nejlepším zdrojem je samotný kód. Hooky stále přibývají a je zcela běžné, že jsou vnořené – například WooCommerce je na tomto principu postaven, vše je kaskáda hooků. Je to sice velmi efektivní, ale prvotní ponoření do kódu a orientace v celé soustavě je náročná.
Hooky se používají k úpravě chování. Jsou korektní a udržitelnou cestou, jak měnit chování WordPressu (včetně administrační části) a zajistit udržitelnost a srozumitelnost cest.
1 komentář u „Jak funguje WordPress uvnitř: hooky“