
本教程详细介绍了如何在 WooCommerce 中,通过 PHP 代码根据订单中产品的特定属性(包括简单产品和可变产品)动态添加自定义邮件收件人。我们将利用 woocommerce_email_recipient_new_order 过滤器,通过遍历订单商品并检查其属性(包括父产品属性),实现灵活的邮件通知配置,确保特定商品属性的订单能发送给指定的收件人。
在 WooCommerce 运营中,有时需要根据订单中包含的商品特性,将订单通知邮件发送给特定的收件人。例如,如果订单中包含“定制服务”产品,需要额外通知定制部门;如果包含“特殊商品A”,则需要通知供应商A。对于简单产品,直接检查其属性相对简单;但对于可变产品(Variable Product),其变体(Variation)可能继承或覆盖父产品的属性,这使得属性检查变得复杂。本教程旨在提供一个健壮的解决方案,能够同时处理简单产品和可变产品,确保无论属性定义在哪个层面,都能正确识别并添加收件人。
WooCommerce 提供了丰富的过滤器(Filters)和动作(Actions),允许开发者在不修改核心代码的情况下扩展其功能。针对订单邮件收件人的修改,我们主要使用 woocommerce_email_recipient_new_order 过滤器。
要实现根据产品属性动态添加收件人,我们需要以下核心步骤:
以下是实现上述功能的 PHP 代码,您可以将其添加到主题的 functions.php 文件或自定义插件中:
<?php
/**
* 根据订单中产品的特定属性动态添加自定义邮件收件人
* 适用于简单产品和可变产品及其父产品属性
*
* @param string $recipient 当前的收件人字符串
* @param WC_Order $order WC_Order 对象
* @return string 更新后的收件人字符串
*/
add_filter( 'woocommerce_email_recipient_new_order', 'custom_product_attribute_email_recipient', 10, 2 );
function custom_product_attribute_email_recipient( $recipient, $order ) {
// 确保 $order 是一个有效的 WC_Order 对象
if ( ! is_a( $order, 'WC_Order' ) ) {
return $recipient;
}
// --- 配置部分 ---
// 定义额外的邮箱地址
$additional_email1 = "department_a@example.com"; // 替换为实际邮箱地址
$additional_email2 = "supplier_b@example.com"; // 替换为实际邮箱地址
// 定义目标属性术语 slug (例如,'d1', 'd2')
$term_slug1 = "d1";
$term_slug2 = "d2";
// 定义目标属性的分类法 slug (例如,'pa_color', 'pa_size', 'pa_custom_attribute')
// 注意:自定义产品属性的分类法 slug 通常以 'pa_' 开头
$attribute_taxonomy = "pa_d";
// --- 配置结束 ---
$additional_recipients = []; // 用于收集所有匹配的额外收件人
// 遍历订单中的每个商品项
foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product(); // 获取 WC_Product 或 WC_Product_Variation 对象
// 如果无法获取产品对象,则跳过此商品项
if ( ! $product ) {
continue;
}
// 1. 检查当前产品(无论是简单产品还是变体)是否包含指定属性术语
// has_term() 方法可以检查产品是否分配了特定分类法下的某个术语
if ( $product->has_term( $term_slug1, $attribute_taxonomy ) ) {
$additional_recipients[] = $additional_email1;
}
if ( $product->has_term( $term_slug2, $attribute_taxonomy ) ) {
$additional_recipients[] = $additional_email2;
}
// 2. 如果当前产品是变体,还需要检查其父产品是否包含指定属性术语
// 这很重要,因为有些属性可能只在父产品层面定义,而非变体本身
if ( $product->is_type( 'variation' ) ) {
$parent_product = wc_get_product( $product->get_parent_id() );
if ( $parent_product ) {
if ( $parent以上就是WooCommerce 根据产品属性动态添加订单邮件收件人教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号