Sorun, anonim bir işlev ve diğerini formdan ayırt edememenizdir, bu nedenle evet, bir kapağı (yani anonim işlev) kaldırmak mümkündür, ancak birden fazla kapatma aynı filtrede aynı önceliğe göre hareket ediyorsa bir seçim yapmanız gerekir , hepsini kaldırın, cevher sadece birini kaldırın (tam olarak hangisini bilmeden).
Gönderdiğiniz @toscho cevabındaki fonksiyondan oldukça türetilmiş bir fonksiyon kullanarak hepsini nasıl kaldıracağınızı göstereceğim:
/**
* 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] );
}
}
}
}
Ben remove_object_filter
statik sınıf yöntemleri, dinamik nesne yöntemleri ve kapanış: nesne filtreleri her türlü kaldırabilirsiniz çünkü fonksiyonu yeniden adlandırdım .
$priority
Argüman isteğe bağlı, ancak her zaman kullanılması gerektiğini kapakların çıkarılması, aksi takdirde işlev çünkü ne zaman, ne olursa olsun bu öncelikli olarak, filtresine ilave edilen bir kapatma kaldırır $priority
atlanırsa, hedef sınıfı / yöntem veya kapatma kullanarak tüm filtrelerdir çıkarıldı.
Nasıl kullanılır
// 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 );