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

WordPress+WooCommerce+Dokan下修改‘Customer Completed’邮件接收方失败求助

解决WooCommerce Dokan将完成订单邮件发送给卖家而非客户的问题

问题分析

你当前的代码存在两个核心问题:一是WC_Email_Customer_Completed_Order的默认触发流程仍在执行,会自动发送邮件给客户;二是手动调用trigger()时,该方法内部可能会重新初始化收件人参数,覆盖你手动设置的值,最终导致客户依然收到邮件,还可能出现重复发送给卖家的情况。

解决方案(官方推荐方式)

使用WooCommerce官方提供的邮件收件人过滤器,直接替换该邮件的收件人为卖家邮箱,这是最稳妥且符合插件规范的实现方式:

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'replace_completed_order_recipient_with_seller', 10, 2 );

function replace_completed_order_recipient_with_seller( $original_recipient, $order ) {
    // 获取订单关联的Dokan卖家ID
    $vendor_id = get_post_meta( $order->get_id(), '_dokan_vendor_id', true );

    if ( $vendor_id ) {
        $seller = dokan()->vendor->get( $vendor_id );
        $seller_email = $seller->get_email();

        // 若卖家邮箱有效,替换原收件人
        if ( $seller_email ) {
            $original_recipient = $seller_email;
        }
    }

    return $original_recipient;
}

代码说明

  • woocommerce_email_recipient_customer_completed_order是WooCommerce专为「客户完成订单」邮件提供的收件人过滤器,优先级设为10(默认值),接收原收件人地址和订单对象两个参数。
  • 通过get_post_meta获取订单绑定的卖家ID,再调用Dokan的官方API获取卖家邮箱。
  • 替换原收件人后返回,WooCommerce会自动使用新的收件人发送邮件,完全跳过默认的客户收件流程。

替代方案(完全自定义发送逻辑)

如果需要完全掌控邮件发送时机和内容,可以先禁用默认邮件,再手动触发发送给卖家:

// 关闭默认的客户完成订单邮件发送
add_filter( 'woocommerce_email_enabled_customer_completed_order', '__return_false' );

// 在订单状态变为完成时,手动发送邮件给卖家
add_action( 'woocommerce_order_status_completed', 'send_completed_order_to_seller_manually', 10, 1 );

function send_completed_order_to_seller_manually( $order_id ) {
    $order = wc_get_order( $order_id );
    $vendor_id = get_post_meta( $order_id, '_dokan_vendor_id', true );

    if ( $vendor_id ) {
        $seller = dokan()->vendor->get( $vendor_id );
        $seller_email = $seller->get_email();

        if ( $seller_email ) {
            // 获取邮件类实例
            $email_class = WC()->mailer()->get_emails()['WC_Email_Customer_Completed_Order'];
            // 设置收件人为卖家邮箱
            $email_class->recipient = $seller_email;
            // 触发邮件发送
            $email_class->trigger( $order_id );
        }
    }
}

这个方案先禁用默认邮件流程,再手动调用邮件类发送给卖家,彻底避免重复发送问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:12:36