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

