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

10

所以我有这个插件代码

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');

方法三

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

似乎它们都没有起作用。

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

  1. 它不起作用是因为我想要删除的动作并没有直接附加到钩子上。 它是内部动作。
  2. 我正在尝试通过functions.php阻止gridlist_toggle_button的输出。 但如果插件在functions.php之前加载,则已经调用将被阻止的函数,因此始终会显示输出。

我不擅长面向对象编程。 有人能帮忙吗?

1个回答

6
每当实例化$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文件。插件在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
);

请注意,您使用的是优先级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');

请查看我的更新问题。我已经尝试过这种方法,但它也不起作用。 - Awais Umar
你试过优先级为30或100吗?你试过没有优先级吗? - user2917245
尝试过所有的设置,包括优先级为30和100,但是没有效果。我认为你所说的“插件在functions.php之前加载”的观点是原因所在。因为我正在尝试阻止gridlist_toggle_button的输出。但正如你所建议的,如果插件在functions.php之前加载,那么该函数已经被调用,因此它总是显示输出。 - Awais Umar
你找到了 WP_List_Grid 实例的变量名吗?它是 $WP_List_Grid 吗?因为你尝试使用 global 访问它。 - user2917245
是的,它就是$WC_List_Grid。 - Awais Umar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接