WooCommerce特定品类订单完成时触发邮件代码求助
问题排查与代码修复
嘿,我帮你梳理下代码里的几个关键问题,应该能解决你的订单完成自动发邮件需求:
1. 钩子使用错误,导致代码从未触发
你用了woocommerce_catmail这个自定义钩子,但WooCommerce不会自动触发它。应该替换为官方提供的订单完成触发钩子:woocommerce_order_status_completed,这样订单状态变为“已完成”时,你的函数才会执行。
2. 循环变量与字段调用混乱
- 你在
foreach里把订单项命名为$orderid,但后面又用了$item['product_id'],变量名完全不匹配,得统一用$item; - 订单项对象里没有直接的
product_cat属性,不能直接通过$orderid['product_cat']获取分类ID,必须先拿到产品对象,再检查分类归属。
3. 产品获取函数已过时
get_product()是WooCommerce旧版本的函数,现在已经被弃用,应该用wc_get_product()来获取产品对象。
4. 缺少核心的邮件发送代码
你只定义了收件人和头信息,但没有调用wp_mail()来实际发送邮件,等于只搭了架子没启动流程。
修复后的完整代码
// 替换为订单完成的官方触发钩子 add_action( 'woocommerce_order_status_completed', 'send_email_for_category_630', 10, 1 ); function send_email_for_category_630( $order_id ) { $order = wc_get_order( $order_id ); if ( ! $order ) return; // 确保订单对象有效,避免报错 $has_target_category = false; // 遍历订单内所有商品项 foreach( $order->get_items() as $item ) { $product_id = $item->get_product_id(); $product = wc_get_product( $product_id ); if ( ! $product ) continue; // 检查当前商品是否属于ID为630的分类 if ( has_term( 630, 'product_cat', $product_id ) ) { $has_target_category = true; break; // 找到目标商品就停止循环,避免重复检查 } } // 确认存在目标分类商品后,发送邮件 if ( $has_target_category ) { $to_email = $order->get_billing_email(); $subject = '您的订单包含特定品类商品'; $message = '感谢您的订单!您购买的商品中包含我们的特定品类商品,如有疑问可随时联系我们。'; // 自定义邮件内容 $headers = array( 'From: 你的商店名称 <your-shop-email@example.com>' ); // 完善发件人信息 // 执行邮件发送 wp_mail( $to_email, $subject, $message, $headers ); } }
额外说明
- 我加了
$has_target_category变量,确保只要订单里有一个符合条件的商品就只发一次邮件,避免重复发送; - 用
has_term()函数检查产品分类,这是WooCommerce官方推荐的标准方式; - 补充了订单和产品对象的有效性检查,避免出现PHP警告或错误;
- 邮件的主题、内容和发件人信息你可以根据自己的需求修改。
内容的提问来源于stack exchange,提问作者Marc Jones
相关产品推荐
相关产品推荐

