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)
他们似乎都没有工作.
通过一些头脑风暴,我认为可能有两个可能的原因.
我根本不喜欢OOP.有人可以帮帮我吗?
小智 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参数必须在添加钩子时匹配.这适用于过滤器和操作.删除失败不会发出警告.
所以这应该只是为了删除动作,但是这有助于你改变函数内部的内容?:
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.php和wc-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)
| 归档时间: |
|
| 查看次数: |
4659 次 |
| 最近记录: |