You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Woocommerce:添加指定变体产品时附赠免费商品及问题修复

WooCommerce 指定变体关联免费商品的功能修复

问题说明

需求:当用户将指定变体ID数组中的产品变体加入购物车时,自动添加免费商品;移除该变体产品时,免费商品同步移除。
现有问题:

  • 移除目标变体产品时,免费商品未被自动移除
  • 代码运行出现错误提示

原代码问题分析

  1. 仅使用woocommerce_add_to_cart钩子,该钩子仅在添加商品到购物车时触发,移除商品时不会执行逻辑,导致免费商品无法同步移除
  2. 未判断免费商品是否已存在,重复调用add_to_cart()会多次添加同一免费商品
  3. 使用过时的$_product->id属性,新版WooCommerce中应使用get_id()方法
  4. 全局$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:28