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

