समस्या यह है कि आप एक अनाम फ़ंक्शन और किसी अन्य को अलग नहीं कर सकते हैं, इसलिए हां, एक क्लोजर (यानी अनाम फ़ंक्शन) को निकालना संभव है, लेकिन यदि एक ही प्राथमिकता पर एक से अधिक क्लोजर अधिनियम एक ही प्राथमिकता पर हैं तो आपको एक विकल्प बनाना होगा , उन सभी को हटा दें, अयस्क केवल एक को हटा दें (बिना यह जाने कि कौन सा)।
मैं दिखाता हूँ कि आपके द्वारा पोस्ट किए गए @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 );