Nếu bạn đang dùng WooCommerce, có thể bạn đã từng nhận phản hồi từ khách hàng: “Bấm đặt hàng xong chờ mãi mới thấy trang thành công”. Bài viết này giải thích nguyên nhân và cách khắc phục chỉ bằng một dòng code.
Vấn đề: Checkout bị chậm ở bước cuối
Sau khi khách bấm “Đặt hàng”, người dùng phải chờ vài giây (đôi khi 3–10 giây) mới thấy trang xác nhận thành công. Trải nghiệm này khiến khách hàng lo lắng, thậm chí bấm lại nhiều lần dẫn đến đặt đơn trùng.
Nguyên nhân: WooCommerce gửi email đồng bộ (synchronous)
Đây là luồng xử lý mặc định của WooCommerce khi đặt hàng:
- Khách bấm Đặt hàng
- WooCommerce tạo đơn hàng trong database
- WooCommerce gọi
wp_mail()→ gửi email xác nhận cho khách + thông báo cho admin - Server phải chờ SMTP phản hồi (kết nối, xác thực, truyền dữ liệu…)
- Sau khi mail gửi xong → mới redirect sang trang Đặt hàng thành công
Tức là toàn bộ thời gian chờ = thời gian gửi mail. Nếu SMTP chậm hoặc timeout thì khách hàng phải đợi rất lâu.
Đây là thiết kế mặc định của WooCommerce — email được gửi synchronous trong cùng một HTTP request trước khi trả về redirect.
Giải pháp: 1 dòng code — filter có sẵn của WooCommerce
WooCommerce đã tích hợp sẵn cơ chế defer email từ phiên bản 3.x. Chỉ cần bật filter này trong functions.php của child theme:
add_filter( 'woocommerce_defer_transactional_emails', '__return_true' );Cơ chế hoạt động
Khi filter trả về true, WooCommerce tự động thay đổi luồng xử lý:
// Khi filter = true, WooCommerce tự động:
// 1. Checkout hoàn tất → redirect ngay về trang thành công
// 2. Hook "shutdown" kích hoạt sau khi response gửi về browser
// 3. WC_Background_Emailer dispatch email trong background requestCụ thể, WooCommerce dùng WC_Background_Emailer — một background processor có sẵn — để đưa email vào queue, rồi dispatch sau khi PHP đã gửi response về browser (hook shutdown). Email vẫn đến đầy đủ, chỉ là gửi sau khi khách hàng đã thấy trang thành công.
Kết quả mong đợi
| Trước khi tối ưu | Sau khi tối ưu | |
|---|---|---|
| Thời gian chờ sau “Đặt hàng” | 3 – 10 giây (hoặc hơn) | ~ 0.5 – 1 giây |
| Khách hàng nhận email | Ngay (nhưng checkout chậm) | Sau 2 – 5 giây (không đáng kể) |
| Nguy cơ đặt đơn trùng | Cao (khách bấm lại do chờ) | Rất thấp |
Yêu cầu & Lưu ý
- WooCommerce phiên bản 3.0 trở lên (filter này đã tồn tại từ rất lâu)
- Thêm vào child theme, không sửa trực tiếp theme gốc để không bị mất khi update
- WooCommerce Action Scheduler phải hoạt động bình thường (mặc định đã bật)
- Không cần cài thêm plugin, không cần tự viết background job — WooCommerce xử lý toàn bộ
Nếu bạn đang dùng Hệ Thống SMS để nhận thanh toán, kết hợp thêm giải pháp này sẽ giúp toàn bộ luồng checkout — từ lúc bấm đặt hàng đến lúc xác nhận thanh toán — diễn ra nhanh và mượt mà hơn đáng kể.
