El problema es que no puede distinguir entre una función anónima y otra, por lo que sí, es posible eliminar un cierre (es decir, una función anónima), pero si más de un cierre actúa sobre el mismo filtro con la misma prioridad, debe elegir , eliminarlos todos, o eliminar solo uno (sin saber exactamente cuál).
Mostraré cómo eliminarlos a todos utilizando una función altamente derivada de la que aparece en la respuesta @toscho que publicó:
/**
* 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] );
}
}
}
}
Cambié el nombre de la función remove_object_filter
porque puede eliminar todo tipo de filtros de objetos: métodos de clase estática, métodos de objetos dinámicos y cierres.
El $priority
argumento es opcional, pero cuando se eliminan los cierres, siempre se debe usar, de lo contrario, la función eliminará cualquier cierre agregado al filtro, sin importar en qué prioridad, porque cuando $priority
se omite, todos los filtros que usan la clase / método de destino o el cierre son remoto.
Cómo utilizar
// 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 );