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

1 ответов


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

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

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

global $WC_List_Grid;

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

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

важно: чтобы удалить крюк, $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

редактировать

узнал, что do_action('woocommerce_archive_description') происходит архив-продукта.в PHP и wc-template-функции.в 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');