WordPress – tvorba šablony od A do Z – 17.díl – Hooky (actions)


Po dlouhé odmlce přicházím s dalším dílem. Moc se omlouvám, ale před Vánocemi se s prací jako vždy roztrhl pytel a nevím, kam dřív skočit. Dnes se ale urvu a sepíšu další díl, protože bych se k tomu jinak nedostal. Jelikož máme již 17. díl, v tvorbě WordPress šablon už nejsme žádní amatéři, šablonu si poskládáme raz dva a tak dnes posuneme hranice naší šablony zase o kousek dal.

WordPress action hooks

Pro ty schopné angličtináře to v překladu přijde trochu podivné, ale toho se nelekneme! WordPress jako takový nám nabízí sadu dvou „utilit“, jak ovlivnit výsledný kód (nebo data) bez toho, abychom byli nuceni měnit ostrý kód (může to být kód jádra WordPressu, pluginu nebo třeba Vaší šablony). Dnes se podíváme na jednu z nich a řekneme si něco o „action hookách“ – omluvte mou prezentaci, ale mně se to tak prostě líbí :-) .

Pojďme si nyní ukázat pár jednoduchých příkladů:

Dejme tomu, že budeme mít šablonu, kterou budeme chtít nechat aktualizovat, ale zároveň potřebujeme nechat prostor pro její editaci případným zájemcům a drobným vývojářům (ne nám, my už jsme sakra vývojáři ;-) ) To, co použijeme, je vytvoření vlastního „hooku“. Nyní si ukážeme do_action() v kombinaci s add_action();


<div id="content">

	<h1>Výsledky vyhledávání - <?php the_search_query(); ?> </h1>

	<?php do_action('kt_before_search_loop_action'); ?>

	<?php if (have_posts()) : ?>
		<?php while (have_posts()) : the_post(); ?>
			<?php get_template_part('loop', 'single'); ?>
		<?php endwhile; ?>
	<?php endif; ?>

	<?php do_action('kt_after_search_loop_action'); ?>

</div>

Zde je naprosto jednoduché použití do_action() funkce. Nyní může kdokoliv – mimo kód vaší šablony (třeba v pluginu nebo jiných souborech šablony) říct, co se stane právě před loopou nebo následně za ní. Může to vypadat třeba takto:


<?php

add_action('kt_before_search_loop_action', 'kt_print_banner');

function kt_print_banner(){
	echo '<img alt="" src="images/moje_reklama.png" />';

	// Zde může být další sada procedůr.

}

?>

Nyní si trochu vysvětlíme přidané kódy. Funkce do_action() řekne při inicializaci WordPressu, že na tomto místě se mají volat ty funkce, které zavedeme se stejným slugem ve funkci add_action(). Česky řečeno: Najdi v kódu všechny funkce add_action(), které mají jako první parametr slug akce (v našem případě ‚kt_before_search_loop_action‘), poté podle slugu najdi v kódech funkce, které se jmenují stejně jako druhý parametr add_action (u nás kt_print_banner() ), a až budeš tuto část renderovat, spusť i tyto funkce.

Někteří z Vás se teď možná budou ptát – „Nj, ale která ta z těch X funkcí bude spuštěna první a která ta další“. I na to vývojáři mysleli a pokud se podívám na funkci add_action() zjistíme, že má více parametrů. Je to právě třetí parametr, který určuje prioritu. Posledním parametrem je pak int, který udává počet přijatých parametrů ve volané funkci.

WordPress hook s prioritou a parametry pro volanou funkci


<?php

	function kt_print_post_title(WP_Post $post){

		echo $post->post_title;

		do_action('after_print_post_title', $post);
	}

	add_action('after_print_post_title', 'kt_print_content_for_page', 10, 1);

	function kt_print_content_for_page($post){
		if($post->post_type == 'page'){
			echo $post->post_content;
		}
	}
?>

Nyní jsem napsal dvě velmi jednoduché funkce. Jedna hlavní, která má jako parametr $post a je vyžadována jako objekt typu WP_Post. Ve funkci pak pouze vypíšu titulek postu a přidám akci s názvem ‚after_print_post_title‘, jako předaný parametr předám celý post. Poté jsem přidal funkci do hooky a říkám, že tato hooka má prioritu deset a volaná funkce přijímá jeden argumet – právě ten náš post. Nyní je v naší funkci kt_print_content_for_page() dostupný i objekt postu, který byl ve funkci předán. Otestujeme jeho typ a pokud je to stránka, vypíšeme ještě jeho obsah.

Zde je názorně vidět, jak jsem do funkce přidal funkci jinou bez toho, že bychom museli zasahovat do zdrojového kódu autora oné funkce. Ano, pravděpodobně si odpovídáte dobře, když se ptáte na to, ale co když tam ty hooky nebudou? Když nebudou, autor vám neumožní dělat tato „kouzla“. Proto všem doporučuji svá důležitá místa osazovat těmito akcemi, aby se s tím dalo lépe pracovat nebo vaše projekty rozšiřovat. Také myslete na dobře zvolené parametry, které by se případným uživatelům mohly hodit k tomu, aby něco „provedli“.

Hooky jsou super! Ale čeho moc, toho příliš.

Nyní si možná řeknete, že byste tedy měli dávat tyto „hooky“ úplně všude a na všechno. Ale pozor, není to příliš vhodné. Protože hooky a jejich funkce se alokují do paměti serveru ještě před samotnou inicializaci WordPressu. Tím nechci říct, že musíte šetřit příliš. WordPress jako takový má stovky těchto akcí, není proto důvod počítat v jednotkách, ale myslet na to, a nedávat akci za každý řádek Vašeho kódu. Jednoduše řečeno: „Dejte to tam, kde víte, že je něco důležitého a bylo by potřeba tam různé funkce volat“.

Závěr

Popravdě si složitější věci pro WordPress neumím bez těchto funkcí představit. Nikdy nevíte, ke komu se Vaše kódy dostanou a kdo by s nimi mohl aktivně pracovat. Občas to používám já čistě v rámci svých projektů, protože je lepší mít jednu hooku a tu volat v různých projektech dle potřeby – v našem interním frameworku jich máme pro své použití mraky :-). V dalším díle se podíváme na obdobnou věc a tou jsou filtry. Je to skoro to samé, ale filtry nám dovolí navíc vracet nějaká data nebo hodnoty zpět do původní funkce. To je také velmi užitečné.

 

Tomáš Kocifaj, KTStudio.cz

, , ,

  1. #1 Quallity 8.12.2013 - 17:46

    Chcem poďakovať autorovi :) , paráda a dúfam že budeš ďalej pokračovať :)

  2. #2 Tomáš Kocifaj 9.12.2013 - 08:05

    Zdravím tě, určitě ještě pár dílu v plánu máme (cca do 20.), pak uvidíme, jestli bude ještě o čem psát – rádi bychom klidně slyšeli i náměty od čtenářů. Co Vás zajímá, co Vám nešlo, nebo co byste rádi věděli.

Komentáře jsou uzavřeny.