ปัญหาคือคุณไม่สามารถแยกแยะความแตกต่างของฟังก์ชั่นนิรนามและอื่น ๆ ได้ใช่มันเป็นไปได้ที่จะลบการปิด (เช่นฟังก์ชั่นที่ไม่ระบุชื่อ) แต่ถ้ามีมากกว่าหนึ่งปิดการกระทำในตัวกรองเดียวกัน เอาพวกมันทั้งหมดออกไปเพียงอันเดียว (โดยไม่รู้ว่าอะไร)
ฉันจะแสดงวิธีการลบพวกเขาทั้งหมดโดยใช้ฟังก์ชั่นที่ได้มาอย่างมากจาก @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 );