如何为WooCommerce自定义订单状态变更添加站点管理员邮件通知
WooCommerce自定义订单状态管理员邮件通知不生效解决方案
问题根因
你使用的 woocommerce_email_recipient_customer_{状态}_order 过滤器不生效,核心是WooCommerce默认只会为内置订单状态(处理中、已完成等)自动生成对应钩子,你自定义的 out-to-delivery(待配送)状态没有预先绑定对应的客户邮件发送事件,因此该钩子根本不会被触发。
解决方案
推荐以下两种实现方式,可根据自身需求选择:
方案1:直接监听所有订单状态变更发送通知(最省事,无需额外配置邮件模板)
直接监听订单状态变更动作,只要状态切换为你指定的类型,就自动给管理员发通知,适配所有内置和自定义订单状态:
add_action( 'woocommerce_order_status_changed', 'notify_admin_on_custom_order_status_change', 10, 3 ); function notify_admin_on_custom_order_status_change( $order_id, $old_status, $new_status ) { // 此处填入需要监听的所有订单状态标识,可同时加内置和自定义状态 $target_statuses = [ 'out-to-delivery', 'completed' ]; if ( in_array( $new_status, $target_statuses ) ) { $order = wc_get_order( $order_id ); // 替换为你的管理员收件邮箱 $admin_email = 'admin@xyz.com'; $subject = '订单状态更新:#' . $order->get_order_number() . ' 已更新为' . wc_get_order_status_name( $new_status ); $message = '订单编号:' . $order->get_order_number() . PHP_EOL; $message .= '订单状态:' . wc_get_order_status_name( $new_status ) . PHP_EOL; $message .= '订单详情页:' . $order->get_view_order_url(); wp_mail( $admin_email, $subject, $message ); } }
方案2:给自定义状态注册邮件触发器(适配原有抄送逻辑)
如果需要给客户也发送待配送状态的邮件,同时保留你原有加收件人的过滤器逻辑,可先注册自定义状态的邮件触发事件:
// 注册自定义待配送状态的客户邮件触发动作 add_action( 'woocommerce_order_status_out-to-delivery', 'trigger_customer_out_to_delivery_email', 10, 2 ); function trigger_customer_out_to_delivery_email( $order_id, $order ) { $mailer = WC()->mailer()->get_emails(); // 可直接复用处理中订单的邮件模板,也可替换为你自定义的邮件类 if ( isset( $mailer['WC_Email_Customer_Processing_Order'] ) ) { $mailer['WC_Email_Customer_Processing_Order']->trigger( $order_id ); } }
注册完成后,你原来写的 woocommerce_email_recipient_customer_out-to-delivery_order 过滤器就可以正常触发生效。
注意事项
- 代码请添加到当前使用主题的
functions.php文件末尾,或自定义功能插件中,修改前请提前备份网站数据 - 若站点使用了缓存插件,修改代码后请清空全站缓存再进行测试
- 若邮件发送异常,可安装邮件日志类插件排查是否是邮件服务本身的发送问题
内容的提问来源于stack exchange,提问作者user2679476
相关产品推荐
相关产品推荐

