Woocommerce:添加指定变体产品时附赠免费商品及问题修复
WooCommerce 指定变体关联免费商品的功能修复
问题说明
需求:当用户将指定变体ID数组中的产品变体加入购物车时,自动添加免费商品;移除该变体产品时,免费商品同步移除。
现有问题:
- 移除目标变体产品时,免费商品未被自动移除
- 代码运行出现错误提示
原代码问题分析
- 仅使用
woocommerce_add_to_cart钩子,该钩子仅在添加商品到购物车时触发,移除商品时不会执行逻辑,导致免费商品无法同步移除 - 未判断免费商品是否已存在,重复调用
add_to_cart()会多次添加同一免费商品 - 使用过时的
$_product->id属性,新版WooCommerce中应使用get_id()方法 - 全局
$woocommerce调用方式不够规范,推荐使用官方提供的WC()->cart
修复后的代码
add_action( 'woocommerce_cart_updated', 'sync_free_product_with_target_variations' ); function sync_free_product_with_target_variations() { // 配置参数:替换为你的目标变体ID和免费商品ID $target_variation_ids = array( 68846, 68847, 68848 ); $free_product_id = 78566; $cart = WC()->cart; $has_target_variation = false; $free_product_cart_key = ''; // 遍历购物车,检查是否存在目标变体,同时记录免费商品的购物车项key foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; // 检查是否是目标变体 if ( $product->is_type('variation') && in_array( $product->get_id(), $target_variation_ids ) ) { $has_target_variation = true; } // 检查是否是免费商品 if ( $product->get_id() === $free_product_id ) { $free_product_cart_key = $cart_item_key; } } // 根据目标变体的存在状态,同步免费商品 if ( $has_target_variation ) { // 如果免费商品不在购物车中,添加它 if ( empty( $free_product_cart_key ) ) { $cart->add_to_cart( $free_product_id ); } } else { // 如果免费商品在购物车中,移除它 if ( ! empty( $free_product_cart_key ) ) { $cart->remove_cart_item( $free_product_cart_key ); } } }
代码关键修复点
- 切换到
woocommerce_cart_updated钩子:该钩子在购物车内容发生任何变化(添加、移除商品,修改数量)时都会触发,确保移除变体时也能执行同步逻辑 - 增加重复添加判断:先检查免费商品是否已在购物车中,避免重复添加
- 使用
get_id()方法:替代过时的id属性,兼容WooCommerce 3.0+版本 - 规范调用购物车对象:使用
WC()->cart替代全局$woocommerce,符合官方开发规范 - 一次遍历完成两个检查:同时判断目标变体和免费商品的存在状态,提升代码效率
内容的提问来源于stack exchange,提问作者Eliana Alvarado
相关产品推荐
相关产品推荐

