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
相关产品推荐
相关产品推荐

