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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:39:00