成功实现指定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
相关产品推荐
相关产品推荐

