Problem polega na tym, że nie można rozróżnić funkcji anonimowej od innej, więc tak, możliwe jest usunięcie zamknięcia (tj. Funkcji anonimowej), ale jeśli więcej niż jedno zamknięcie działa na tym samym filtrze z tym samym priorytetem, musisz dokonać wyboru , usuń je wszystkie, lub usuń tylko jeden (nie wiedząc dokładnie, które).
Pokażę, jak je wszystkie usunąć za pomocą funkcji pochodzącej z tej z odpowiedzi @toscho:
/**
* 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] );
}
}
}
}
Zmieniłem nazwę funkcji, remove_object_filter
ponieważ może ona usuwać wszystkie typy filtrów obiektów: metody klas statycznych, metody obiektów dynamicznych i zamknięcia.
$priority
Argument jest opcjonalny, ale podczas zdejmowania zamknięć należy zawsze stosować, inaczej funkcja usunie wszelkie zamknięcie dodany do filtra, bez względu na to, w którym priorytetem, bo gdy $priority
zostanie pominięty, wszystkie filtry wykorzystujące klasę docelową / metody lub zamknięcie są oddalony.
Jak używać
// 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 );