WooCommerce:如何根据商品变体属性值添加邮件收件人
WooCommerce 条件邮件收件人代码问题分析与修正
代码存在的核心问题
- 对象与字符串直接比较错误:
$variation是WC_Product_Variation对象,你直接把它和字符串"Branch"比较,这永远不会成立。你需要获取变体对应的具体属性值来判断,而非对象本身。 - 数组与字符串比较错误:
$variation_attributes是关联数组(键为属性slug,值为属性值),直接和字符串"BT"/"PW"/"TP"比较逻辑完全错误,数组与字符串不可能相等。 - 循环内提前返回:
return $recipient写在foreach循环内部,导致代码只处理订单第一个商品项就直接返回,后续商品属性不会被检查。 - 邮箱格式错误:拼接收件人时未加逗号分隔,多个邮箱连在一起会导致邮件无法正常发送(正确格式应为
recipient1@email.com, recipient2@email.com)。 - 未处理非变体商品:订单中如果有非变体商品,
$item['variation_id']为0,此时wc_get_product(0)返回null,调用get_variation_attributes()会触发报错。 - 未过滤非产品项:订单项目可能包含运费、优惠券等非产品类条目,未过滤会导致无效处理。
修正后的代码
function sv_conditional_email_recipient( $recipient, $order ) { // 验证订单对象有效性 if ( ! is_a( $order, 'WC_Order' ) ) { return $recipient; } // 替换为你实际的属性slug(比如pa_branch) $target_attribute = 'pa_branch'; // 存储额外收件人,避免重复添加 $additional_recipients = array(); foreach ( $order->get_items() as $item_id => $item ) { // 只处理产品类订单项 if ( ! $item->is_type('line_item') ) { continue; } $variation_id = $item->get_variation_id(); // 跳过非变体商品 if ( empty( $variation_id ) ) { continue; } $variation = wc_get_product( $variation_id ); // 验证变体对象有效性 if ( ! is_a( $variation, 'WC_Product_Variation' ) ) { continue; } $variation_attributes = $variation->get_variation_attributes(); // 检查目标属性是否存在 if ( isset( $variation_attributes[ $target_attribute ] ) ) { $attribute_value = $variation_attributes[ $target_attribute ]; // 根据属性值匹配对应收件人 switch( $attribute_value ) { case 'BT': $additional_recipients['bt@email.com'] = true; break; case 'PW': $additional_recipients['pw@email.com'] = true; break; case 'TP': $additional_recipients['tp@email.com'] = true; break; } } } // 拼接额外收件人到原收件人列表 if ( ! empty( $additional_recipients ) ) { $recipient .= ', ' . implode( ', ', array_keys( $additional_recipients ) ); } return $recipient; } add_filter( 'woocommerce_email_recipient_new_order', 'sv_conditional_email_recipient', 15, 2 );
修正说明
- 增加了对象有效性检查,避免触发PHP错误。
- 仅处理产品类订单项,过滤掉运费、优惠券等无效条目。
- 使用数组存储额外收件人,避免重复添加同一邮箱。
- 正确提取属性值进行判断,修复了对象/数组与字符串直接比较的逻辑错误。
- 将return语句移至循环外部,确保所有商品项都被处理。
- 用逗号分隔多个邮箱,保证邮件格式符合要求。
内容的提问来源于stack exchange,提问作者Kc Tan
相关产品推荐
相关产品推荐

