Woocommerce订阅取消时未发送客户邮件的问题求助
解决WooCommerce订阅取消时客户收不到邮件的问题
原代码问题分析
你的代码存在几个关键问题,导致页面转圈无响应且邮件未发送:
- 钩子参数不匹配:
woocommerce_subscription_status_pending-cancel钩子实际传递3个参数($subscription,$old_status,$new_status),但你的函数只接收1个参数,会触发PHP警告中断AJAX请求,造成页面转圈。 - 状态时机错误:
pending-cancel是订阅标记为待取消的状态,此时订阅尚未真正完成取消流程,触发邮件的时机不准确。 - 邮件类修改逻辑冲突:直接修改
WCS_Email_Cancelled_Subscription的收件人后未及时恢复,且连续两次trigger可能导致内部逻辑混乱。
修正方案
方案1:通过过滤器添加客户邮箱到取消邮件收件人列表
这种方式最安全,不会干扰原有邮件逻辑,同时让管理员和客户都收到取消通知:
add_filter('woocommerce_email_recipient_wcs_cancelled_subscription', 'add_customer_to_cancelled_subscription_email', 10, 2); function add_customer_to_cancelled_subscription_email($recipient, $subscription) { // 验证订阅对象 if (!is_a($subscription, 'WC_Subscription')) { return $recipient; } // 获取客户邮箱 $customer_email = $subscription->get_billing_email(); if (!empty($customer_email)) { // 合并原有收件人和客户邮箱,用逗号分隔 $recipient = empty($recipient) ? $customer_email : $recipient . ',' . $customer_email; } return $recipient; }
方案2:单独给客户发送取消邮件
如果需要给客户发送独立的取消邮件(和管理员收到的内容区分开),可以使用以下代码:
add_action('woocommerce_subscription_status_cancelled', 'send_cancel_email_to_subscription_customer', 10, 3); function send_cancel_email_to_subscription_customer($subscription, $old_status, $new_status) { $customer_email = $subscription->get_billing_email(); if (empty($customer_email)) { return; } // 获取取消订阅邮件实例 $cancelled_email = WC()->mailer()->get_emails()['WCS_Email_Cancelled_Subscription']; if (!$cancelled_email) { return; } // 保存原收件人,避免影响后续邮件 $original_recipient = $cancelled_email->recipient; // 设置收件人为客户 $cancelled_email->recipient = $customer_email; // 触发邮件发送 $cancelled_email->trigger($subscription); // 恢复原收件人 $cancelled_email->recipient = $original_recipient; }
额外检查事项
- 确保WooCommerce Subscriptions插件已激活且版本正常。
- 检查WordPress的PHP错误日志,确认是否存在邮件发送相关的错误(比如服务器邮件配置问题)。
- 在WooCommerce后台「邮件」设置中,确认「已取消的订阅」邮件模板已启用。
内容的提问来源于stack exchange,提问作者Irshad Alam
相关产品推荐
相关产品推荐

