
本文详细介绍了如何在woocommerce中根据订单中包含的产品分类,条件性地定制客户收到的邮件通知页脚。通过利用woocommerce的`woocommerce_email_footer`钩子,并结合php的`array_intersect`函数,您可以高效地识别特定分类产品,进而插入个性化的页脚信息,提升邮件的专业性和信息传达的准确性。
引言:定制WooCommerce邮件页脚的需求
在电子商务运营中,WooCommerce的邮件通知是与客户沟通的重要渠道。有时,根据客户订单中包含的特定产品分类,我们需要在邮件通知(特别是订单确认邮件)的页脚部分显示不同的信息。例如,销售食品的商家可能需要针对包含生鲜产品的订单添加特殊的储存或配送说明;销售定制商品的商家可能需要提供额外的售后服务联系方式。这种条件化的内容显示能够增强邮件的个性化和相关性,提升客户体验。
本文将指导您如何通过WordPress主题的functions.php文件或自定义插件,安全且高效地实现这一功能。
核心原理:利用woocommerce_email_footer钩子
WooCommerce提供了一系列动作钩子(Action Hooks),允许开发者在不修改核心文件的情况下扩展其功能。woocommerce_email_footer钩子便是其中之一,它在WooCommerce所有邮件模板的页脚内容渲染之前触发。这个钩子会传递多个参数,包括$order(订单对象)、$sent_to_admin(是否发送给管理员)、$plain_text(是否为纯文本邮件)和$email(邮件对象),这些参数为我们获取订单详情和邮件上下文提供了便利。
获取订单产品分类
要实现条件化显示,首先需要获取订单中所有产品的分类。这需要我们遍历订单中的每一个商品项,然后查询该商品所属的分类。
以下是获取订单产品分类的基本步骤:
- 获取订单商品项: 通过$order->get_items()方法获取订单中的所有商品。
- 遍历商品项: 对每个商品项,获取其对应的产品ID。
- 查询产品分类: 使用wp_get_post_terms()函数,根据产品ID和分类法(product_cat)获取所有关联的分类术语(term)。
- 收集分类名称: 将获取到的分类术语的名称(或ID、slug)收集到一个数组中,以便后续进行比较。
关键修正:正确判断分类是否存在
在实现条件判断时,一个常见的错误是in_array函数的使用方式。in_array函数用于检查一个值是否存在于一个数组中,其基本语法是in_array(mixed $needle, array $haystack)。如果需要检查多个目标分类中的任意一个是否存在于订单产品分类中,直接将多个目标分类作为$needle参数传入in_array是错误的。
正确的做法是使用array_intersect函数。array_intersect函数返回一个数组,其中包含两个或更多数组中所有共同的值。如果array_intersect的结果不为空,则表示订单中包含至少一个目标分类。
完整的解决方案代码
下面是一个完整的PHP代码示例,您可以将其添加到子主题的functions.php文件或自定义插件中。
/**
* 根据订单产品分类条件性地添加WooCommerce邮件页脚内容。
*
* @param WC_Order $order 订单对象。
* @param bool $sent_to_admin 是否发送给管理员。
* @param bool $plain_text 是否为纯文本邮件。
* @param WC_Email $email 邮件对象。
*/
function custom_woocommerce_email_footer_by_category( $order, $sent_to_admin, $plain_text, $email ) {
// 定义您希望触发自定义页脚的目标产品分类名称数组。
// 请确保这些分类名称与您WooCommerce后台设置的分类名称完全匹配。
$target_categories = array(
'Farm Shop',
'Cowdray Kitchen',
'Cowdray Living',
'The Meditator',
'Cowdray Hampers',
'Cowdray Supper Kits',
'Grocery',
'Butchery',
'Deli',
'Pantry',
'Houseplants and Flowers',
'Picnic Hampers',
'Afternoon Tea',
'Drinks',
'Wreaths',
);
$ordered_product_category_names = array();
// 遍历订单中的所有商品项
foreach ( $order->get_items() as $item ) {
// 获取商品对应的产品对象
$product = $item->get_product();
// 确保产品存在且有效
if ( $product ) {
// 获取产品所属的所有分类术语(term objects)
$terms = wp_get_post_terms( $product->get_id(), 'product_cat' );
// 遍历每个分类术语并收集其名称
foreach ( $terms as $term ) {
$ordered_product_category_names[] = $term->name;
}
}
}
// 移除重复的分类名称,避免不必要的比较
$ordered_product_category_names = array_unique( $ordered_product_category_names );
// 使用 array_intersect 检查目标分类与订单产品分类是否有交集
// 如果交集不为空,则表示订单中包含至少一个目标分类
if ( ! empty( array_intersect( $target_categories, $ordered_product_category_names ) ) ) {
// 输出您希望显示的自定义页脚内容
echo 'Cowdray Farm Shop Ltd
VAT Number: 970407718';
}
}
// 将自定义函数挂载到 woocommerce_email_footer 动作钩子上
// 优先级设置为10,参数数量设置为4
add_action( 'woocommerce_email_footer', 'custom_woocommerce_email_footer_by_category', 10, 4 );代码解析
- custom_woocommerce_email_footer_by_category($order, $sent_to_admin, $plain_text, $email)函数定义: 这是我们的核心函数,它将在WooCommerce邮件页脚处执行。
- $target_categories数组: 定义了一个包含所有目标分类名称的数组。您需要根据自己的需求修改这些分类名称。
- $ordered_product_category_names数组: 初始化一个空数组,用于存储订单中所有产品的分类名称。
- 遍历订单商品: foreach ( $order->get_items() as $item )循环遍历订单中的每一个商品项。
- 获取产品对象和ID: $product = $item->get_product();获取当前商品项对应的产品对象。$product->get_id()获取产品ID。
- 获取产品分类: wp_get_post_terms( $product->get_id(), 'product_cat' )根据产品ID和分类法product_cat获取所有关联的分类术语。
- 收集分类名称: 内部foreach循环遍历获取到的分类术语,并将它们的名称添加到$ordered_product_category_names数组中。
- array_unique(): 调用array_unique()是为了移除$ordered_product_category_names中可能存在的重复分类名称,这有助于提高后续比较的效率。
-
array_intersect()判断:
- array_intersect( $target_categories, $ordered_product_category_names )计算两个数组的交集。
- ! empty(...)检查交集数组是否为空。如果交集不为空,则表示订单中至少包含一个$target_categories中定义的分类。
- 输出自定义内容: 如果条件满足,echo语句将输出您预设的自定义页脚文本。您可以根据需要修改这部分HTML内容。
- add_action(): 将自定义函数挂载到woocommerce_email_footer动作钩子上,确保在邮件页脚生成时执行。10是优先级,4是函数接受的参数数量。
部署与注意事项
- 代码位置: 强烈建议将此代码放置在子主题的functions.php文件中,而不是直接修改父主题。这样可以确保在主题更新时您的自定义代码不会丢失。更好的做法是创建一个自定义插件来管理此类功能,以实现更高的模块化和可维护性。
- 分类名称匹配: 确保$target_categories数组中的分类名称与您WooCommerce后台设置的产品分类名称完全一致,包括大小写和特殊字符。
- 性能考量: 对于大多数网站而言,此代码的性能影响可以忽略不计。但如果您的订单包含数百个甚至上千个商品(这在WooCommerce中并不常见),并且产品分类数量巨大,则可能需要考虑进一步的优化。
- 替代方案: 如果您希望根据分类ID或分类slug而不是名称进行判断,可以修改代码中收集分类信息的部分,将$term->name替换为$term->term_id或$term->slug。相应地,$target_categories数组也需要包含对应的ID或slug。
总结
通过上述方法,您可以灵活地根据订单中包含的产品分类,在WooCommerce邮件通知的页脚部分插入定制化的信息。这不仅提升了客户邮件的专业性和相关性,也为商家提供了更精细化的沟通手段。遵循本文提供的代码和最佳实践,您将能够安全、高效地实现这一功能,为您的WooCommerce商店带来更好的用户体验。










