toscho.design

WordPress: add_action() und add_filter() mit Parametern benutzen

Die Funktionen add_action() und add_filter() arbeiten relativ statisch: Wir können ihnen den Hook nennen, die Callback-Funktion, die Priorität und die Zahl der zu übergebenden Argumente. Nicht schlecht, aber auch nicht gut genug. Was zunächst nicht geht: dynamische Parameter mitgeben.

Ab PHP 5.3 können wir Closures benutzen, auch anonyme Funktionen genannt. Sie funktionieren ähnlich wie in JavaScript – mit einem Unterschied: Der Variablen-Scope erbt nicht automatisch den des Parents. Dazu brauchen wir use().

Stecken wir das alles zusammen:

$param1 = '<p>This works!</p>';
$param2 = 'This works too!';

add_action(
    'wp_footer',
    function() use ( $param1 )
    {
        echo $param1;
    },
    11
);
add_filter(
    'the_content',
    function( $content ) use ( $param2 )
    {
        return t5_param_test( $content, $param2 );
    },
    12
);

/**
 * Add a string to post content
 *
 * @param  string $content
 * @param  string $string This is $param2 in our example.
 * @return string
 */
function t5_param_test( $content, $string )
{
    return "$content <p><b>$string</b></p>";
}

Wie bei allem, das Spaß macht, gibt es ein Aber. Naja, sogar zwei: WordPress verlangt derzeit noch PHP 5.2, auf einigen Systemen mit so alten Versionen wird das also nicht funktionieren.
Und es ist relativ schwierig, so etwas mit remove_action() oder remove_filter() zu entfernen.

Wer alte PHP-Versionen unterstützen möchte, kann die Klasse WPSE_Filter_Storage benutzen, die ich mal auf WordPress Stack Exchange veröffentlicht habe.