如何移除WCFM插件中使用$this绑定的商品页Ask a Question按钮?
为什么你的remove_action代码无法生效?
核心原因是执行时机不对:你在子主题的functions.php中直接编写的remove_action代码,会在WCFM插件完成初始化前就执行,此时$WCFM->wcfm_enquiry这个实例还未创建,自然无法找到要移除的action回调。
问题细节拆解
WCFM的WCFM_Enquiry类实例是在WCFM类初始化过程中创建的,而WCFM类的初始化通常晚于子主题functions.php的加载时机。你之前的代码执行时,$WCFM->wcfm_enquiry还不存在,所以remove_action找不到对应的回调函数,导致操作无效。
解决方案:延迟执行remove_action
你需要将remove_action的逻辑绑定到一个在WCFM初始化之后触发的钩子上,比如plugins_loaded(设置更高优先级确保在WCFM加载后执行),或者WCFM自身提供的wcfm_init钩子。
可行代码示例
add_action( 'plugins_loaded', 'custom_remove_wcfm_enquiry_button', 20 ); function custom_remove_wcfm_enquiry_button() { global $WCFM; // 确保WCFM的 enquiry 模块已初始化 if ( isset( $WCFM->wcfm_enquiry ) ) { remove_action( 'woocommerce_single_product_summary', array( $WCFM->wcfm_enquiry, 'wcfm_enquiry_button' ), 15 ); } }
代码说明
plugins_loaded钩子是WordPress中插件加载完成后触发的钩子,设置优先级20(高于默认的10),确保在WCFM插件初始化完成后执行。- 先判断
$WCFM->wcfm_enquiry是否存在,避免出现未定义的错误。 - 保持
remove_action的优先级(15)和add_action时一致,这是WordPress移除action的必要条件。
额外验证方案
如果上述代码仍不生效,可以尝试用WCFM官方提供的钩子wcfm_init,这个钩子是WCFM核心初始化完成后触发的,更精准:
add_action( 'wcfm_init', 'custom_remove_wcfm_enquiry_button' ); function custom_remove_wcfm_enquiry_button() { global $WCFM; if ( isset( $WCFM->wcfm_enquiry ) ) { remove_action( 'woocommerce_single_product_summary', array( $WCFM->wcfm_enquiry, 'wcfm_enquiry_button' ), 15 ); } }
内容的提问来源于stack exchange,提问作者Aurélien
相关产品推荐
相关产品推荐

