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

如何为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;
}

代码说明

  1. 参数配置:

    • $restricted_category:替换为你Cat A分类的slug(如后台分类编辑页URL中的标识)或分类ID
    • $allowed_zone_name:确保与你WooCommerce后台设置的Zone A名称完全一致
    • $target_shipping_method:保留你原代码中的配送方式ID即可
  2. 关键逻辑:

    • 通过WC_Shipping_Zones获取当前用户选择的配送区域
    • 用has_term判断购物车商品是否属于Cat A分类
    • 不符合配送规则时,移除指定配送方式;若需完全屏蔽配送选项,可直接清空$rates数组
  3. 注意事项:

    • 修改代码后,需在WooCommerce后台「设置 > 配送」页面点击「清空缓存」按钮,确保配置生效
    • 若使用多个配送方式,可扩展逻辑批量移除不符合条件的方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:52:28