Masalahnya adalah Anda tidak dapat membedakan bentuk fungsi anonim dan lainnya, jadi ya, dimungkinkan untuk menghapus penutupan (yaitu fungsi anonim) tetapi jika lebih dari satu penutupan bertindak pada filter yang sama pada prioritas yang sama Anda harus membuat pilihan , hapus semuanya, jangan hanya menghapus satu (tanpa mengetahui persisnya).
Saya akan menunjukkan cara menghapus semuanya menggunakan fungsi yang sangat berasal dari yang ada di @toscho jawaban yang Anda poskan:
/**
* 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] );
}
}
}
}
Saya telah mengganti nama fungsinya remove_object_filter
karena dapat menghapus semua jenis filter objek: metode kelas statis, metode objek dinamis, dan penutup.
The $priority
argumen adalah opsional, tetapi ketika menghapus penutupan itu harus selalu digunakan, jika tidak fungsi akan menghapus setiap penutupan ditambahkan ke filter, tidak peduli di mana prioritas, karena ketika $priority
dihilangkan, semua filter menggunakan kelas target / metode atau penutupan yang dihapus.
Cara Penggunaan
// 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 );