如何在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
相关产品推荐
相关产品推荐

