Tự động hủy đơn hàng nếu chưa thanh toán sau 1 giờ trong WooCommerce

Bài viết này sẽ hướng dẫn bạn tự động hủy đơn hàng chưa thanh toán sau 1 giờ bằng cách sử dụng wp_schedule_single_event.

Tự động hủy đơn hàng nếu chưa thanh toán sau 1 giờ trong WooCommerce

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


  • Không có bình luận.