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

成功实现指定StackOverflow方案后,如何将BACS账户筛选逻辑应用至订单确认邮件?

解决方案:将BACS账户筛选逻辑迁移到订单确认邮件

嘿,我来帮你把之前的BACS账户筛选逻辑无缝迁移到订单确认邮件里!核心思路和你之前做的一致——根据订单元数据从多个可用账户里精准挑出对应那一个,下面是具体的落地步骤:

1. 先封装通用的账户筛选函数

把之前的筛选逻辑抽成可复用的函数,这样不管在什么场景都能直接调用,灵活性拉满:

function get_target_bacs_account($order) {
    // 先获取订单里的目标元数据,把这里的元键改成你实际用的
    $order_matching_value = $order->get_meta('_your_custom_order_meta_key');
    
    // 拉取所有后台配置的BACS账户
    $all_bacs_accounts = get_option('woocommerce_bacs_accounts');
    
    // 遍历账户列表,找到和订单元数据匹配的那一个
    foreach ($all_bacs_accounts as $account) {
        // 这里的匹配规则你可以按需调整,比如用账户名称、ID或者自定义字段匹配
        if ($account['account_name'] === $order_matching_value) {
            return $account;
        }
    }
    
    // 万一没匹配到,就返回第一个账户当兜底
    return reset($all_bacs_accounts);
}

2. 替换订单确认邮件的账户输出逻辑

接下来要拦截订单确认邮件里原本输出所有BACS账户的代码,换成我们筛选后的单个账户,这里给你两种常用方法:

方法一:用钩子实现(推荐,不用改模板)

WooCommerce提供了现成的钩子,直接用woocommerce_email_payment_method就能替换支付方式的显示内容:

add_action('woocommerce_email_payment_method', 'render_filtered_bacs_in_order_email', 10, 3);
function render_filtered_bacs_in_order_email($payment_method, $order, $sent_to_admin) {
    // 只针对发给用户的订单确认邮件,管理员邮件保持默认
    if (!$sent_to_admin && $order->get_payment_method() === 'bacs') {
        $target_account = get_target_bacs_account($order);
        
        // 构建和原邮件风格一致的账户信息HTML
        $custom_payment_html = '<h2>' . __('Bank Transfer Details', 'woocommerce') . '</h2>';
        $custom_payment_html .= '<p>' . __('Please use the following bank details to complete your payment:', 'woocommerce') . '</p>';
        $custom_payment_html .= '<ul class="order_details bacs_details">';
        $custom_payment_html .= '<li class="bank_name">' . __('Bank Name:', 'woocommerce') . ' ' . esc_html($target_account['bank_name']) . '</li>';
        $custom_payment_html .= '<li class="account_name">' . __('Account Name:', 'woocommerce') . ' ' . esc_html($target_account['account_name']) . '</li>';
        $custom_payment_html .= '<li class="account_number">' . __('Account Number:', 'woocommerce') . ' ' . esc_html($target_account['account_number']) . '</li>';
        $custom_payment_html .= '<li class="sort_code">' . __('Sort Code:', 'woocommerce') . ' ' . esc_html($target_account['sort_code']) . '</li>';
        // 要是有IBAN、SWIFT这类字段,也可以加上
        if (!empty($target_account['iban'])) {
            $custom_payment_html .= '<li class="iban">' . __('IBAN:', 'woocommerce') . ' ' . esc_html($target_account['iban']) . '</li>';
        }
        if (!empty($target_account['bic'])) {
            $custom_payment_html .= '<li class="bic">' . __('BIC/SWIFT:', 'woocommerce') . ' ' . esc_html($target_account['bic']) . '</li>';
        }
        $custom_payment_html .= '</ul>';
        
        echo $custom_payment_html;
    } else {
        // 其他情况还是输出默认的支付方式内容
        echo $payment_method;
    }
}

方法二:修改邮件模板(适合高度自定义需求)

如果你已经在用自定义邮件模板,可以直接修改woocommerce/emails/customer-processing-order.php(对应订单处理中的确认邮件,要是是其他状态就找对应模板),把原有的BACS输出代码替换成:

// 原模板里的BACS输出代码大概是这样的:
// if ( $order->get_payment_method() === 'bacs' ) {
//     wc_get_template( 'emails/bacs-details.php', array( 'order' => $order ) );
// }

// 替换成我们的自定义逻辑:
if ( $order->get_payment_method() === 'bacs' ) {
    $target_account = get_target_bacs_account($order);
    wc_get_template( 'emails/custom-bacs-details.php', array( 'account' => $target_account, 'order' => $order ) );
}

然后新建一个custom-bacs-details.php模板文件,内容就用上面钩子里的HTML结构就行,这样就能完全自定义账户的显示样式了。

3. 测试验证

最后记得创建测试订单,设置好对应的元数据,发送订单确认邮件检查一下——要是邮件里只显示了匹配的那一个BACS账户,就说明搞定啦!如果有问题,调整筛选函数里的匹配规则就行。


内容的提问来源于stack exchange,提问作者Gustavo Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:12:38