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

