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

WooCommerce向商品发布者发送新订单邮件通知问题求助

问题分析与解决方案

你的代码逻辑本身没问题,但邮件未发送可能是钩子触发时机、邮件配置或变量获取环节出了问题,下面是针对性的修复和排查步骤:

一、修复后的代码(添加调试日志+优化邮件配置+更可靠的钩子)

add_action('woocommerce_new_order', 'send_email_to_product_publisher_on_new_order', 10, 1);
function send_email_to_product_publisher_on_new_order($order_id) {
    if (!$order_id) {
        error_log('订单ID为空');
        return;
    }

    // 获取订单对象
    $order = wc_get_order($order_id);
    if (!$order) {
        error_log('无法获取订单对象,ID: ' . $order_id);
        return;
    }

    // 获取订单商品
    $items = $order->get_items();
    $item = reset($items);
    if (!$item) {
        error_log('订单中无商品,订单ID: ' . $order_id);
        return;
    }

    // 获取商品ID(如果是变体商品,确保获取父商品作者)
    $product_id = $item->get_product_id();
    $variation_id = $item->get_variation_id();
    if ($variation_id) {
        $product_id = wp_get_post_parent_id($variation_id);
    }

    // 获取商品作者
    $author_id = get_post_field('post_author', $product_id);
    if (!$author_id) {
        error_log('商品无作者,商品ID: ' . $product_id);
        return;
    }

    $author = get_userdata($author_id);
    if (!$author) {
        error_log('无法获取用户数据,用户ID: ' . $author_id);
        return;
    }

    $author_email = $author->user_email;
    $author_name = $author->display_name;

    if (!$author_email) {
        error_log('用户无邮箱,用户ID: ' . $author_id);
        return;
    }

    // 邮件内容
    $subject = 'Thông báo: Bạn vừa nhận được đơn hàng mới!';
    $message = "Xin chào $author_name,\n\nBạn vừa nhận được một đơn hàng mới cho sản phẩm mà bạn đã đăng trên website của chúng tôi.\n";
    $message .= "Thông tin đơn hàng:\n";
    $message .= "Số đơn hàng: " . $order->get_order_number() . "\n";
    $message .= "Tổng giá trị: " . wc_price($order->get_total()) . "\n";
    $message .= "Bạn có thể xem chi tiết đơn hàng tại đây: " . $order->get_view_order_url() . "\n\n";
    $message .= "Cảm ơn bạn đã đóng góp sản phẩm tuyệt vời của bạn cho cộng đồng của chúng tôi!";

    // 完善邮件头(添加发件人,避免被当成垃圾邮件)
    $headers = array(
        'Content-Type: text/plain; charset=UTF-8',
        'From: ' . get_bloginfo('name') . ' <' . get_option('admin_email') . '>'
    );

    // 发送邮件并记录结果
    $mail_sent = wp_mail($author_email, $subject, $message, $headers);
    if ($mail_sent) {
        error_log('邮件发送成功,收件人: ' . $author_email . ',订单ID: ' . $order_id);
    } else {
        error_log('邮件发送失败,收件人: ' . $author_email . ',订单ID: ' . $order_id);
    }
}

二、关键优化点

  1. 替换钩子为woocommerce_new_order:这个钩子在订单成功创建后一定会触发,比woocommerce_checkout_order_processed更稳定,避免因结账流程中的异常导致钩子未执行。
  2. 添加调试日志:通过error_log()记录每个环节的状态,方便你在wp-content/debug.log中查看哪一步出了问题。
  3. 处理变体商品:如果订单中的商品是变体,自动获取父商品的作者(因为变体的作者通常继承父商品)。
  4. 完善邮件头:添加合法的发件人信息,避免邮件被服务器或邮箱服务商判定为垃圾邮件。

三、排查步骤

  1. 启用WP_DEBUG日志:在wp-config.php中添加以下代码,开启调试日志:

    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);
    

    完成测试后,查看wp-content/debug.log文件,根据日志信息定位问题(比如是无法获取商品作者,还是邮件发送失败)。

  2. 测试wp_mail功能:创建一个简单的测试脚本,确认服务器的邮件功能正常:

    add_action('init', 'test_wp_mail');
    function test_wp_mail() {
        $test_sent = wp_mail('你的测试邮箱', '测试邮件', '这是一封测试邮件');
        if ($test_sent) {
            error_log('wp_mail测试成功');
        } else {
            error_log('wp_mail测试失败,请检查服务器邮件配置');
        }
    }
    

    访问网站后查看日志,如果测试邮件也发送失败,说明是服务器邮件配置问题,需要联系主机服务商解决。

  3. 验证商品作者信息:进入商品编辑页面,确认该商品的作者确实是chu_xe用户,并且该用户的邮箱地址正确。

  4. 检查垃圾邮件文件夹:提醒chu_xe用户查看邮箱的垃圾邮件/广告文件夹,有时候邮件会被误判。

内容的提问来源于stack exchange,提问作者Tú Phạm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:45:54