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

如何在WooCommerce购物车加入酒箱时移除单瓶酒最低购买3瓶的限制

问题根源

你的代码无法生效有两个核心原因:

  • 钩子选择错误:woocommerce_after_cart_contents是购物车页面前端内容渲染完成后才触发的钩子,此时WooCommerce的商品购买数量校验逻辑已经执行完毕,仅清除通知无法从根源绕过校验规则。
  • 逻辑缺失:仅清理错误通知没有修改最低购买数量的核心校验逻辑,自然无法通过结算前置校验,也不能跳过数量限制。

实现方案

我们可以通过钩子直接覆盖WooCommerce的最低购买数量规则,只要检测到购物车存在BOX分类的商品,就自动取消所有商品的最低购买限制,完整可运行代码如下:

// 辅助函数:判断当前购物车是否包含BOX分类商品
function wc_cart_has_box_product() {
    // 后台非AJAX请求不执行
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return false;
    if ( empty( WC()->cart ) ) return false;
    
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        // 此处用分类别名判断比分类名称更稳定,避免后台修改分类名后逻辑失效
        if ( has_term( 'box', 'product_cat', $product_id ) ) {
            return true;
        }
    }
    return false;
}

// 覆盖商品最低购买数量规则
add_filter( 'woocommerce_product_get_min_purchase_quantity', 'custom_remove_min_qty_when_has_box', 999, 2 );
add_filter( 'woocommerce_product_variation_get_min_purchase_quantity', 'custom_remove_min_qty_when_has_box', 999, 2 );
function custom_remove_min_qty_when_has_box( $min_qty, $product ) {
    // 购物车存在BOX商品时,所有商品最低购买量设为1(即无最低限制)
    if ( wc_cart_has_box_product() ) {
        return 1;
    }
    return $min_qty;
}

// 绕过添加到购物车时的最低数量校验
add_filter( 'woocommerce_add_to_cart_validation', 'custom_bypass_min_qty_validation_when_has_box', 999, 4 );
function custom_bypass_min_qty_validation_when_has_box( $passed, $product_id, $quantity, $variation_id = 0 ) {
    // 购物车有BOX商品,或当前添加的是BOX商品时,直接跳过原有最低数量校验
    if ( wc_cart_has_box_product() || has_term( 'box', 'product_cat', $product_id ) ) {
        return true;
    }
    return $passed;
}

注意事项

  • 如果你的BOX分类的别名不是box,请将代码中has_term的第一个参数替换为你后台对应分类的实际别名
  • 钩子优先级设置为999,确保晚于你原有添加最低3瓶校验的钩子执行,才能正常覆盖原有规则
  • 原有代码可以完全删除,无需保留

你提到的效果示意图如下:
效果示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:36:00