WooCommerce按商品分类独立设置购物车重量限制的实现方案
WooCommerce 按商品分类独立限制购物车重量实现方案
你之前写的全站总重量限制逻辑基础没问题,要实现分类独立限重,必须先遍历购物车商品,按所属分类单独累计重量后再做阈值校验。之前直接写if ( $category = "Category 1")不生效有两个核心原因:一是没有遍历购物车提取每个商品的分类属性,$category变量本身是空的;二是单等号是赋值操作,不是相等判断,且WooCommerce商品分类不能直接通过全局变量读取,需要通过商品ID调用WordPress原生分类查询函数获取。
可直接落地的代码
把下面代码替换你原来functions.php里的限重代码即可,注释位置可以自行调整分类限重规则:
add_action('woocommerce_check_cart_items','check_cart_weight_by_category'); function check_cart_weight_by_category(){ global $woocommerce; // 分类限重规则配置:键填商品分类slug,值填对应分类允许的单订单最大重量(单位和后台设置的重量单位一致) $category_weight_limits = [ 'category-1' => 30, // 分类1 限重30g,请替换为你站点实际的分类slug 'category-2' => 38.34, // 分类2 限重38.34g 'category-3' => 50, // 分类3 限重50g 'category-4' => 100, // 分类4 限重100g ]; $category_weight_stats = []; // 遍历购物车所有商品,按分类累计重量 foreach( $woocommerce->cart->get_cart() as $cart_item ){ $product = $cart_item['data']; $item_total_weight = floatval($product->get_weight()) * $cart_item['quantity']; // 获取当前商品关联的商品分类slug $product_cats = wp_get_post_terms($cart_item['product_id'], 'product_cat', ['fields' => 'slugs']); // 匹配配置了限重规则的分类,累加重量 foreach($product_cats as $cat_slug){ if(isset($category_weight_limits[$cat_slug])){ $category_weight_stats[$cat_slug] = isset($category_weight_stats[$cat_slug]) ? $category_weight_stats[$cat_slug] + $item_total_weight : $item_total_weight; } } } // 逐个校验分类重量,超重就抛出错误提示阻止结算 foreach($category_weight_stats as $cat_slug => $total_weight){ $limit = $category_weight_limits[$cat_slug]; if($total_weight > $limit){ $cat_info = get_term_by('slug', $cat_slug, 'product_cat'); wc_add_notice( sprintf( __('分类「%s」下商品总重量为%sg,该分类单订单最高允许重量为%sg,请调整购物车商品后再提交订单。', 'woocommerce'), $cat_info->name, $total_weight, $limit ), 'error' ); } } }
配置说明
- 优先用分类slug做规则匹配键,不要直接用分类名,后续修改分类名称不会导致限重规则失效
- 重量统计已经自动乘以商品购买数量,不需要额外处理多件购买的重量计算
- 若单个商品同时归属多个配置了限重规则的分类,会分别计入对应分类的重量统计,各分类重量独立计算互不干扰
- 如果需要用分类ID配置规则,只需要把获取分类的参数改成返回ID,规则数组的键换成对应分类ID即可
内容的提问来源于stack exchange,提问作者speshock
相关产品推荐
相关产品推荐

