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

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ć

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:57:33