在WooCommerce电商场景中,默认订单邮件触发逻辑仅基于订单状态变化生效,无法针对订单内包含的特定商品设置触发条件,很多商家需要当订单包含某款会员商品、预售商品时自动发送专属通知邮件,这时候就需要优化邮件触发机制。

核心触发逻辑分析
WooCommerce的订单邮件触发本质是基于woocommerce_email_actions钩子注册触发动作,再结合woocommerce_order_status_changed等状态变更钩子判断发送条件。要实现特定商品条件触发,核心是先获取订单内的商品信息,再匹配预设条件,最后调用邮件发送方法。
需要关注的核心钩子
woocommerce_order_status_changed:订单状态变更时触发,可在此处获取订单完整信息woocommerce_email_recipient_[邮件ID]:过滤指定邮件的收件人,返回空数组可阻止邮件发送woocommerce_before_email_order:邮件发送前执行,可用于补充自定义判断逻辑
具体实现步骤
1. 定义目标商品条件
首先需要明确要匹配的条件,比如商品ID为123、456的商品,或者属于“VIP专享”分类的商品,我们可以先写一个通用的条件判断函数。
/**
* 判断订单是否包含目标特定商品
* @param WC_Order $order 订单对象
* @return bool 是否匹配条件
*/
function check_order_has_target_product($order) {
// 目标商品ID列表,可自行修改
$target_product_ids = array(123, 456);
// 目标商品分类slug列表,可自行修改
$target_category_slugs = array('vip-exclusive');
$items = $order->get_items();
foreach ($items as $item) {
$product = $item->get_product();
// 判断商品ID是否匹配
if (in_array($product->get_id(), $target_product_ids)) {
return true;
}
// 判断商品所属分类是否匹配
$product_cats = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
if (!empty(array_intersect($product_cats, $target_category_slugs))) {
return true;
}
}
return false;
}2. 优化邮件触发条件
假设我们要优化的是订单完成状态(processing到completed)时发送的“订单完成”邮件,邮件ID为customer_completed_order,我们可以通过过滤收件人的方式控制发送逻辑。
/**
* 过滤订单完成邮件的收件人,仅当包含特定商品时发送
* @param string $recipient 默认收件人
* @param WC_Order $order 订单对象
* @return string 最终收件人
*/
function filter_target_email_recipient($recipient, $order) {
// 如果订单不包含目标商品,返回空字符串阻止邮件发送
if (!check_order_has_target_product($order)) {
return '';
}
// 匹配条件则返回默认收件人
return $recipient;
}
add_filter('woocommerce_email_recipient_customer_completed_order', 'filter_target_email_recipient', 10, 2);3. 新增专属触发邮件(可选)
如果需要当包含特定商品时发送额外的专属邮件,而不是修改原有邮件的触发逻辑,可以注册新的邮件类,再绑定触发动作。
/**
* 注册专属特定商品通知邮件类
*/
function register_target_product_email_class($emails) {
require_once 'class-wc-email-target-product-notification.php';
$emails['WC_Email_Target_Product_Notification'] = new WC_Email_Target_Product_Notification();
return $emails;
}
add_filter('woocommerce_email_classes', 'register_target_product_email_class');
/**
* 订单状态变更时触发专属邮件
* @param int $order_id 订单ID
* @param string $old_status 旧状态
* @param string $new_status 新状态
* @param WC_Order $order 订单对象
*/
function trigger_target_product_email($order_id, $old_status, $new_status, $order) {
// 仅当订单状态变为completed且包含特定商品时触发
if ($new_status === 'completed' && check_order_has_target_product($order)) {
$mailer = WC()->mailer();
$emails = $mailer->get_emails();
if (isset($emails['WC_Email_Target_Product_Notification'])) {
$emails['WC_Email_Target_Product_Notification']->trigger($order_id);
}
}
}
add_action('woocommerce_order_status_changed', 'trigger_target_product_email', 10, 4);注意事项
- 判断商品条件时尽量使用商品ID而非商品名称,避免商品名称修改后逻辑失效
- 新增邮件类时需要继承
WC_Email基类,正确设置邮件标题、内容模板等属性 - 测试时建议先关闭其他冗余邮件,避免多邮件同时触发造成干扰
- 不要直接在状态变更钩子内调用多次邮件发送方法,避免重复触发
优化触发机制时要注意保留原有邮件逻辑,不要覆盖WooCommerce默认的邮件触发流程,避免影响正常的订单通知功能。
WooCommerce订单邮件触发商品条件判断邮件逻辑优化钩子函数修改时间:2026-06-05 03:20:11