“add_action” – a mindenes csodafüggvény

[Ezt a cikket 5 perc elolvasni.]

WordPress plugin fejlesztése vagy plusz funkciók írása közben talán sokunk találkozott már az ‘add_action’ függvénnyel, mellyel a kívánt pillanatban (‘init’, ‘wp_head’, stb.) beillesztette a saját egyéni függvényét, s ezzel megvalósította a szándékolt funkcionalitást. Kicsit merüljünk el abban, hogy pontosan mi is történik, mikor ezt a sokszor emlegetett előkészítő függvényt meghívjuk.

Ha megnézzük a WP dokumentációját, láthatjuk, hogy ezen az oldalon kapunk egy átfogó képet erről a függvényről. A leírás nem túl bőbeszédű, de azért megadja a kellő magyarázatot: ‘Hooks a function on to a specific action.’, magyarán hozzáköt egy-egy funkciót egy adott eseményhez.
A létező összes eseményt megtaláljuk ezen a terjedelmes listát felvonultató oldalon: [link].
Példának okáért, ha megnézzük a sokszor felhasznált ‘init’ eseménypontot, akkor láthatjuk, hogy nyers fordításban: A WordPress {..ezen a ponton} javarészt már betöltött és a felhasználó autentikálva van. A betöltés folytatása az ‘init’ eseményponttal, ahol a legtöbb plugin élesíti magát különböző okokból kifolyólag. (szükségük van a már bejelentkezett felhasználóra, bejegyzések adataira, stb.)
Ha a dokumentációban szereplő kódot megnézzük, mely egyébiránt a “wp-includes/plugin.php” fáljban található, akkor azt látjuk, hogy ez a függvény egy másik WordPress-es függvényhez készült burkoló-függvény, semmi több:

function add_action( $tag, $function_to_add, $priority = 10, $accepted_args =
1 ) {
return add_filter( $tag, $function_to_add, $priority, $accepted_args );
}

Paramétereit tekintve, általában az első kettőt szoktuk használni, mivel ezek határozzák meg, hogy mely ponton ( $tag ) és pontosan mi ( callable $function_to_add ) fusson le. A további paraméterek opcionálisak, alapértelmezett értékkel rendelkeznek. ( A dokumentáció természetesen kitér a $priority és az $accepted_args paraméterre is, itt ezekre most nem térünk ki külön ). Tovább folytatva a nyomozásunkat, az add_filter függvény szintén ebben a fáljban található, és eképpen néz ki:

function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args =
1 ) {
global $wp_filter;
if ( ! isset( $wp_filter[ $tag ] ) ) {
$wp_filter[ $tag ] = new WP_Hook();
}
$wp_filter[ $tag ]->add_filter( $tag, $function_to_add, $priority,
$accepted_args );
return true;
}

No, itt már láthatóan történik is ‘valami’. Nézzük csak meg, hogy pontosan mi. ‘A WordPress olyan eseménypontokat kínál, amelyek lehetővé teszik a beépülő modulok számára, hogy futás közben módosítsanak különböző belső adatokat.’ – írja a dokumentáció. Ha magát ezt a pár soros függvény-implementációt megnézzük, láthatjuk, hogy egy globális $wp_filter tömbben vizsgáljuk meg, hogy létezik-e a hozzáadni kívánt esemény-regisztráció. Amennyiben nem, úgy példányosítunk egy új WP_Hook objektumot és a $wp_filter[$tag] helyre hozzáadjuk az eseményünket az add_filter függvény segítségével. Végezetül, ez a függvény mindig true-val tér vissza. Paramétereiben teljesen megegyezik a fentebb ismertetett add_action függvényhez tartozókkal. A “wp-includes/plugin.php” fájl elején megtaláljuk, hogy ezen változónk WP_Hook[] $wp_filter ezekszerint egy tömb, melyben valóban az eseményekhez bekötött akcióinkat tudjuk tárolni.
Egy teszt kedvéért aktuális wp témánkhoz tartozó “functions.php” fáljban elhelyeztem a következő kódrészletet:

function wp_filter_test() {
global $wp_filter;
echo '<!-- ', var_export( $wp_filter[ 'wp_head' ], true ), ' -->';
}
class A {
function wp_filter_test() {
global $wp_filter;
echo '<!-- ', var_export( $wp_filter[ 'wp_head' ], true ), ' -->';
}
}
$a = new A();
add_action( 'wp_head', 'wp_filter_test' );
add_action( 'wp_head', array( &$a, 'wp_filter_test' ) );

Az oldalon lefuttatva és annak forráskódjába belepillanatva pedig láthatom, hogy:

<!-- WP_Hook::__set_state(array(
'callbacks' =>
array (
...
'wp_filter_test' =>
array (
'function' => 'wp_filter_test',
'accepted_args' => 1,
),
...
array (
'function' =>
array (
0 =>
A::__set_state(array(
)),
1 => 'wp_filter_test',
),
'accepted_args' => 1,
),
)) -->

Anélkül, hogy az összes részletet értenünk kellene, láthatjuk, hogy valóban ebben a $wp_filter globális változóban tárolódik az összes bejegyzett eseményünk. Amennyiben szintén ebben a fáljban szétnézünk, ugyanitt találhatjuk a beszédes do_action() függvényt, mely a WP dokumentáció szerint: ‘Meghívja az egy-egy eseményhez beregisztrált akciókat’. Tehát, ő fogja úgymond meghúzni a ravaszt, a megfelelő pillanatban. Nos, ha ki akarnánk jelölni 1 pontot a WP core-ján belül, ahol lefut az összes bejegyzett akció, ezt nem tudnánk egyértelműen megtenni, ugyanis sok helyen, sokfajta esemény fut le, amint azt a dokumentációban is megemlítik. A legjobb tájékozódási pont az eseményeket felvonultató leíró oldal: [link]

Hogy egy példát kiemeljünk, az ‘init’ hook például a gyökérmappában található “/wp-settings.php” fáljban lesz meghívva. Nehezítő tényező, hogy az interneten nem igazán találni megfelelő forrást arra vonatkozóan, hogy mely események milyen pontokon futnak le a WordPress oldalbetöltése során. Kis kutatással és csöppnyi angoltudással azonban általában meg lehet találni a legmegfelelőbb eseményregisztrációs pontokat, mely számunkra a legjobb.

Segítségként mellékelek egy weboldalt, mely listába szedve és rendszerezve mutatja be ezeket az elérhető WP hookokat: [link]

Ha tetszik, mutasd meg másoknak is: