WordPress bietet sehr viele Hooks an, mit denen man mit dem Code interagieren kann. Filter ändern dabei den Wert einer übergebenen Variablen und in der Regel möchte man diesen Wert jedes Mal ändern, wenn der Filter angewendet wird. Bei Actions möchte man den Code aber vielleicht nur einmal ausführen, gerade wenn er Seiteneffekt, wie etwa den Versand einer E-Mail auslösen.
Prüfe, ob eine Action bereits ausgeführt wurde
Mit der Funktion did_action()
kann man prüfen, wie häufig eine Action bereits aufgerufen wurde. Wenn ihr euren eigenen Code also nur dann ausführen wollte, wenn die Action zum ersten Mal ausgeführt wird, aber kein zweites Mal, dann könnt ihr das folgende tun:
function do_this_only_once() {
// If the action we are hooking in was called more than once, stop execution of the custom code.
if ( did_action( 'the_hook_name' ) > 1 ) {
return;
}
// Run your custom code
}
add_action( 'the_hook_name', 'do_this_only_once' );
Wenn die the_hook_name
Action ausgeführt wird, dann wird beim Ausführen von did_action( 'the_hook_name' )
der Wert 1
zurückgegeben, da die Action gerade eben ausgeführt wurde. Daher könnt ihr nicht einfach auf einen boolschen Wert testen, sondern ihr müsst prüfen, ob der Wert größer als Eins ist, um die Ausführung eures Codes zu stoppen.
Verwendet eure eigene Action, um mehrfache Ausführungen eures Codes zu verhindern
Manchmal könnt ihr nicht einfach prüfen, ob die Action zum ersten Mal ausgeführt wird, sondern ihr müsst noch weiter Dinge prüfen. In einem solchen Fall könnte man diese alle in eine Bedingung schreiben. Alternativ könnt ihr hier aber auch eine eigene Action nutzen, die ihr dann für das frühe Abbrechen der Funktion nutzen könnt:
function do_this_only_once( $hook_parameter ) {
// If the custom code has been run already, stop execution of custom code.
if ( did_action( 'do_this_only_once' ) ) {
return;
}
// A second check on a hook parameter.
if ( 'something' !== $hook_parameter ) {
return;
}
// Run your custom code
// Call our custom action, so we can check, if it has been called already.
do_action( 'do_this_only_once' );
}
add_action( 'the_hook_name', 'do_this_only_once' );
In diesem Beispiel prüfen wir in der ersten Bedingung auf unsere eigene Action. Dann führen wir eine weitere Bedingung aus, die die weitere Ausführung abbrechen könnte. Nur wenn auch diese Bedingung die Funktion nicht verlässt, wird der eigene Code schließlich ausgeführt. Ganz am Ende der Funktion führen wir dann unsere eigene Action aus. Die erste Bedingung in der Funktion stellt beim nächsten Aufruf der Funktion nicht nur sicher, dass wir den eigenen Code nicht erneut ausführen, es verhindert auch, dass die weiteren Bedingungen nicht erneut geprüft werden müssen.
Fazit
Es gibt mehrere Wege, um zu verhindern, dass euer Code für eine Action nur einmal ausgeführt wird. Dabei empfiehlt es sich in der Regel, dass man hierzu die did_action()
Funktion verwendet. Und wenn eurer Code Seiteneffekte hat, wie etwas das Versenden einer E-Mail, dann solltet ihr wirklich sicherstellen, dass er nur genau so oft aufgerufen wird, wie unbedingt notwendig.