WooCommerce 订单中特定商品触发自定义邮件的精准控制教程
在WooCommerce搭建的电商站点运营过程中,我们常常需要针对包含特定商品的订单发送专属通知邮件,比如购买了定制商品的用户需要收到制作进度提醒,购买了某类课程的用户需要收到学习指引邮件。如果直接通过WooCommerce默认的邮件系统设置,很难实现对特定商品的精准匹配触发,我们可以通过自定义代码的方式实现这个需求,下面就来详细介绍实现步骤。
核心实现思路
整个功能的实现逻辑可以分为三个部分:首先是监听WooCommerce的订单状态变更事件,当订单状态变为“处理中”这类已付款完成的状态时触发后续逻辑;然后遍历订单中的所有商品,判断是否存在我们指定的目标商品;最后如果匹配到目标商品,就调用WordPress的邮件发送函数,给订单对应的用户发送自定义内容邮件。
准备工作
- 确认站点已经安装并激活WooCommerce插件,且存在需要触发邮件的目标商品,记录下该商品的ID,后续代码中会用到。
- 建议先创建一个子主题,将自定义代码放在子主题的functions.php文件中,避免主题更新时代码被覆盖。
- 如果需要邮件包含HTML格式内容,可以先写好邮件的HTML模板,后续直接引入使用。
完整代码实现
下面的代码实现了当订单中包含ID为123的特定商品,且订单状态变为“处理中”时,向用户发送自定义邮件的功能,你可以根据实际需求修改商品ID、邮件内容和触发条件。
<?php
/**
* 当订单包含特定商品时触发自定义邮件
* 商品ID修改为你需要匹配的目标商品ID
*/
add_action('woocommerce_order_status_processing', 'send_custom_email_for_specific_product', 10, 2);
function send_custom_email_for_specific_product($order_id, $order) {
// 目标商品ID,修改为你的实际商品ID
$target_product_id = 123;
$has_target_product = false;
// 遍历订单中的所有商品
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
// 判断商品是否为目标商品,兼容简单商品和变体商品
if ($product && ($product->get_id() == $target_product_id || $product->get_parent_id() == $target_product_id)) {
$has_target_product = true;
break;
}
}
// 如果订单包含目标商品,发送自定义邮件
if ($has_target_product) {
// 获取订单用户信息
$user_email = $order->get_billing_email();
$user_name = $order->get_billing_first_name() . ' ' . $order->get_billing_last_name();
// 邮件主题
$email_subject = '您的订单包含专属商品,请注意查收相关指引';
// 邮件内容,支持HTML格式
$email_content = '
<div style="font-family: Arial, sans-serif; padding: 20px;">
<h2>尊敬的' . esc_html($user_name) . ',您好!</h2>
<p>您的订单(订单号:' . $order_id . ')中包含我们的专属定制商品,以下是相关指引:</p>
<ul>
<li>定制商品制作周期为7-10个工作日,完成后会第一时间通知您</li>
<li>如有疑问可以随时联系客服邮箱:service@ipipp.com</li>
</ul>
<p>感谢您的支持!</p>
</div>
';
// 邮件头信息,设置内容类型为HTML
$email_headers = array(
'Content-Type: text/html; charset=UTF-8',
'From: 站点名称 <noreply@ipipp.com>'
);
// 发送邮件
wp_mail($user_email, $email_subject, $email_content, $email_headers);
}
}
?>代码说明
首先是钩子部分,我们使用woocommerce_order_status_processing钩子,这个钩子会在订单状态变为“处理中”时触发,也就是用户完成付款后订单进入处理阶段的时间点,你也可以根据需求替换为woocommerce_order_status_completed等其他订单状态钩子。
代码中遍历订单商品时,同时判断了商品的自身ID和父ID,这样可以兼容简单商品和变体商品两种场景,避免变体商品无法被匹配的问题。如果没有变体商品的需求,也可以简化为只判断$product->get_id() == $target_product_id。
邮件内容部分使用了HTML格式,你可以根据自己的需求调整样式和文字内容,wp_mail函数是WordPress内置的邮件发送函数,不需要额外配置就可以使用,如果需要使用SMTP发送邮件提升到达率,可以搭配WP Mail SMTP这类插件使用。
注意事项
- 修改代码中的
$target_product_id为你自己的目标商品ID,多个商品的话可以将判断逻辑改为数组匹配,遍历目标商品ID数组即可。 - 测试的时候可以先创建一个测试订单,购买目标商品后手动将订单状态改为“处理中”,查看是否收到对应邮件,确认功能正常后再正式使用。
- 如果邮件没有收到,可以先检查垃圾邮箱,同时确认站点的邮件发送功能是否正常,也可以开启WordPress的调试模式查看邮件发送的错误信息。
- 如果需要给管理员也发送一封通知邮件,只需要在发送用户邮件的代码后,再调用一次
wp_mail函数,收件人设置为管理员的邮箱即可。
扩展优化建议
如果需要更灵活的控制,比如不同商品触发不同的邮件内容,可以将商品ID和对应的邮件模板做映射关系,判断到对应商品后调用对应的模板内容。另外也可以给邮件添加退订链接,符合邮件发送的相关规范,避免用户投诉。