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

WooCommerce基于结账自定义选择字段限制配送方式的实现问题

WooCommerce 自定义字段限制配送方式解决方案

你之前的代码不生效核心有两个原因:

  • WooCommerce 默认不会将自定义结账字段自动加入配送包的 destination 数组,直接读取对应字段为空
  • 你原有 woocommerce_package_rates 钩子代码中,字段读取语句末尾缺少分号,存在语法错误

完整可用实现代码

// 存储用户提交的自定义区域字段到会话
add_action( 'woocommerce_checkout_update_order_review', 'save_sofiq_kvartal_to_session' );
function save_sofiq_kvartal_to_session( $posted_data ) {
    parse_str( $posted_data, $output );
    if ( isset( $output['sofiq_kvartal'] ) ) {
        WC()->session->set( 'sofiq_kvartal', wc_clean( $output['sofiq_kvartal'] ) );
    }
}

// 根据自定义区域字段限制配送方式
add_filter( 'woocommerce_package_rates', 'filter_shipping_methods_by_kvartal', 10, 2 );
function filter_shipping_methods_by_kvartal( $rates, $package ) {
    // 优先读取最新提交的字段值,无提交则读取会话存储值
    $kvartal = isset( $_POST['sofiq_kvartal'] ) ? wc_clean( $_POST['sofiq_kvartal'] ) : WC()->session->get( 'sofiq_kvartal' );
    
    // 未选择区域时直接返回原有配送方式
    if ( empty($kvartal) ) {
        return $rates;
    }

    // 区域1配置:选择对应区域时禁用 flat_rate:6 配送方式
    $zona_1_ids = ["0", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"];
    if ( in_array( $kvartal, $zona_1_ids ) ) {
        unset( $rates['flat_rate:6'] );
    }

    // 可在此扩展其他区域的配送限制逻辑
    // $zona_2_ids = [20,44,45];
    // if ( in_array( $kvartal, $zona_2_ids ) ) {
    //     unset( $rates['xxx'] );
    // }

    return $rates;
}

// 可选:如果需要将自定义字段永久加入配送包 destination 数组,可添加以下代码
add_filter( 'woocommerce_calculated_shipping_packages', 'add_kvartal_to_shipping_package_destination' );
function add_kvartal_to_shipping_package_destination( $packages ) {
    $kvartal = WC()->session->get( 'sofiq_kvartal' );
    if ( !empty($kvartal) ) {
        foreach ( $packages as $key => $package ) {
            $packages[$key]['destination']['sofiq_kvartal'] = $kvartal;
        }
    }
    return $packages;
}

生效注意事项

WooCommerce 会默认缓存配送方式计算结果,代码部署后需要执行以下操作清空缓存才能正常测试:

  • 进入后台「WooCommerce - 状态 - 工具」
  • 点击「清空购物车缓存」和「清空配送缓存」
  • 测试时建议使用浏览器隐身窗口,避免本地缓存影响

内容的提问来源于stack exchange,提问作者Vladimir Kyatipov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:54:05