WordPress的 - 删除动作插件

问题描述:

中定义所以我有这个插件代码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几乎相同的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之前加载,那么被阻止的函数已被调用,因此它总是显示输出。

我根本不适合OOP。有人可以帮我吗?

每当$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实例化。

我假设你正在编写模板的functions.php文件。在functions.php和remove_action()之前插件正在加载,只能在发生add_action()之后才能使用。

重要提示:要删除挂钩,添加挂钩时,$ function_to_remove和$ priority 参数必须匹配。这适用于 过滤器和操作。移除失败时不会发出警告。

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

所以这应该实际上只是用于去除行动工作,但如何,可以帮助你改变函数内的内容? :您正在使用的优先级100

编辑

我发现do_action('woocommerce_archive_description')发生在archive-product.phpwc-template-functions.phpwoocommerce_before_shop_loop前右钩拳动作在插件正在执行

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

通知。尝试使用此:

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?你有没有尝试过没有优先权? – 2016-04-15 07:25:47

+0

尝试所有,30和100,并没有优先权。我认为你的观点“插件正在加载之前functions.php”是原因。因为我试图阻止gridlist_toggle_button的输出。但正如你所建议的,如果插件在functions.php之前加载,那么该函数已经被调用,因此它总是显示输出。 –