Vấn đề là bạn không thể phân biệt một hàm ẩn danh và một hàm khác, vì vậy, có thể loại bỏ một bao đóng (tức là hàm ẩn danh) nhưng nếu có nhiều hơn một đóng hoạt động trên cùng một bộ lọc theo cùng một mức ưu tiên, bạn phải lựa chọn , loại bỏ tất cả, quặng chỉ loại bỏ một (mà không biết chính xác).
Tôi sẽ chỉ cho bạn cách xóa tất cả chúng bằng cách sử dụng một hàm có nguồn gốc cao từ hàm trong câu trả lời @toscho mà bạn đã đăng:
/**
* 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] );
}
}
}
}
Tôi đã đổi tên hàm remove_object_filter
vì nó có thể loại bỏ tất cả các loại bộ lọc đối tượng: phương thức lớp tĩnh, phương thức đối tượng động và đóng.
Đối $priority
số là tùy chọn, nhưng khi loại bỏ các bao đóng nên luôn luôn được sử dụng, nếu không, hàm sẽ loại bỏ bất kỳ bao đóng nào được thêm vào bộ lọc, bất kể mức độ ưu tiên nào, bởi vì khi $priority
được bỏ qua, tất cả các bộ lọc sử dụng lớp / phương thức đích hoặc đóng loại bỏ.
Cách sử dụng
// 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 );