2016-04-15 7 views
5

में परिभाषित किया तो मैं इस प्लगइन कोडवर्डप्रेस - हटाने कार्रवाई प्लगइन वर्ग

class WC_List_Grid { 

public function __construct() { 
    add_action('wp' , array($this, 'setup_gridlist') , 20); 
} 

function setup_gridlist() { 
    add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 
} 

function gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" id="grid" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" id="list" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

मैं gridlist_toggle_button समारोह की सामग्री को बदल करना चाहते हैं। इस प्रकार मैं उस फ़ंक्शन की सामग्री को बदलने की योजना बना रहा हूं। मूल रूप से एक ही एचटीएमएल के साथ एक और समारोह लिखने की तरह, लेकिन मेरे परिवर्तनों के बिट्स। जैसे

add_action('woocommerce_before_shop_loop','new_gridlist_toggle_button') 
function new_gridlist_toggle_button() {?> 
       <nav class="gridlist-toggle"> 
        <a href="#" class="grid-view" title="<?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-grid-view"></span> <em><?php _e('Grid view', 'woocommerce-grid-list-toggle'); ?></em></a> 
        <a href="#" class="list-view" title="<?php _e('List view', 'woocommerce-grid-list-toggle'); ?>"><span class="dashicons dashicons-exerpt-view"></span> <em><?php _e('List view', 'woocommerce-grid-list-toggle'); ?></em></a> 
       </nav> 
<?php } 
} 

इस तरह कुछ है, मैं सीधे

कि के लिए प्लगइन फ़ाइलें बदलने की जरूरत नहीं होगी, मैं इससे संबंधित कार्रवाई हटाने की कोशिश कर रहा हूँ।

add_action('woocommerce_before_shop_loop', array($this, 'gridlist_toggle_button'), 30); 

ताकि मैं अपना कोड उपयोग कर सकूं। लेकिन मैं इस कार्रवाई को हटाने के लिए प्रतीत नहीं कर सकता। मैंने अभी तक यह कोशिश की है।

विधि 1:

global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 

विधि 2:

function remove_plugin_actions(){ 
global $WC_List_Grid ; 
remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 100); 
} 
add_action('init','remove_plugin_actions'); 

विधि उनमें से 3

remove_action('woocommerce_before_shop_loop', array('WC_List_Grid', 'gridlist_toggle_button'), 100); 

कोई भी काम करने के लिए लगता है।

कुछ दिमागी तूफान के साथ, मुझे लगता है कि दो संभावित कारण हो सकते हैं।

  1. यह काम नहीं कर रहा है क्योंकि जिस क्रिया को मैं निकालना चाहता हूं वह सीधे हुक से जुड़ा नहीं है। कार्रवाई के अंदर इसकी कार्रवाई।
  2. मैं functions.php के माध्यम से gridlist_toggle_button के आउटपुट को अवरुद्ध करने का प्रयास कर रहा हूं। लेकिन यदि प्लगइन्स functions.php से पहले लोड होते हैं तो फ़ंक्शन को अवरुद्ध करने के लिए पहले से ही कॉल किया जा रहा है और इसलिए यह हमेशा आउटपुट दिखा रहा है।

मैं ओओपी के साथ बिल्कुल अच्छा नहीं हूं। क्या कोई व्यक्ति कृपा करके मेरी सहायता करेगा?

उत्तर

3

जब भी $wc_lg = new WC_List_Grid() तत्काल है, तो यह wp हुक ट्रिगर करने जा रहा है। ग्लोबल डब्ल्यूपी क्लास ऑब्जेक्ट की स्थापना के ठीक बाद, उदाहरण $wg_lgsetup_gridlist() पर कॉल करने जा रहा है। यह woocommerce_before_shop_loop हुक ट्रिगर करने जा रहा है। और जब भी ऐसा होता है, फिर से $wg_lg खुद पर एक फ़ंक्शन कॉल करने जा रहा है। अर्थात् gridlist_toggle_button()

मैं gridlist_toggle_button समारोह

क्यों न सिर्फ प्लगइन के अंदर इसे बदलने के लिए की सामग्री को बदल करना चाहते हैं? सबकुछ ओवरराइड की तरह इसके अंदर क्या है।

वैश्विक $ WC_List_Grid;

आप कैसे जानते हैं कि $WC_List_Grid का नाम है? यह सिर्फ एक वर्ग का नाम है। इसे $foo या $bar जैसे किसी भी नाम के तहत तुरंत चालू किया जा सकता है।

मुझे लगता है कि आप अपने टेम्पलेट की functions.php फ़ाइल में कोडिंग कर रहे हैं। Functions.php से पहले प्लगइन्स लोड किए जा रहे हैं और remove_action() केवल add_action() खुशी के बाद काम कर सकते हैं।

महत्वपूर्ण: एक हुक, $ function_to_remove और $ प्राथमिकता तर्क से मेल खाना चाहिए जब हुक जोड़ा गया है निकालने के लिए। यह फ़िल्टर और कार्यों दोनों के लिए जाता है। निष्कासन विफलता पर कोई चेतावनी नहीं दी जाएगी।

http://codex.wordpress.org/Function_Reference/remove_action

तो यह वास्तव में सिर्फ कार्रवाई को दूर करने के लिए काम करना चाहिए, लेकिन कैसे है कि आप समारोह के अंदर सामग्री को बदलने में मदद करता है? :

remove_action(
    'woocommerce_before_shop_loop', 
    array('WC_List_Grid', 'gridlist_toggle_button'), 
    30 
); 

सूचना है कि आप प्राथमिकता 100

संपादित

मुझे पता चला कि do_action('woocommerce_archive_description')archive-product.php में होता है और wc-template-functions.php सही woocommerce_before_shop_loop से पहले हुक कार्यों में प्लगइन में निष्पादित किया जा रहा उपयोग कर रहे थे। इसका उपयोग करने का प्रयास करें:

function remove_plugin_actions(){ 
    global $WC_List_Grid; 
    remove_action('woocommerce_before_shop_loop', array($WC_List_Grid, 'gridlist_toggle_button'), 30); 
} 
add_action('woocommerce_archive_description','remove_plugin_actions'); 
+0

कृपया मेरे अपडेट किए गए प्रश्न की समीक्षा करें। और मैंने पहले से ही इस विधि की कोशिश की है और यह या तो काम नहीं करता है। –

+0

क्या आपने 30 या 100 प्राथमिकता के साथ प्रयास किया था? क्या आपने कोई प्राथमिकता नहीं दी है? –

+0

सभी के साथ प्रयास किया, 30 और 100 और कोई प्राथमिकता नहीं। मुझे लगता है कि आपका बिंदु "plugins को functions.php से पहले लोड किया जा रहा है" कारण है। क्योंकि मैं gridlist_toggle_button के आउटपुट को अवरुद्ध करने की कोशिश कर रहा हूं। लेकिन जैसा कि आपने सुझाव दिया है, यदि प्लगइन्स functions.php से पहले लोड होते हैं तो वह फ़ंक्शन पहले से ही कॉल किया जा रहा है और इसलिए यह हमेशा आउटपुट दिखा रहा है। –

संबंधित मुद्दे