문제는 익명 함수와 다른 함수를 구별 할 수 없기 때문에 클로저 (즉, 익명 함수)를 제거 할 수 있지만 둘 이상의 클로저가 동일한 우선 순위로 동일한 필터에 작용하는 경우 선택해야한다는 것입니다 , 그것들을 모두 제거하십시오 .
게시 한 @toscho 답변의 기능에서 파생 된 기능을 사용하여 모두 제거하는 방법을 보여 드리겠습니다.
/**
* 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] );
}
}
}
}
remove_object_filter
정적 클래스 메서드, 동적 개체 메서드 및 클로저와 같은 모든 유형의 개체 필터를 제거 할 수 있으므로 함수의 이름을 변경했습니다 .
$priority
인수는 선택 사항이지만 항상 사용되어야한다 클로저를 제거 할 때, 그렇지 않으면 함수는 경우 때문에, 상관없이 어떤 우선 순위로, 필터에 추가 된 폐쇄 제거 $priority
생략, 대상 클래스 / 메소드 또는 폐쇄를 사용하는 모든 필터가 있습니다를 제거되었습니다.
사용하는 방법
// 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 );