Le problème est que vous ne pouvez pas distinguer une fonction anonyme d'une autre, donc oui, il est possible de supprimer une fermeture (c'est-à-dire une fonction anonyme) mais si plus d'une fermeture agit sur le même filtre avec la même priorité, vous devez faire un choix , supprimez-les tous, ou n'en supprimez qu'un (sans savoir exactement lequel).
Je vais montrer comment les supprimer tous en utilisant une fonction très dérivée de celle de la réponse @toscho que vous avez publiée:
/**
* 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] );
}
}
}
}
J'ai renommé la fonction remove_object_filter
car elle peut supprimer tous les types de filtres d'objets: méthodes de classe statiques, méthodes d'objet dynamiques et fermetures.
L' $priority
argument est facultatif, mais lors de la suppression des fermetures, il doit toujours être utilisé, sinon la fonction supprimera toute fermeture ajoutée au filtre, quelle que soit la priorité, car lorsqu'elle $priority
est omise, tous les filtres utilisant la classe / méthode cible ou la fermeture sont supprimé.
Comment utiliser
// 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 );