调整WooCommerce单产品页Product Variations位置报错求助
问题分析与解决方案
报错原因
woocommerce_variable_add_to_cart是WooCommerce专为**可变产品(带变体)**设计的函数,它依赖可变产品的变体数据逻辑。你当前的代码在init钩子(全局初始化阶段)就执行了移除和添加动作,没有做产品类型判断,导致所有产品页面都会加载这个函数。对于无变体的简单产品来说,既不需要这个函数,执行时还会因为缺少变体相关数据/上下文直接报错。
修复代码
把代码改成带产品类型判断的版本,并且换到更合适的钩子(确保能获取到当前产品数据):
function move_linked_variation_options() { // 仅在单个产品页面且当前产品是可变产品时执行 if ( is_product() && wc_get_product()->is_type('variable') ) { remove_action('woocommerce_variable_add_to_cart', 'woocommerce_variable_add_to_cart', 30); add_action('woocommerce_single_product_summary', 'woocommerce_variable_add_to_cart', 15); // 优先级设为15是因为:Title优先级5,Price优先级10,Short Description优先级20,这样刚好插在Price和Short Description之间 } } // 用template_redirect钩子,此时产品数据已加载,能准确判断产品类型 add_action('template_redirect', 'move_linked_variation_options');
补充说明
- 把钩子从
init换成template_redirect,因为init阶段当前产品的信息还未加载,无法判断产品类型; - 调整优先级为15,刚好卡在Price(优先级10)和Short Description(优先级20)之间,完全符合你的需求;
- 增加
is_product()和is_type('variable')的双重判断,确保只有可变产品的详情页才会执行位置调整,避免影响其他类型产品。
内容的提问来源于stack exchange,提问作者Slaveworx
相关产品推荐
相关产品推荐

