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

Woocommerce指定类目满额赠礼代码问题:满$50未触发赠礼

WooCommerce 指定类目满额赠礼代码修复

我们的WooCommerce店铺计划为指定类目每消费满$50的买家赠送免费礼品,当前在functions.php中使用的代码虽可运行但存在缺陷:当用户消费$50.50、$51或$52等刚达标或略超$50的金额时,系统未将免费礼品加入购物车,仅当消费金额达$57及以上或增加商品数量时才触发赠礼。核心问题是代码未在满$50的目标消费额时触发添加1份免费礼品的逻辑。

问题根源

  • 赋值运算符错误:代码中if($cart_item['product_id']=$product_gifted_id)使用了赋值符号=而非比较符号==,导致统计已有赠品数量的逻辑完全失效。
  • 金额计算偏差:使用line_total计算可能受折扣、优惠券影响,且钩子执行时机过早,导致金额统计不准确。
  • 边界逻辑遗漏:刚好满$50的场景下,因上述错误导致赠品数量判断异常,无法触发添加逻辑。

修正后的完整代码

// Free Gift - Auto Add To Cart //
add_action('woocommerce_before_calculate_totals', 'freegift_q12024', 20, 1); // 提高优先级确保金额计算准确

function freegift_q12024($cart_object) {
    // 后台非AJAX请求直接返回
    if (is_admin() && !defined('DOING_AJAX')) return;

    $category_slugs = array('categoryA', 'categoryB', 'categoryC', 'categoryD', 'categoryE', 'categoryF'); // 指定类目别名
    $gift_product_id = 54657; // 赠品ID
    $gift_threshold = 50; // 满赠门槛金额
    $eligible_total = 0; // 指定类目商品消费总额(不含赠品)
    $existing_gift_qty = 0; // 购物车中已有赠品数量

    // 遍历购物车计算符合条件的消费总额与已有赠品数量
    foreach ($cart_object->get_cart() as $cart_item) {
        $product_id = $cart_item['product_id'];
        // 检查是否属于指定类目
        if (has_term($category_slugs, 'product_cat', $product_id)) {
            if ($product_id !== $gift_product_id) {
                // 累加指定类目商品的金额(使用line_subtotal避免折扣影响)
                $eligible_total += $cart_item['line_subtotal'];
            } else {
                // 统计已有赠品数量
                $existing_gift_qty = $cart_item['quantity'];
            }
        }
    }

    // 计算应得赠品数量:满$50得1份,满$100得2份,以此类推
    $desired_gift_qty = max(0, floor($eligible_total / $gift_threshold));

    // 调整购物车中的赠品数量
    if ($existing_gift_qty !== $desired_gift_qty) {
        // 生成赠品的购物车ID
        $gift_cart_id = $cart_object->generate_cart_id($gift_product_id);
        $gift_in_cart = $cart_object->find_product_in_cart($gift_cart_id);

        // 如果已有赠品,先移除
        if ($gift_in_cart) {
            $cart_object->remove_cart_item($gift_in_cart);
        }

        // 如果应得赠品数量大于0,添加对应数量的赠品
        if ($desired_gift_qty > 0) {
            $cart_object->add_to_cart($gift_product_id, $desired_gift_qty);
        }
    }

    // 设置赠品价格为0
    if ($desired_gift_qty > 0) {
        foreach ($cart_object->get_cart() as $cart_item) {
            if ($cart_item['product_id'] === $gift_product_id) {
                $cart_item['data']->set_price(0);
                $cart_item['data']->set_regular_price(0);
                $cart_item['data']->set_sale_price(0); // 确保促销价也为0
            }
        }
    }
}

// Free Gift - Disable remove from cart //
add_filter('woocommerce_cart_item_remove_link', 'freegift_q12024_noremovefromcart', 20, 2);
function freegift_q12024_noremovefromcart($button_link, $cart_item_key) {
    $targeted_product_ids = array(54657); // 赠品ID
    $cart_item = WC()->cart->get_cart()[$cart_item_key];

    // 隐藏赠品的删除按钮
    if (in_array($cart_item['data']->get_id(), $targeted_product_ids)) {
        $button_link = '';
    }

    return $button_link;
}

关键修正说明

  1. 修复赋值错误:将错误的赋值语句改为严格比较$product_id === $gift_product_id,正确统计购物车中已有赠品数量。
  2. 优化金额计算:使用line_subtotal替代line_total,避免折扣、优惠券等因素干扰满额判断;同时提高钩子优先级到20,确保在WooCommerce完成基础金额计算后再执行赠礼逻辑。
  3. 完善价格设置:新增set_sale_price(0),确保赠品无论处于常规价还是促销价状态,都显示为免费。
  4. 边界场景处理:确保刚好满$50时,floor(50/50)=1,正确触发添加1份赠品的逻辑,解决刚达标时不赠礼的问题。

内容的提问来源于stack exchange,提问作者moonfolk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:47:20