Das Problem ist, dass Sie nicht zwischen einer anonymen und einer anderen Funktion unterscheiden können. Ja, es ist möglich, einen Abschluss (dh eine anonyme Funktion) zu entfernen. Wenn jedoch mehr als ein Abschluss mit derselben Priorität auf denselben Filter wirkt, müssen Sie eine Auswahl treffen , entferne sie alle, oder entferne nur eine (ohne genau zu wissen, welche).
Ich werde zeigen, wie Sie sie alle mit einer Funktion entfernen können, die stark von der in der von Ihnen geposteten @ toscho-Antwort abgeleiteten Funktion abweicht:
/**
* Remove an object filter.
*
* @param string $tag Hook name.
* @param string $class Class name. Use 'Closure' for anonymous functions.
* @param string|void $method Method name. Leave empty for anonymous functions.
* @param string|int|void $priority Priority
* @return void
*/
function remove_object_filter( $tag, $class, $method = NULL, $priority = NULL ) {
$filters = $GLOBALS['wp_filter'][ $tag ];
if ( empty ( $filters ) ) {
return;
}
foreach ( $filters as $p => $filter ) {
if ( ! is_null($priority) && ( (int) $priority !== (int) $p ) ) continue;
$remove = FALSE;
foreach ( $filter as $identifier => $function ) {
$function = $function['function'];
if (
is_array( $function )
&& (
is_a( $function[0], $class )
|| ( is_array( $function ) && $function[0] === $class )
)
) {
$remove = ( $method && ( $method === $function[1] ) );
} elseif ( $function instanceof Closure && $class === 'Closure' ) {
$remove = TRUE;
}
if ( $remove ) {
unset( $GLOBALS['wp_filter'][$tag][$p][$identifier] );
}
}
}
}
Ich habe die Funktion umbenannt, remove_object_filter
weil sie alle Arten von Objektfiltern entfernen kann: statische Klassenmethoden, dynamische Objektmethoden und Schließungen.
Das $priority
Argument ist optional, sollte jedoch beim Entfernen von Closures immer verwendet werden. Andernfalls entfernt die Funktion $priority
alle dem Filter hinzugefügten Closures, unabhängig von der Priorität, da alle Filter, die die Zielklasse / Methode oder den Closure verwenden, verwendet werden , wenn sie weggelassen werden entfernt.
Wie benutzt man
// remove a static method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_static_method', 10 );
// remove a dynamic method
remove_object_filter( 'a_filter_hook', 'AClass', 'a_dynamic_method', 10 );
// remove a closure
remove_object_filter( 'a_filter_hook', 'Closure', NULL, 10 );