如何让WooCommerce兼容手动输入与选择的配送州/省正确显示?
解决WooCommerce中同时兼容手动输入和选择的州/省显示问题
这个场景太常见了——WooCommerce对有预设州/省选项的国家会存储州代码,而无预设选项的国家则直接存用户手动输入的文本,咱们得把这两种情况统一处理,确保显示的都是用户能看懂的内容。
下面是修改后的代码,完美兼容两种场景:
<?php // 获取订单的配送国家代码 $shipping_country = $order->get_shipping_country(); // 获取存储的州/省数据 $custom_order_meta = get_post_meta($order->get_order_number(), '_shipping_state', true); if ( ! empty($custom_order_meta) ) { // 初始化显示用的州/省值 $state_display = $custom_order_meta; // 如果订单有国家代码,尝试匹配预设州名称 if ( ! empty($shipping_country) ) { // 获取对应国家的所有州数据(键是代码,值是官方名称) $states = WC()->countries->get_states($shipping_country); // 检查存储的州值是否是某个预设州的代码 if ( isset($states[$custom_order_meta]) ) { // 如果是代码,替换成对应的州名称 $state_display = $states[$custom_order_meta]; } } // 安全输出州/省信息 ?> <p> <?php printf( '<b>Region / Province:</b> %s', esc_html($state_display) ); ?> </p> <?php } ?>
代码逻辑拆解
- 拿国家代码做判断依据:通过
$order->get_shipping_country()获取订单的配送国家代码,这是区分"预设州代码"和"手动输入文本"的核心——不同国家的州代码是独立的,必须对应匹配。 - 自动识别并转换代码:调用
WC()->countries->get_states($shipping_country)拿到对应国家的州列表,如果存储的_shipping_state值是列表里的代码键,就自动替换成对应的州名称;如果不是,说明是用户手动输入的自定义内容,直接显示即可。 - 安全输出保障:全程用
esc_html()处理输出内容,避免XSS安全风险,完全符合WooCommerce的开发规范。
额外适配提示
- 如果需要兼容账单地址的州/省显示,只需要把
get_shipping_country()换成get_billing_country(),_shipping_state换成_billing_state就行。 - 建议定期更新WooCommerce的国家/州数据,避免出现代码和名称不匹配的情况(比如部分国家会更新行政区划)。
内容的提问来源于stack exchange,提问作者Williams
相关产品推荐
相关产品推荐

