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

