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

如何在WooCommerce结账区块隐藏GB配送郡,仅留北爱6郡并保留账单全郡

解决方案:仅在配送区域限制英国(GB)为北爱尔兰郡

你之前的代码无法满足需求,核心原因是woocommerce_states是全局钩子,会同时修改账单和配送区域的州/郡列表,导致账单区域的GB郡也被隐藏。要实现「配送区域仅显示北爱尔兰6个郡,账单区域保留全部GB郡」的需求,需要针对配送区域的州字段单独处理。

正确代码实现

以下代码会仅对配送地址的州字段生效,当用户选择配送国家为英国(GB)时,自动替换为北爱尔兰的6个郡,账单区域不受任何影响:

add_filter( 'woocommerce_form_field_args', 'custom_restrict_shipping_gb_to_ni', 20, 3 );
function custom_restrict_shipping_gb_to_ni( $args, $key, $value ) {
    // 仅处理配送州字段
    if ( 'shipping_state' !== $key ) {
        return $args;
    }

    // 获取当前用户选择的配送国家(未选择时使用店铺默认国家)
    $shipping_country = WC()->customer->get_shipping_country();
    if ( empty( $shipping_country ) ) {
        $default_country = get_option( 'woocommerce_default_country' );
        $shipping_country = explode( ':', $default_country )[0];
    }

    // 当配送国家为GB时,替换为北爱尔兰的6个郡
    if ( 'GB' === $shipping_country ) {
        $args['options'] = array(
            '' => __( 'Select a county', 'woocommerce' ),
            'AN' => __( 'Antrim', 'woocommerce' ),
            'AM' => __( 'Armagh', 'woocommerce' ),
            'DOW' => __( 'Down', 'woocommerce' ),
            'FER' => __( 'Fermanagh', 'woocommerce' ),
            'LON' => __( 'Londonderry', 'woocommerce' ),
            'TYR' => __( 'Tyrone', 'woocommerce' ),
        );
    }

    return $args;
}

代码说明

  • 钩子woocommerce_form_field_args用于修改单个结账字段的参数,我们通过$key === 'shipping_state'精准定位配送州字段。
  • 动态判断当前配送国家,仅在选择GB时替换选项,其他国家保持默认的州/郡列表。
  • 保留了默认的「Select a county」占位选项,符合WooCommerce的交互逻辑。
  • 账单区域的州字段完全不受影响,仍会显示全部GB郡。

注意事项

  • 将代码添加到你的主题functions.php文件,或使用自定义代码插件(如Code Snippets)。
  • 对于WooCommerce Checkout Block(块式结账),该代码同样适用,因为块式结账会调用WooCommerce核心的字段渲染钩子。

内容的提问来源于stack exchange,提问作者Richard McClung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:20:13