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

时间:2016-04-15 05:49:17

标签: php wordpress oop 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 }
}

我想更改 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. 我试图通过functions.php来阻止gridlist_toggle_button的输出。但是如果插件在functions.php之前加载,那么要被阻止的函数已经被调用,因此它总是显示输出。
  3. 我根本不喜欢OOP。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:5)

每当$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文件中编码。在function.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

修改

我发现do_action('woocommerce_archive_description')在插件中执行woocommerce_before_shop_loop挂钩操作之前archive-product.phpwc-template-functions.php中发生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'); 。试着用这个:

ipconfig