WooCommerce积分奖励插件产品变体消息移除失败,需调整显示位置
解决WooCommerce Points and Rewards插件动作移除失效的问题
我懂你遇到的困扰了——直接用remove_action指定函数名完全没效果,这是因为插件里的动作是绑定到类实例上的,不是全局函数,所以得换个方式处理。下面一步步帮你搞定:
为什么你的移除代码没生效?
看插件的__construct方法,动作是这么添加的:
add_action( 'woocommerce_before_add_to_cart_button', array( $this, 'add_variation_message_to_product_summary' ), 25 );
这里的$this是WC_Points_Rewards_Product类的实例,移除动作时必须用同一个实例来调用remove_action,光写函数名根本找不到对应的绑定关系。
正确的移除+重新定位代码
要实现把变体消息移到价格下方,你需要先移除原动作,再把同一个方法绑定到新的钩子上。直接用下面的代码就行:
add_action( 'plugins_loaded', 'adjust_points_rewards_variation_message', 20 ); function adjust_points_rewards_variation_message() { // 获取插件的产品类实例 if ( class_exists( 'WC_Points_Rewards' ) && isset( WC_Points_Rewards::instance()->product ) ) { $points_product_instance = WC_Points_Rewards::instance()->product; // 移除原位置的动作 remove_action( 'woocommerce_before_add_to_cart_button', array( $points_product_instance, 'add_variation_message_to_product_summary' ), 25 ); // 添加到新位置:价格下方(woocommerce_single_product_summary钩子,优先级20,刚好在价格之后) add_action( 'woocommerce_single_product_summary', array( $points_product_instance, 'add_variation_message_to_product_summary' ), 20 ); } }
关键细节说明
- 时机要对:用
plugins_loaded钩子且设置优先级20(插件自身初始化优先级通常是10),确保我们在插件完成实例化后再执行移除操作,不然找不到目标实例。 - 实例匹配:通过
WC_Points_Rewards::instance()->product获取插件里的WC_Points_Rewards_Product实例,这是插件官方的单例访问方式,保证和添加动作时的实例完全一致。 - 新钩子选择:
woocommerce_single_product_summary是产品详情页的核心钩子,优先级20刚好卡在价格(优先级10)和添加到购物车按钮(优先级30)之间,完美符合你要移到价格下方的需求。
测试验证
把这段代码加到你的主题functions.php文件里,或者自定义插件中,刷新产品详情页就能看到变体消息的位置已经变了。如果还有问题,可以检查:
- 插件是否正常激活,类名有没有拼写错误
- 钩子优先级可以微调(比如改成25)来调整消息的具体位置
内容的提问来源于stack exchange,提问作者blackhill24
相关产品推荐
相关产品推荐

