
本文介绍如何通过自定义钩子精准修改 WooCommerce 后台新订单邮件的主题行,将订单总金额(如“$129.99”)实时嵌入邮件标题,解决 {order_total} 占位符不生效的问题,并提供稳定、兼容新版 WooCommerce 的实现方案。
本文介绍如何通过自定义钩子精准修改 woocommerce 后台新订单邮件的主题行,将订单总金额(如“$129.99”)实时嵌入邮件标题,解决 `{order_total}` 占位符不生效的问题,并提供稳定、兼容新版 woocommerce 的实现方案。
WooCommerce 默认不支持在邮件主题中使用 {order_total} 这类占位符——该语法仅适用于邮件正文模板中的 woocommerce_email_format_string 过滤器,而邮件主题(subject)是独立处理的,需使用专用的 subject 钩子。原代码失败的核心原因有三点:一是错误复用了 woocommerce_email_format_string 过滤器(它不处理 subject),二是变量名拼写错误($additional_placeholders 未定义,应为 $new_placeholders),三是直接操作 _order_total 元字段属冗余操作——WooCommerce 的 WC_Order 对象已内置安全、格式化的方法获取订单总金额。
✅ 正确做法是使用专用于新订单邮件主题的过滤器:woocommerce_email_subject_new_order。该钩子接收两个参数:原始主题字符串 $subject 和 WC_Order 实例 $order,可直接调用 $order->get_formatted_order_total() 获取含货币符号、本地化格式的总金额(如 ¥899.00 或 $149.99),避免手动读取元数据带来的兼容性与格式风险。
以下是推荐使用的完整代码(兼容 WooCommerce 6.0+,支持 HPOS):
add_filter('woocommerce_email_subject_new_order', 'customize_new_order_email_subject', 10, 2);
function customize_new_order_email_subject($subject, $order) {
// 获取格式化后的订单总金额(自动包含货币符号和千分位)
$formatted_total = $order->get_formatted_order_total();
// 构建新主题:保留默认结构,插入总金额
$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
$subject = sprintf(
'[%s] 新订单 #%d — %s(%s)来自 %s %s',
$blogname,
$order->get_id(),
$formatted_total,
$order->get_status_name(),
$order->get_billing_first_name(),
$order->get_billing_last_name()
);
return $subject;
}? 注意事项:
- 将代码添加至当前启用子主题的 functions.php 文件中,切勿修改父主题或 wp-config.php;
- 若使用高性能订单存储(HPOS),$order->get_id() 和 $order->get_formatted_order_total() 均完全兼容,无需额外适配;
- 如需纯数字金额(不含货币符号),请改用 $order->get_total(),但需自行格式化(例如 wc_price($order->get_total()));
- 修改后务必在 WooCommerce → 状态 → 工具 中点击 “重发测试邮件” 验证效果,避免依赖缓存导致误判。
此方案简洁、健壮且符合 WooCommerce 官方最佳实践,既规避了占位符解析陷阱,又确保金额显示准确、本地化友好,是生产环境推荐的标准实现方式。

















