0

0

WooCommerce 根据产品属性动态添加订单邮件收件人教程

聖光之護

聖光之護

发布时间:2025-11-08 13:41:27

|

263人浏览过

|

来源于php中文网

原创

woocommerce 根据产品属性动态添加订单邮件收件人教程

本教程详细介绍了如何在 WooCommerce 中,通过 PHP 代码根据订单中产品的特定属性(包括简单产品和可变产品)动态添加自定义邮件收件人。我们将利用 woocommerce_email_recipient_new_order 过滤器,通过遍历订单商品并检查其属性(包括父产品属性),实现灵活的邮件通知配置,确保特定商品属性的订单能发送给指定的收件人。

1. 需求背景与挑战

在 WooCommerce 运营中,有时需要根据订单中包含的商品特性,将订单通知邮件发送给特定的收件人。例如,如果订单中包含“定制服务”产品,需要额外通知定制部门;如果包含“特殊商品A”,则需要通知供应商A。对于简单产品,直接检查其属性相对简单;但对于可变产品(Variable Product),其变体(Variation)可能继承或覆盖父产品的属性,这使得属性检查变得复杂。本教程旨在提供一个健壮的解决方案,能够同时处理简单产品和可变产品,确保无论属性定义在哪个层面,都能正确识别并添加收件人。

2. WooCommerce 邮件过滤器介绍

WooCommerce 提供了丰富的过滤器(Filters)和动作(Actions),允许开发者在不修改核心代码的情况下扩展其功能。针对订单邮件收件人的修改,我们主要使用 woocommerce_email_recipient_new_order 过滤器。

阿里妈妈·创意中心
阿里妈妈·创意中心

阿里妈妈营销创意中心

下载
  • woocommerce_email_recipient_new_order: 这个过滤器允许我们在新订单邮件发送之前,修改其收件人列表。它接收两个参数:当前的收件人字符串 $recipient 和 WC_Order 对象 $order。

3. 实现原理与步骤

要实现根据产品属性动态添加收件人,我们需要以下核心步骤:

  1. 定义目标属性和收件人: 明确哪些属性术语(term slug)对应哪些额外的邮箱地址。
  2. 挂载过滤器: 使用 add_filter() 将我们的自定义函数挂载到 woocommerce_email_recipient_new_order 过滤器上。
  3. 遍历订单商品: 获取订单中的所有商品项(order items)。
  4. 获取商品对象: 对于每个商品项,获取其对应的 WC_Product 对象(可能是简单产品或变体)。
  5. 检查产品属性:
    • 首先检查当前商品对象(无论是简单产品还是变体)是否包含目标属性术语。
    • 如果当前商品是变体,还需要额外检查其父产品是否包含目标属性术语,因为某些属性可能只在父产品层面定义。
  6. 添加收件人: 如果找到匹配的属性,将对应的额外邮箱地址添加到收件人列表中。
  7. 去重与返回: 确保最终的收件人列表中没有重复的邮箱地址,并返回更新后的收件人字符串。

4. 示例代码

以下是实现上述功能的 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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1229

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1205

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号