बेनामी कार्यों के माध्यम से जोड़े गए क्रिया / फ़िल्टर निकालें


10

यह एक बुरा अभ्यास है जो मुझे कहना चाहिए। बेनामी कार्यों के माध्यम से जोड़े गए कार्यों और फिल्टर को हटाने के लिए एक समाधान खोजने में पिछले दो घंटे बिताए।

यह एक पेरेंट थीम पर उपयोग किया जाने वाला कोड है, और मुझे इसे हटाने की आवश्यकता है।

/**
 * Add custom columns to admin comments grid
 *  * Rate that user set.
 */
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
});

मिल गया है , तो जवाब के साथ भारी खेला, लेकिन कोई मदद नहीं की। तो, क्या कोई अन्य विकल्प है जो गुमनाम कार्यों के माध्यम से जोड़े गए कार्यों / फिल्टर को हटा देगा?

धन्यवाद


मैं विषय के लेखक से संपर्क करने का सुझाव दूंगा। अनाम के स्थान पर एक नामित फ़ंक्शन का उपयोग करना उसके लिए एक अपेक्षाकृत आसान फिक्स है और कोड में सुधार करेगा।
हेलगाथेविकिंग

gmazzap ऐसा लगता है जैसे @ vishalbasnet23 ने इसे यहां किया: gist.github.com/vishalbasnet23/5f74df4c800681199ab0246bc037d1d5 मैं इसका परीक्षण कर रहा हूं और अब तक यह पूरी तरह से काम कर रहा है।
रेनन ओलिवेरा

जवाबों:


10

समस्या यह है कि आप एक अनाम फ़ंक्शन और किसी अन्य को अलग नहीं कर सकते हैं, इसलिए हां, एक क्लोजर (यानी अनाम फ़ंक्शन) को निकालना संभव है, लेकिन यदि एक ही प्राथमिकता पर एक से अधिक क्लोजर अधिनियम एक ही प्राथमिकता पर हैं तो आपको एक विकल्प बनाना होगा , उन सभी को हटा दें, अयस्क केवल एक को हटा दें (बिना यह जाने कि कौन सा)।

मैं दिखाता हूँ कि आपके द्वारा पोस्ट किए गए @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 );

मैंने यह एक और कई अन्य लोगों की कोशिश की है, लेकिन यह बस काम नहीं करता है
adamj

@adamj संस्करण 4.7 के बाद से, वर्डप्रेस संभाल हुक करने के लिए नया तरीका है, तो यह अब और काम नहीं करते ...
gmazzap

क्या आप किसी भी विकल्प से किसी भी विकल्प के बारे में जानते हैं?
adamj

1
@adamj मैं इसे 4.7+ के लिए अपडेट कर सकता था, लेकिन अब समय नहीं है, और निश्चित नहीं है कि मेरे पास कब होगा। एक नया प्रश्न खोलना ठीक है, जहाँ आप इस Q / A से लिंक करते हैं और कहते हैं कि यह पुराना है, इस तरह से कोई भी उत्तर दे सकता है, इसलिए यदि मेरे पास कोई समय नहीं होगा, तो शायद कोई और होगा। विकल्प के रूप में, तो आप इस क्यू पर एक इनाम है, यहाँ काम WP के वर्तमान संस्करण में डाल सकता है कि सबसे upvoted जवाब समझा नहीं है ...
gmazzap

3

क्या होगा यदि आप अपने फ़िल्टर को प्राथमिकता 11 के साथ जोड़ते हैं, तो यह बाद में जाता है? यह बदसूरत है, लेकिन आपके मामले में काम कर सकता है।

add_filter( 'manage_edit-comments_columns', function( $default ) {
    unset( $default['smr_comment_rate'] );

    return $default;
}, 11, 1 );

2

अनाम फ़िल्टर और कार्यों को मूल रूप से निम्नलिखित का उपयोग करके हटाया जा सकता है:

remove_filter( $tag, function(){}, $priority )

अद्वितीय आईडी का उपयोग करते समय spl_object_hash(), अनाम फ़ंक्शंस एक दूसरे से तुलनीय होते हैं, इसलिए पूर्ण क्लोजर ऑब्जेक्ट को फिर से बनाने की आवश्यकता नहीं होती है।

यदि एकाधिक फ़िल्टर या क्रियाएं समान प्राथमिकता के साथ एक ही टैग से जुड़ी हैं, तो यह नवीनतम फ़िल्टर या क्रिया को हटा देगा जो जोड़ा गया था। यदि आपको रखने की आवश्यकता है, तो आपको हटाए जाने वाले सभी फ़िल्टर को हटाना होगा, फिर दूसरों को आवश्यकतानुसार जोड़ना होगा।

// Filter which was added and needs to be removed
add_filter( 'manage_edit-comments_columns', function( $default ) {
    $columns['smr_comment_rate']  = __( 'Rate', 'txtdmn' );

    return array_slice( $default, 0, 3, true ) + $columns + array_slice( $default, 2, NULL, true );
} );

// Removes the last anonymous filter to be added
remove_filter( 'manage_edit-comments_columns', function(){} );

यह आम तौर पर सर्वोत्तम प्रथाओं पर वापस आएगा। मैं केवल एक ग्राहक के लिए विकसित कर रहे एक कस्टम विषय के हिस्से के रूप में अनाम कार्यों का उपयोग करूँगा, जहाँ मैं नहीं चाहता कि फ़िल्टर को अधिलेखित या हटा दिया जाए। मेरे द्वारा विकसित किसी भी सार्वजनिक विषय या प्लगइन में, मैं एक क्लास को इनिशियलाइज़ करने के लिए एक फैक्ट्री का उपयोग करूँगा, अपने सभी फ़िल्टर और कार्यों को जोड़ूँगा, फिर एक स्थिर चर के रूप में इंस्टेंस को स्टोर करूँगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.