You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:43:21