WooCommerce批量重发已完成订单发票:代码有效性验证求助
代码验证与优化方案
原代码存在的问题
- 内存与性能风险:直接用
limit => -1一次性拉取2000条订单,会大量占用服务器内存,极易触发脚本超时或内存溢出报错。 - 附件逻辑错误:
WC()->mailer()->wrap_message_attachment并非用来将订单URL转换为发票附件的方法,当前代码生成的附件是无效内容,无法实现发票补发的核心需求。 - 邮件不规范:自定义的邮件内容没有沿用WooCommerce原生发票邮件模板,既不符合店铺统一的邮件风格,也缺少订单明细、发票下载链接等关键信息。
- 无异常处理:没有记录邮件发送失败的情况,也未跳过无有效邮箱的订单,出现问题后无法快速排查。
优化后的实现方案
以下是更安全、符合WooCommerce规范的批量补发代码,解决了上述所有问题:
<?php // 确保代码在WordPress环境中运行,建议添加到自定义插件或主题functions.php中 add_action('init', 'batch_resend_woocommerce_invoices'); function batch_resend_woocommerce_invoices() { // 仅允许管理员触发,避免误操作 if (!current_user_can('manage_options')) { return; } // 通过URL参数手动触发,访问网站时添加?resend_invoices=1执行 if (!isset($_GET['resend_invoices']) || $_GET['resend_invoices'] != 1) { return; } // 分批处理,每次处理50条,可根据服务器配置调整 $per_page = 50; $current_page = isset($_GET['page']) ? absint($_GET['page']) : 1; // 分页查询已完成订单 $orders = wc_get_orders(array( 'status' => 'completed', 'limit' => $per_page, 'paged' => $current_page, 'orderby' => 'date', 'order' => 'ASC', )); if (empty($orders)) { echo '所有订单发票补发完成!'; exit; } // 调用WooCommerce原生邮件类 $mailer = WC()->mailer(); $invoice_email = $mailer->get_emails()['WC_Email_Customer_Invoice']; foreach ($orders as $order) { $order_id = $order->get_id(); $billing_email = $order->get_billing_email(); // 跳过无有效邮箱的订单 if (empty($billing_email)) { error_log('订单#' . $order_id . '无有效邮箱,跳过补发'); continue; } try { // 使用原生发票邮件模板发送,自动包含发票附件/下载链接 $invoice_email->trigger($order_id); error_log('订单#' . $order_id . '发票已成功发送至:' . $billing_email); } catch (Exception $e) { error_log('订单#' . $order_id . '发票发送失败:' . $e->getMessage()); } } // 自动跳转到下一页继续处理 $next_page = $current_page + 1; echo '已完成第' . $current_page . '页,共处理' . count($orders) . '笔订单,正在跳转下一页...'; wp_redirect(add_query_arg(array('resend_invoices' => 1, 'page' => $next_page), home_url())); exit; } ?>
使用说明
- 部署方式:优先推荐创建自定义插件部署代码(避免主题更新导致代码丢失),也可临时添加到当前主题的
functions.php文件中。 - 执行步骤:用管理员账号访问你的网站,在URL末尾拼接
?resend_invoices=1(例如https://你的域名.com/?resend_invoices=1),脚本会自动分批处理订单,直到所有完成订单处理完毕。 - 日志排查:发送状态会记录在WordPress错误日志中,可通过后台工具或服务器日志查看异常订单。
- 注意事项:
- 先在测试环境或选取少量订单测试,确认邮件样式和发送正常后再批量执行。
- 若服务器邮件发送频率受限,可将
$per_page值调小(如20)。 - 执行过程中不要关闭浏览器,直到看到“所有订单发票补发完成”的提示。
内容的提问来源于stack exchange,提问作者Luka Vulić
相关产品推荐
相关产品推荐

