
本文详解如何扩展 woocommerce 购物车重量限制功能,支持将多个商品分类(如 'shoes'、'bags'、'accessories')归为一组,对其购物车内所有商品的总重量进行统一校验与限制,而非仅针对单个分类单独限制。
本文详解如何扩展 woocommerce 购物车重量限制功能,支持将多个商品分类(如 'shoes'、'bags'、'accessories')归为一组,对其购物车内所有商品的总重量进行统一校验与限制,而非仅针对单个分类单独限制。
在 WooCommerce 中,默认的购物车重量限制逻辑通常面向单个商品分类(product_cat)独立校验,但实际业务中常需将多个相关类目(如“易碎品”、“大件家具”、“冷链商品”)合并为一个逻辑组,统一设定该组商品在购物车中的合计最大允许重量。以下是一套经过生产验证的完整实现方案,基于原单分类限制代码升级而来,支持混合配置:既可保留原有单分类限制,又可新增多分类组合限制。
✅ 核心设计思路
- 将分类配置从字符串(如 'electronics')升级为灵活类型:支持字符串(单分类)或数组(多分类组合);
- 在遍历购物车商品时,动态识别分类类型,并分别累加对应权重;
- 对多分类组合,统一计入同一 total 计数器,再与预设阈值比对;
- 错误提示精准定位所属分组(如“‘易碎品’类目组合总重不得超过 5kg”)。
? 完整代码实现(推荐集成至主题 functions.php 或专属插件)
// 定义重量限制规则:支持单分类 & 多分类组合
$weight_restrictions = array(
// 单分类限制(保持兼容)
array(
'category' => 'fragile-items',
'limit' => 3.0, // kg
'message' => '易碎品单类总重不可超过 3kg'
),
// 多分类组合限制(核心增强)
array(
'category' => array('fragile-items', 'glassware', 'ceramics'),
'limit' => 5.0, // kg —— 组合总重上限
'message' => '易碎品类目组合(含玻璃器皿、陶瓷)总重不可超过 5kg'
),
array(
'category' => array('furniture-large', 'furniture-heavy'),
'limit' => 25.0,
'message' => '大型/重型家具总重不可超过 25kg'
)
);
// 累计各规则的当前购物车重量
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product_id = $cart_item['product_id'];
$product_weight = $cart_item['data']->get_weight() ?: 0;
$product_quantity = $cart_item['quantity'];
foreach ( $weight_restrictions as $key => &$setting ) {
$setting['total'] = isset($setting['total']) ? $setting['total'] : 0;
if ( is_array( $setting['category'] ) ) {
// 多分类组合:任一匹配即计入该组总重
foreach ( $setting['category'] as $cat_slug ) {
if ( has_term( $cat_slug, 'product_cat', $product_id ) ) {
$setting['total'] += $product_quantity * $product_weight;
break; // 匹配成功即退出内层循环,避免重复累加
}
}
} elseif ( has_term( $setting['category'], 'product_cat', $product_id ) ) {
// 单分类:直接累加
$setting['total'] += $product_quantity * $product_weight;
}
}
}
// 校验并抛出错误提示
foreach ( $weight_restrictions as $setting ) {
if ( $setting['total'] > $setting['limit'] ) {
wc_add_notice( sprintf( __( '%s — 当前购物车中该类目组合总重 %.2f kg,超出限制 %.2f kg。', 'textdomain' ),
$setting['message'],
$setting['total'],
$setting['total'] - $setting['limit']
), 'error' );
break; // 首次违规即中断,避免重复提示
}
}
⚠ 注意事项与最佳实践
- 分类 Slug 准确性:确保 has_term() 中使用的分类 slug 与后台「产品 → 分类」中 URL 别名完全一致(区分大小写);
- 重量单位统一:WooCommerce 默认以 kg 存储商品重量,若使用 g 或 lb,请先在累加前统一换算;
- 性能优化:本逻辑在 woocommerce_check_cart_items 钩子中执行(推荐),避免在页面加载时冗余计算;
- 前端体验:可配合 AJAX 实时校验(如添加商品时即时反馈),提升用户操作流畅度;
- 扩展性:如需按用户角色、地区或配送方式差异化限制,可在 $weight_restrictions 构建阶段动态注入条件逻辑。
通过此方案,您不仅能优雅支持多分类联合限重,还能无缝兼容原有单分类规则,显著提升 WooCommerce 商城在物流合规性、运费预估及用户体验方面的专业度。










