WordPress - 删除插件类中定义的操作

Awa*_*mar 9 php oop wordpress woocommerce

所以我有这个插件代码

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 }
}
Run Code Online (Sandbox Code Playgroud)

我想更改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 }
}
Run Code Online (Sandbox Code Playgroud)

这样,我就不必直接更改插件文件了

为此,我试图删除其相关的行动.

add_action( 'woocommerce_before_shop_loop', array( $this, 'gridlist_toggle_button' ), 30);
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用自己的代码了.但我似乎无法删除此操作.到目前为止我已经尝试过了.

方法1:

global $WC_List_Grid    ;
remove_action( 'woocommerce_before_shop_loop', array( $WC_List_Grid, 'gridlist_toggle_button' ), 100);  
Run Code Online (Sandbox Code Playgroud)

方法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');
Run Code Online (Sandbox Code Playgroud)

方法3

remove_action( 'woocommerce_before_shop_loop', array( 'WC_List_Grid', 'gridlist_toggle_button' ), 100); 
Run Code Online (Sandbox Code Playgroud)

他们似乎都没有工作.

通过一些头脑风暴,我认为可能有两个可能的原因.

  1. 它不起作用,因为我想删除的动作不直接附加到钩子上.它的行动在行动中.
  2. 我试图通过functions.php来阻止gridlist_toggle_button的输出.但是如果插件在functions.php之前加载,那么要被阻挡的函数已经被调用,因此它总是显示输出.

我根本不喜欢OOP.有人可以帮帮我吗?

小智 6

每当$wc_lg = new WC_List_Grid()实例化时,它都会触发wp钩子.在设置全局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和$ priority参数必须在添加钩子时匹配.这适用于过滤器和操作.删除失败不会发出警告.

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

所以这应该只是为了删除动作,但是这有助于你改变函数内部的内容?:

remove_action(
    'woocommerce_before_shop_loop',
    array('WC_List_Grid', 'gridlist_toggle_button'),
    30
);
Run Code Online (Sandbox Code Playgroud)

请注意,您使用的是优先级100

编辑

我发现在插件中执行钩子动作之前,do_action('woocommerce_archive_description')archive-product.phpwc-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');
Run Code Online (Sandbox Code Playgroud)