Trong WooCommerce, các đơn hàng sử dụng phương thức chuyển khoản ngân hàng (Bank Transfer – bacs
) thường ở trạng thái “Tạm giữ” (on-hold) cho đến khi bạn xác nhận đã nhận được thanh toán. Tuy nhiên, nếu người mua không thanh toán trong một khoảng thời gian nhất định, bạn nên tự động hủy đơn hàng để tránh tồn đọng.
Các bài viết tham khảo:
Lợi ích
- Tự động hóa quy trình xử lý đơn hàng
- Hạn chế số lượng đơn hàng ảo
- Giữ số lượng tồn kho được cập nhật chính xác hơn
Cách thực hiện
Để tự động hủy đơn hàng nếu chưa thanh toán sau 1 giờ, các bạn thêm đoạn mã sau vào functions.php
.
/**
* Tự động hủy đơn hàng không thanh toán sau 1 giờ (chỉ áp dụng cho BACS)
*/
add_action( 'woocommerce_order_status_on-hold', 'schedule_auto_cancel_unpaid_bacs_order' );
function schedule_auto_cancel_unpaid_bacs_order( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_payment_method() !== 'bacs' ) {
return;
}
if ( ! wp_next_scheduled( 'auto_cancel_unpaid_bacs_order', array( $order_id ) ) ) {
wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'auto_cancel_unpaid_bacs_order', array( $order_id ) );
}
}
add_action( 'auto_cancel_unpaid_bacs_order', 'auto_cancel_bacs_order' );
function auto_cancel_bacs_order( $order_id ) {
$order = wc_get_order( $order_id );
// Xóa lịch đã lên để tránh trùng
wp_clear_scheduled_hook( 'auto_cancel_unpaid_bacs_order', array( $order_id ) );
if ( $order && $order->has_status( 'on-hold' ) && $order->get_payment_method() === 'bacs' ) {
$order->update_status(
'cancelled',
__( 'Đơn hàng đã bị hủy do chưa thanh toán sau 1 giờ.', 'textdomain' )
);
}
}
Giải thích hoạt động
- Khi đơn hàng chuyển sang trạng thái
on-hold
(ví dụ như đơn chuyển khoản ngân hàng), một cron job sẽ được lập lịch để chạy sau 1 giờ - Sau đúng 1 giờ, hệ thống sẽ kiểm tra xem đơn hàng đó còn ở trạng thái on-hold và có đúng phương thức thanh toán là
bacs
không - Nếu có, đơn hàng sẽ bị tự động chuyển sang trạng thái “Đã hủy” (cancelled) kèm ghi chú lý do
Tuỳ biến
Bạn có thể sửa dòng này:
if ( ! $order || $order->get_payment_method() !== 'bacs' )
Thành phương thức bạn dùng, ví dụ:
paypal
cod
sepays
(nếu bạn đang dùng SePay hoặc plugin thanh toán QR riêng)
Lưu ý khi sử dụng
- Mã này sử dụng hệ thống cron nội bộ của WordPress, nên yêu cầu có traffic để đảm bảo cron chạy đúng thời gian
- Nếu website không có traffic, bạn nên bật WP-Cron qua máy chủ (server-level cron) để đảm bảo lịch trình chính xác
Kết luận
Tự động hủy đơn hàng chưa thanh toán sau 1 giờ là cách đơn giản nhưng hiệu quả để đảm bảo hệ thống WooCommerce hoạt động trơn tru, đặc biệt là với các website có lượng đơn hàng lớn hoặc sử dụng phương thức chuyển khoản.
Chúc bạn tối ưu cửa hàng WooCommerce thành công!
Bình Luận