WooCommerce统计昨日订单调用wp_mail发邮件失败如何排查
问题排查与修复方案
代码中的明确错误
- 累加逻辑完全无效:现有代码中
$eachordersubtotal + $subtotal;仅做了数值计算但没有赋值回统计变量,导致三个统计金额永远为0,应该改为$subtotal += $eachordersubtotal;,小费、税费的累加同理修正。 - WooCommerce方法调用错误:首先不存在
get_taxxes()方法,获取订单总税费应使用$order->get_total_tax();其次get_fees()返回的是订单所有额外费用的数组,不能直接和数值相加,需要遍历数组取出gratuity对应的金额再累加。 - 语法错误导致代码中断:
$body = $subtotalstring, $gratuitystring, $taxxesstring;为非法赋值,只会把最后一个变量赋值给$body,需要用字符串拼接符.把三个内容拼接成完整的邮件正文。if ( count( $orders ) )的闭合大括号缺失,wp_mail($to, $subject, $body)语句末尾缺失分号,会直接触发PHP语法错误,代码无法运行到发邮件步骤。- 定义了设置HTML邮件类型的函数但未挂载到WordPress过滤器,该函数完全不生效。
- 订单查询逻辑有缺陷:
date_created仅传入日期字符串可能受WordPress时区配置影响,拿不到正确的昨日订单,若查询结果为空,后续发邮件逻辑完全不会执行。
修复后的完整代码
<?php define('WP_USE_THEMES', false); require( dirname( __FILE__ ) . '/wp-load.php' ); // 验证WooCommerce已加载 if (!function_exists('wc_get_orders')) { die('WooCommerce未初始化'); } // 匹配WordPress后台设置的时区 date_default_timezone_set(wp_timezone_string()); $yesterday_start = strtotime('yesterday 00:00:00'); $yesterday_end = strtotime('yesterday 23:59:59'); $args = array( 'date_created' => $yesterday_start . '...' . $yesterday_end, 'limit' => -1 // 不分页取出所有符合条件的订单 ); $orders = wc_get_orders( $args ); $subtotal = 0.0; $gratuity = 0.0; $tax_total = 0.0; if ( count( $orders ) > 0 ) { foreach ( $orders as $order ) { // 累加商品小计 $subtotal += $order->get_subtotal(); // 累加总税费 $tax_total += $order->get_total_tax(); // 累加小费(gratuity) foreach ($order->get_fees() as $fee) { // 若你的小费费用标识不是gratuity可根据实际情况调整判断条件 if ($fee->get_name() == 'gratuity') { $gratuity += $fee->get_amount(); } } } $subtotalstring = sprintf("%.2f", $subtotal); $gratuitystring = sprintf("%.2f", $gratuity); $taxstring = sprintf("%.2f", $tax_total); $to = 'myname@myemail.com'; $subject = '昨日订单统计'; $body = "昨日订单统计如下:<br> 商品小计:{$subtotalstring}<br> 小费:{$gratuitystring}<br> 税费:{$taxstring}"; $headers = array('Content-Type: text/html; charset=UTF-8'); // 输出发送结果用于调试 $send_result = wp_mail($to, $subject, $body, $headers); var_dump($send_result); } else { echo "昨日无订单"; } ?>
额外排查建议
- 先测试基础发信功能:单独执行
var_dump(wp_mail('你的测试邮箱', '测试邮件', '测试内容'));,如果返回false,说明WordPress发信功能本身异常,可安装SMTP插件配置第三方发信服务解决。 - 开启WordPress调试模式:在wp-config.php中添加如下配置,运行代码后查看wp-content/debug.log文件中的报错信息定位问题:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
- 验证路径正确性:如果直接运行该PHP文件,确认wp-load.php的路径正确,避免WordPress核心未加载导致函数缺失。
- 检查邮件垃圾箱:若wp_mail返回true但没收到邮件,优先查看邮箱的垃圾箱,未配置SPF、DKIM的发件人很容易被判定为垃圾邮件。
内容的提问来源于stack exchange,提问作者GGNoEffort
相关产品推荐
相关产品推荐

