2016-04-15 2 views
5

Так у меня есть этот плагин кодWordPress - удалить действие, определенное в классе плагина

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 функции. Вот как я планирую изменить содержимое этой функции. Подобно написанию другой функции с почти тем же html, что и исходный, но бит моих изменений. Что-то вроде

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. Я пытаюсь заблокировать вывод gridlist_toggle_button через functions.php. Но если плагины загружаются до functions.php, то функция, которую нужно заблокировать, уже вызывается и, следовательно, она всегда показывает результат.

Я не очень хорошо знаком с ООП. Может кто-нибудь, пожалуйста, помогите мне?

ответ

3

Всякий раз, когда создается экземпляр $wc_lg = new WC_List_Grid(), его запуск будет запущен wp крючок. Сразу после создания объекта глобального WP-класса экземпляр $wg_lg будет называть setup_gridlist() сам по себе. Его будет запускать крючок woocommerce_before_shop_loop. И всякий раз, когда это происходит, снова $wg_lg собирается вызвать функцию на себе. А именно gridlist_toggle_button().

Я хочу изменить содержание функции gridlist_toggle_button

Почему бы не просто изменить его в плагин? Как переопределить все, что внутри.

глобальный $ WC_List_Grid;

Как вы узнали, что у $WC_List_Grid есть свое название? Это просто название класса. Он может быть создан под любым именем, например $foo или $bar.

Я предполагаю, что вы кодируете файл functions.php вашего шаблона. Плагины загружаются до того, как функции.php и remove_action() могут работать только после add_action().

Важно: Чтобы удалить крючок, аргументы $ function_to_remove и $ priority должны совпадать, когда был добавлен крюк. Это касается и фильтров и действий . Предупреждение об отказе не будет выдано.

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

Так это должно реально работать только для снятия действия, но как это поможет вам изменить содержание внутри функции? :

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

Обратите внимание, что вы были с использованием приоритета 100

EDIT

я узнал, что 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 и без приоритета. Я думаю, что ваша точка «Плагины загружаются до того, как функции.php» являются причиной. Потому что я пытаюсь заблокировать вывод gridlist_toggle_button. Но, как вы предположили, если плагины загружаются до functions.php, то эта функция уже вызывается и, следовательно, выводит вывод всегда. –

Смежные вопросы