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

WooCommerce购物车重量限制如何实现多分类分组重量统计

WooCommerce购物车按分类分组合并统计重量限制实现

改造逻辑

原有单分类重量限制逻辑是遍历购物车商品时,逐个匹配商品所属分类,累加对应分类的重量后单独判断是否超限。要实现同组多分类合并统计,仅需调整三个核心部分:

  • 把原来「单分类slug=>重量上限」的一维配置,改成组级配置,每个组明确包含关联分类列表、重量上限、提示文本
  • 重量统计维度从「单分类」调整为「分组」,商品只要属于组内任意分类,重量就计入对应组的总重量
  • 校验逻辑按组遍历判断总重量,超限直接抛出对应提示,原有挂载的WooCommerce钩子不需要改动,完全兼容系统默认的提示、结算阻断流程。

完整实现代码

将代码放到当前主题的functions.php文件,或者自定义功能插件中即可生效:

// 分组规则配置 可按需增删分组
add_filter( 'woocommerce_cart_weight_limit_groups', function() {
    return [
        [
            'group_name'    => '生鲜类商品',
            'categories'    => ['fresh-fruit', 'fresh-veg', 'frozen'], // 组内分类slug,可无限追加
            'max_weight'    => 20, // 组最大重量,单位和站点WooCommerce重量设置自动适配
            'error_notice'  => '生鲜类商品单次下单总重量不能超过20kg,请调整购物车商品后再结算'
        ],
        [
            'group_name'    => '大件家居商品',
            'categories'    => ['furniture', 'large-appliance'],
            'max_weight'    => 100,
            'error_notice'  => '大件家居类商品单次下单总重量不能超过100kg,请拆分订单下单'
        ],
        // 可按上述格式继续添加更多分组
    ];
});

// 挂载购物车、结算页校验钩子
add_action( 'woocommerce_before_cart', 'cart_weight_group_validate' );
add_action( 'woocommerce_checkout_process', 'cart_weight_group_validate' );
function cart_weight_group_validate() {
    $groups = apply_filters( 'woocommerce_cart_weight_limit_groups', [] );
    if ( empty($groups) ) return;

    // 初始化每个组的累计重量
    $group_total_weights = array_fill(0, count($groups), 0);
    $cart = WC()->cart;

    // 遍历购物车商品累加对应组重量
    foreach ( $cart->get_cart() as $item ) {
        $product = $item['data'];
        $item_total_weight = wc_get_weight( (float)$product->get_weight() * $item['quantity'], 'kg' );
        
        foreach ( $groups as $idx => $group ) {
            // 商品属于组内任意分类 就累加重量到该组
            if ( has_term( $group['categories'], 'product_cat', $item['product_id'] ) ) {
                $group_total_weights[$idx] += $item_total_weight;
            }
        }
    }

    // 逐组校验重量 超限抛出提示
    foreach ( $groups as $idx => $group ) {
        if ( $group_total_weights[$idx] > $group['max_weight'] ) {
            wc_add_notice( $group['error_notice'], 'error' );
        }
    }
}

配置&调整说明

  • 分类slug可在WordPress后台「产品-分类目录」页面,编辑对应分类时在页面URL中找到,不要填写分类中文名称或者数字ID
  • 代码内置WooCommerce重量单位自动换算,不管站点后台设置的是克、磅还是其他单位,配置的max_weight统一按公斤填写即可
  • 如果商品同时属于多个分组,它的重量会同时计入所有关联分组的累计重量,满足交叉分类的统计需求
  • 如果需要兼容原有单分类限制规则,只需要给每个需要限制的单分类单独建组,组内categories参数只填该分类的slug即可,不需要额外修改逻辑
  • 不需要在购物车页显示错误提示、仅在提交结算时校验的话,直接删除add_action( 'woocommerce_before_cart', 'cart_weight_group_validate' );这行代码即可
  • 需要提示中动态显示当前实际重量、超限差值的话,可以把提示文本改成占位符格式,抛出提示时用sprintf传入动态计算的数值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:27:25