Mặc định khi khách checkout chọn "Direct Bank Transfer", WooCommerce gửi email với khối thông tin BACS từ Settings → Payments. Vấn đề: nội dung cứng nhắc, không dynamic theo order_id.

Cách dưới đây tắt block BACS mặc định và inject custom block với mã đơn hàng tự sinh.

Code cần thêm vào functions.php

// Tắt nội dung BACS mặc định
add_filter('woocommerce_bacs_accounts', '__return_false');

// Inject thông tin tuỳ biến vào email "On-hold"
add_action('woocommerce_email_before_order_table', 'email_instructions_HH', 10, 3);

function email_instructions_HH($order, $sent_to_admin, $plain_text = false) {
    if (!$sent_to_admin
        && 'bacs' === $order->get_payment_method()
        && $order->has_status('on-hold')) {
        bank_details_HH($order->get_id());
    }
}

function bank_details_HH($order_id = '') { ?>
    <h2>Thông tin chuyển khoản ngân hàng</h2>
    <ul>
      <li>Ngân hàng: ACB</li>
      <li>Số tài khoản: 5847</li>
      <li>Chủ tài khoản: Phạm Huy Hoàng</li>
      <li>Nội dung: HH<?php echo $order_id ?></li>
    </ul>
<?php }

Lưu ý khi triển khai

  • Đặt code vào functions.php của child theme, không phải parent — để theme update không xoá mất
  • Đổi thông tin ngân hàng sang TK của bạn
  • Tiền tố HH phải khớp với cấu hình bên hethongsms.com / BeePay để webhook match được

Sau khi áp dụng, mỗi email "Đơn hàng đang chờ thanh toán" sẽ chứa order_id duy nhất — webhook ngân hàng đối soát nhanh hơn, ít nhầm khách.