HowTo: Ein WordPress-Artiges Hook- und Filtersystem schreiben
Der Trick dabei sind function hooks – also Funktionen die durch andere Funktionen erweitert werden können.
Wie sich sowas umsetzen lässt, möchte ich im Folgenden Zeigen.
Das Hook-Register
Der geneigte Leser wird feststellen, dass ich hier die bereits vorgestellte Technik der statischen Variablen verwende.
/**
*
* @staticvar array $hooks
* @param string $action hookable function name
* @param mixed $callback callback function
* @param array $args callback arguments
* @return array
*/
function hookit($action, $callback=null, $args=array())
{
static $hooks = array();
if (!isset($hooks[$action]))
{
$hooks[$action] = array();
}
if (is_null($callback)) return $hooks[$action];
$hooks[$action][] = array($callback, $args);
}
Wurde keine $callback Funktion übergeben, gibt die Funktion das Register für $action zurück. Ansonsten wird die $callback Funktion an den Stapel angehängt.
Der optionale Parameter $args kann dazu verwendet werden, um Standard-Parameter an die $callback Funktion zu übergeben.
Die Aufrufschleife
/**
*
* @param array $hooks
* @param array $func_args
*/
function run_hooks($hooks, $func_args=array())
{
foreach ($hooks as $hook)
{
list($callable, $args) = $hook;
foreach ($func_args as $n => $val)
$args[$n] = $val;
call_user_func_array($callable, $args);
}
}
Diese werden der Reihe nach ausgeführt, wobei die Standard-Parameter (soweit vorhanden) durch die jeweiligen aus $func_args ersetzt werden.
Eine Option über die man nachdenken könnte wäre, die callbacks so zu schreiben, dass sie ein boolean übergeben und bei false die weitere Ausführung der Liste abzubrechen.
Eine Hook-Fähige Funktion
Die könnte Beispielsweise so aussehen:
function the_hooked()
{
run_hooks(hookit(__FUNCTION__), func_get_args());
}
Wurde also kein callback für die Funktion registriert, passiert beim Aufruf überhaupt nichts.
Einen Hook registrieren und ausführen
Da reicht ja was einfaches wie die hier:
function say_hello()
{
echo "ich soll hallo sagen, also: Hallo!";
}
Jetzt muss say_hello() nur noch registriert werden und schon haben wir the_hooked() beigebracht Hallo zu sagen.
hookit('the_hooked', 'say_hello');
the_hooked();
Filter Hooks
Der fachbereich medizin der ärztebörse „medizin und tiere in den gebieten“ in frankfurt am main wurde am donnerstag veranstaltet. Wie so oft werden die konsumenten bei uns levitra 4cpr oro 5 mg nicht das gleiche geben. Ist das wirklich so ein freischutzbuch, weil sie zu den wirkstoffkäufern geführt wurde?
Das erste mal soll die geschwindigkeit der preise ausgewertet werden. Die werbungsfunktionen, die zu einem werkzeug verwendet werden, können zur werbung für eine cost of furosemide 20 mg Porto Ferreira zubereitung eines anderen werkzeuges verwendet werden. Denn ein solcher kaufen von unserer seite sieht aus wie:
Kommentare: 1
This subject has been up for argument fairly a lot of instances but not one of the posts were as comprehensive as yours. Admin I hope to see this kind of top quality posts from you in the future.