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

WooCommerce:订单完成7天后发客户邮件的代码问题求助

代码问题排查与修正方案

核心问题点

  • 订单查询条件失效:原代码中date_completed重复赋值,后一个会覆盖前一个,导致无法正确筛选7天前完成的订单,需用数组嵌套传递区间条件。
  • 未兼容访客订单:部分订单是访客下单,$order->get_user()会返回null,直接调用user_email会触发错误,应改用$order->get_billing_email()获取邮箱。
  • wc_mail调用错误:wc_mail参数顺序为「收件人、主题、正文、头部、附件」,原代码误将模板路径当作第四个参数(实际是头部);BCC需通过HTTP头设置,而非最后一个参数,加载模板需用wc_get_template_html先获取内容。
  • Cron时间设置不严谨:strtotime('17:00:00')未结合WordPress时区,可能导致执行时间偏差,应使用current_time('timestamp')计算符合站点时区的执行时间。
  • 无重复发送防护:原代码未标记已发送邮件的订单,每日执行会重复给同一客户发邮件,需添加自定义字段记录发送状态。

修正后的代码

// Customer rate reminder email 7 days after order completed status change 
function lumiqy_send_rate_reminder_email_to_customer() {
    $interval_days = 7;

    // 计算7天前的日期范围(适配WordPress站点时区)
    $start_date = date('Y-m-d', strtotime("-{$interval_days} days", current_time('timestamp')));
    $end_date = $start_date . ' 23:59:59';

    // 查询7天前完成且未发送过提醒的订单
    $completed_orders = wc_get_orders(array(
        'date_completed' => array(
            '>=' => $start_date,
            '<=' => $end_date
        ),
        'status' => 'completed',
        'limit' => -1,
        'meta_query' => array(
            array(
                'key' => '_rate_reminder_sent',
                'compare' => 'NOT EXISTS'
            )
        )
    ));

    foreach ($completed_orders as $order) {
        // 获取客户邮箱(兼容访客订单)
        $customer_email = $order->get_billing_email();
        if (empty($customer_email)) continue;

        // 加载邮件模板内容(模板需放在主题woocommerce/emails目录下)
        $email_content = wc_get_template_html('emails/customer-rate-reminder-7-days.php', array(
            'order' => $order
        ));

        $subject = '请为您的订单评价';
        $bcc_email = 'mail@domain.com';

        // 设置邮件头部(包含BCC)
        $headers = array(
            'Content-Type: text/html; charset=UTF-8',
            'Bcc: ' . $bcc_email
        );

        // 发送邮件并标记已发送状态
        if (wc_mail($customer_email, $subject, $email_content, $headers)) {
            $order->update_meta_data('_rate_reminder_sent', '1');
            $order->save();
        }
    }
}

// 每日17:00(站点时区)调度Cron任务
function schedule_custom_cron_job() {
    $hook = 'lumiqy_rate_reminder_daily_cron_job';
    if (!wp_next_scheduled($hook)) {
        // 计算今日17:00的时间戳(适配站点时区)
        $schedule_time = strtotime('today 17:00:00', current_time('timestamp'));
        // 若当前时间已过17:00,自动设置为次日17:00
        if ($schedule_time < current_time('timestamp')) {
            $schedule_time = strtotime('tomorrow 17:00:00', current_time('timestamp'));
        }
        wp_schedule_event($schedule_time, 'daily', $hook);
    }
}
add_action('wp', 'schedule_custom_cron_job');

add_action('lumiqy_rate_reminder_daily_cron_job', 'lumiqy_send_rate_reminder_email_to_customer');

额外注意事项

  • 确保邮件模板文件customer-rate-reminder-7-days.php放在主题的woocommerce/emails目录下,目录不存在需手动创建。
  • 可安装WP Crontrol插件查看、测试Cron任务是否正常调度。
  • 测试时可临时将$interval_days改为0,筛选当天完成的订单,快速验证邮件发送逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:19