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

WooCommerce email-header.php模板获取订单对象及订单项失败求助

解决WooCommerce email-header.php中$order为空的问题

我来帮你排查这个问题!在WooCommerce的email-header.php里拿不到$order变量,大概率是因为这个模板的上下文里默认没有传递这个变量——毕竟它主要负责渲染邮件的头部区域,不像订单详情类的模板会直接把订单对象传进来。下面给你几个可行的解决办法:

方法1:通过全局变量获取订单对象

WooCommerce在发送邮件时,$order通常会作为全局变量存在,你可以在email-header.php的开头先声明全局变量,再做有效性判断:

// 在email-header.php开头添加
global $order;

// 先确认$order是有效的WC_Order对象
if ( isset( $order ) && is_a( $order, 'WC_Order' ) ) {
    // 获取订单项
    $order_items = $order->get_items();
    // 用var_dump查看详细信息,或者写入服务器日志更方便排查
    var_dump($order_items);
    // error_log( print_r( $order_items, true ) ); // 写入日志的方式
}

方法2:通过邮件对象获取订单

如果全局变量的方式不生效,你还可以通过$email对象来获取订单——WooCommerce的邮件模板里都会存在这个$email实例,订单对象会存储在它的object属性中:

// 在email-header.php开头添加
global $email;

// 验证邮件对象和订单对象的有效性
if ( isset( $email ) && is_a( $email, 'WC_Email' ) 
     && isset( $email->object ) && is_a( $email->object, 'WC_Order' ) ) {
    $order = $email->object;
    $order_items = $order->get_items();
    print_r($order_items);
}

重要注意事项

  • 不要直接修改核心模板:一定要把email-header.php复制到你的主题目录下的woocommerce/emails/文件夹里再修改,这样WooCommerce更新时不会覆盖你的自定义内容。
  • 测试场景要正确:不要直接在浏览器里访问这个模板文件,那样没有任何邮件上下文,$order肯定是空的。你需要在后台创建测试订单,触发对应的邮件(比如“处理中订单”邮件),再查看邮件内容或服务器日志。
  • 优先用日志排查:邮件里的print_r输出可能因为渲染规则被隐藏,建议用error_log()把内容写到服务器日志里,更方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:18:12