如何为WooCommerce特定配送区域设置专属产品分类配送权限
解决方案
原代码存在三个核心问题:仅针对单个产品ID判断、未结合配送区域做条件校验、逻辑方向与需求相反。以下是适配需求的修改版代码:
add_filter( 'woocommerce_package_rates', 'restrict_category_shipping_by_zone', 10, 2 ); function restrict_category_shipping_by_zone( $rates, $package ) { // 配置参数,根据实际情况修改 $restricted_category = 'cat-a'; // Cat A分类的slug或ID $allowed_zone_name = 'Zone A'; // 允许配送Cat A的区域名称 $target_shipping_method = 'wbs:14:0dd3bc79_weight_based_shipping'; // 目标配送方式ID $has_restricted_product = false; // 获取当前配送区域名称 $current_zone = WC_Shipping_Zones::get_zone_by( 'instance_id', $package['shipping_method_id'] ); $current_zone_name = $current_zone->get_zone_name(); // 检查购物车是否包含Cat A分类的产品 foreach( $package['contents'] as $cart_item ) { if ( has_term( $restricted_category, 'product_cat', $cart_item['product_id'] ) ) { $has_restricted_product = true; break; } } // 核心逻辑:有Cat A产品且当前区域非Zone A时,移除指定配送方式 if ( $has_restricted_product && $current_zone_name !== $allowed_zone_name ) { if ( isset( $rates[$target_shipping_method] ) ) { unset( $rates[$target_shipping_method] ); } // 若需要完全禁止配送(无任何配送选项),取消下面注释 // $rates = array(); } return $rates; }
代码说明
参数配置:
$restricted_category:替换为你Cat A分类的slug(如后台分类编辑页URL中的标识)或分类ID$allowed_zone_name:确保与你WooCommerce后台设置的Zone A名称完全一致$target_shipping_method:保留你原代码中的配送方式ID即可
关键逻辑:
- 通过
WC_Shipping_Zones获取当前用户选择的配送区域 - 用
has_term判断购物车商品是否属于Cat A分类 - 不符合配送规则时,移除指定配送方式;若需完全屏蔽配送选项,可直接清空
$rates数组
- 通过
注意事项:
- 修改代码后,需在WooCommerce后台「设置 > 配送」页面点击「清空缓存」按钮,确保配置生效
- 若使用多个配送方式,可扩展逻辑批量移除不符合条件的方式
内容的提问来源于stack exchange,提问作者The ILP
相关产品推荐
相关产品推荐

