
本文介绍如何正确获取并显示 WooCommerce 订单的收货州/省(shipping state)到「新订单通知邮件」的主题行中,解决因 API 变更导致的 shipping_state 获取失败问题。
本文介绍如何正确获取并显示 woocommerce 订单的收货州/省(shipping state)到「新订单通知邮件」的主题行中,解决因 api 变更导致的 `shipping_state` 获取失败问题。
在 WooCommerce 3.0+ 版本中,订单对象的属性访问方式已全面转向面向对象的 getter 方法,原始的 $order->shipping_state 直接属性访问已被弃用,若继续使用将返回空值或触发未定义属性警告。正确做法是调用 $order->get_shipping_state() 方法——该方法会自动处理数据标准化(如返回两位缩写码 CA、NY 或本地化名称),并兼容地址格式配置。
以下是经过验证的完整解决方案:
function filter_woocommerce_email_subject_new_order( $subject, $order ) {
// 安全获取收货州/省,兼容空值与无效订单
$shipping_state = $order && is_a( $order, 'WC_Order' )
? $order->get_shipping_state()
: '';
// 仅当州/省存在时才更新主题,避免生成空白或不完整标题
if ( ! empty( $shipping_state ) ) {
$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
// 使用国际化函数确保多语言站点兼容性
$subject = sprintf(
__( '%s: Commande pour %s', 'woocommerce' ),
$blogname,
$shipping_state
);
}
return $subject;
}
add_filter( 'woocommerce_email_subject_new_order', 'filter_woocommerce_email_subject_new_order', 10, 2 );
关键注意事项:
- ✅ 优先使用
get_shipping_state():它比旧属性访问更可靠,且自动适配WC_Countries::get_states()映射规则; - ✅ 务必检查
$order对象有效性:钩子可能在某些异常流程中传入非WC_Order实例,需防御性判断; - ✅ 避免硬编码语言:使用
__()包裹字符串,便于主题/插件翻译; - ❌ 不要依赖
wp_get_current_user():新订单邮件触发时用户可能未登录(如访客下单),shipping_state属于订单数据而非用户元数据; - ❌ 无需
global $woocommerce:现代 WooCommerce 已移除该全局变量,引用无实际作用。
此外,若需进一步增强可读性(例如显示州全名而非缩写),可结合 WC()->countries->get_states() 进行映射:
$states = WC()->countries->get_states( $order->get_shipping_country() );
$display_state = isset( $states[ $shipping_state ] )
? $states[ $shipping_state ]
: $shipping_state;
将 $display_state 替换原代码中的 $shipping_state 即可实现友好显示。最终效果示例:MyShop: Commande pour California。










