所以我有这个插件代码
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);
它们似乎都没有用。
通过一些头脑风暴,我认为可能有两个可能的原因。
我根本不喜欢OOP。有人可以帮帮我吗?
答案 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 添加挂钩时参数必须匹配。这适用于两者 过滤器和操作。删除失败不会发出警告。
所以这应该只是为了删除动作,但是如何帮助你改变函数内部的内容呢? :
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.php和wc-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