Standardmäßig ist dies nicht möglich. Es gibt Problemumgehungen, wenn Sie es auf die OOP-Weise tun.
Sie können eine Klasse erstellen, um die Werte zu speichern, die Sie später verwenden möchten.
Beispiel:
/**
* Stores a value and calls any existing function with this value.
*/
class WPSE_Filter_Storage
{
/**
* Filled by __construct(). Used by __call().
*
* @type mixed Any type you need.
*/
private $values;
/**
* Stores the values for later use.
*
* @param mixed $values
*/
public function __construct( $values )
{
$this->values = $values;
}
/**
* Catches all function calls except __construct().
*
* Be aware: Even if the function is called with just one string as an
* argument it will be sent as an array.
*
* @param string $callback Function name
* @param array $arguments
* @return mixed
* @throws InvalidArgumentException
*/
public function __call( $callback, $arguments )
{
if ( is_callable( $callback ) )
return call_user_func( $callback, $arguments, $this->values );
// Wrong function called.
throw new InvalidArgumentException(
sprintf( 'File: %1$s<br>Line %2$d<br>Not callable: %3$s',
__FILE__, __LINE__, print_r( $callback, TRUE )
)
);
}
}
Jetzt können Sie die Klasse mit jeder gewünschten Funktion aufrufen - wenn die Funktion irgendwo existiert, wird sie mit Ihren gespeicherten Parametern aufgerufen.
Lassen Sie uns eine Demo-Funktion erstellen ...
/**
* Filter function.
* @param array $content
* @param array $numbers
* @return string
*/
function wpse_45901_add_numbers( $args, $numbers )
{
$content = $args[0];
return $content . '<p>' . implode( ', ', $numbers ) . '</p>';
}
... und benutze es einmal ...
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
'wpse_45901_add_numbers'
)
);
… und wieder …
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
'wpse_45901_add_numbers'
)
);
Ausgabe:
Der Schlüssel ist die Wiederverwendbarkeit : Sie können die Klasse (und in unseren Beispielen auch die Funktion) wiederverwenden.
PHP 5.3+
Wenn Sie eine PHP - Version 5.3 oder höher verwenden , können Verschlüsse werden so viel einfacher machen:
$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>";
}
Der Nachteil ist, dass Sie keine Komponententests für Verschlüsse schreiben können.
$func = function() use ( $param1 ) { $param1; };
undadd_action( $func, 11);
), überremove_action( $func, 11 );
Erstellen Sie eine Funktion mit den erforderlichen Argumenten, die eine Funktion zurückgibt. Übergeben Sie diese Funktion (anonyme Funktion, auch als Closure bezeichnet) an den wp-Hook.
Hier gezeigt für einen Admin-Hinweis im WordPress-Backend.
quelle
Verwenden Sie PHP Anonymous-Funktionen :
quelle
Ich weiß, dass die Zeit vergangen ist, aber ich hatte ein Problem mit der Übergabe meines eigenen Parameters, bis ich feststellte, dass der vierte Parameter in add_filter die Anzahl der übergebenen Parameter einschließlich des zu ändernden Inhalts ist. Wenn Sie also 1 zusätzlichen Parameter übergeben, sollte die Zahl 2 und in Ihrem Fall nicht 1 sein
und mit
quelle
Die korrekte, wirklich kurze und effizienteste Methode, um beliebig viele Argumente an WP-Filter und -Aktionen zu übergeben, ist die von @Wesam Alalem hier verwendete Methode , die den Abschluss verwendet.
Ich möchte nur hinzufügen, dass Sie es noch klarer und flexibler gestalten könnten, indem Sie die eigentliche Methode des Handlers von der anonymen Schließung trennen. Dazu rufen Sie die Methode aus dem Closure wie folgt auf (modifiziertes Beispiel aus @Wesam Alalem answer).
Auf diese Weise können Sie so lange oder komplizierte Logik schreiben, wie Sie möchten, und zwar außerhalb des Abschlusses, den Sie verwenden, um den eigentlichen Handelnden aufzurufen.
quelle
Wenn Sie einen eigenen Hook erstellen, finden Sie hier ein Beispiel.
dann implementiere hook:
quelle
3
?Sie können immer global verwenden, nicht wahr?
quelle
Gehen Sie eleganter vor, obwohl Sie eine Funktion direkt aufrufen: Übergeben Sie eine anonyme Funktion als Rückruf.
Zum Beispiel:
Ich habe eine einzige Funktion, um den Titel, den Inhalt und den Auszug aus meinen Beiträgen zu übersetzen. Daher muss ich einige Argumente an diese Hauptfunktion weitergeben, die besagen, wer anruft.
Die Hauptfunktion
translate_text
erhält also so viele Parameter, wie ich möchte, nur weil ich eine anonyme Funktion als Rückruf übergeben habe.quelle
Ich hatte gehofft, dasselbe zu tun, aber da dies nicht möglich ist, besteht eine einfache Umgehung darin, eine andere Funktion wie aufzurufen
add_filter('the_content', 'my_content_filter', 10, 1);
Dann kann my_content_filter () my_content () aufrufen und jedes gewünschte Argument übergeben.
quelle