Code ẩn thanh toán khi nhận hàng với đơn hàng giá trị cao trong WooCommerce
Bài viết này mình sẽ hướng dẫn bạn cách ẩn thanh toán khi nhận hàng với đơn hàng giá trị cao trong WooCommerce nhé.
Đơn vài trăm nghìn cho khách trả COD thì không sao, nhưng đơn 5–10 triệu mà khách từ chối nhận thì shop vừa mất phí ship 2 chiều vừa ôm hàng hoàn về, lỗ nặng. Nhiều shop vì vậy chỉ cho COD với đơn nhỏ, đơn lớn bắt thanh toán trước. WooCommerce mặc định chỉ cho giới hạn COD theo phương thức vận chuyển, không có chỗ nào để giới hạn theo giá trị đơn hàng, nên muốn ẩn COD với đơn lớn thì bạn phải code thêm bằng PHP nhé.
Mục lục nội dung bài viếtHiện
Thêm code ẩn COD với đơn giá trị cao
Bạn chỉ cần thêm code dưới vào cuối file functions.php của child theme nhé. Nhớ sao lưu file trước khi sửa, và đừng chèn vào theme cha vì khi theme cập nhật sẽ mất code.
<?php
// Ẩn thanh toán khi nhận hàng (COD) với đơn hàng giá trị cao trong WooCommerce
// Cách dùng: dán code này vào cuối file functions.php của child theme.
// Đơn nào có tổng tiền hàng trên 5.000.000đ thì không cho chọn COD nữa,
// khách phải thanh toán trước bằng chuyển khoản hoặc phương thức khác.
// Đổi số 5000000 trong code nếu bạn muốn đặt mức khác.
// Lưu ý: mức so sánh là tổng tiền hàng chưa tính phí vận chuyển và thuế.
add_filter( 'woocommerce_available_payment_gateways', 'nn_an_cod_don_gia_tri_cao' );
function nn_an_cod_don_gia_tri_cao( $gateways ) {
if ( is_admin() || ! function_exists( 'WC' ) || ! WC()->cart ) {
return $gateways;
}
if ( ! isset( $gateways['cod'] ) ) {
return $gateways;
}
$han_muc = 5000000;
$tong_tien_hang = (float) WC()->cart->get_subtotal();
if ( $tong_tien_hang > $han_muc ) {
unset( $gateways['cod'] );
}
return $gateways;
}
Code trên móc vào filter woocommerce_available_payment_gateways, filter này WooCommerce chạy mỗi lần lấy danh sách phương thức thanh toán để hiện ở trang thanh toán, cả trang thanh toán cổ điển lẫn khối checkout mới đều đọc qua filter này. Hàm kiểm tra 3 điều kiện an toàn trước: bỏ qua trong trang quản trị nhờ is_admin() để COD vẫn hiện ở màn hình Cài đặt → Thanh toán, kiểm tra WC()->cart tồn tại vì filter có thể chạy khi chưa có giỏ hàng, và kiểm tra COD có trong danh sách không. Mức giới hạn đặt trong biến $han_muc là 5.000.000đ; tổng tiền hàng lấy qua WC()->cart->get_subtotal() là tiền hàng chưa tính phí vận chuyển và thuế, đơn nào vượt mức thì unset( $gateways[‘cod’] ) để COD biến khỏi danh sách.
Kiểm tra COD đã ẩn chưa
Trước hết bạn bật COD ở WooCommerce → Cài đặt → Thanh toán → Thanh toán khi nhận hàng. Thêm sản phẩm vào giỏ sao cho tổng tiền hàng dưới 5 triệu, vào trang thanh toán sẽ thấy COD vẫn hiện. Thêm tiếp cho tổng vượt 5 triệu rồi tải lại trang thanh toán, lựa chọn COD biến mất, chỉ còn chuyển khoản và các phương thức khác. Đổi số 5000000 trong code thành mức của shop bạn, ví dụ 2000000 cho shop bán hàng giá trị vừa.

Lưu ý khi dùng
Mức so sánh là tổng tiền hàng chưa tính phí vận chuyển và thuế; nếu bạn muốn tính cả phí ship thì đổi get_subtotal() thành get_total(‘edit’) trong code. Bài này khác với bài code thêm phụ phí khi khách chọn thanh toán khi nhận hàng (COD) trong WooCommerce: bài đó vẫn giữ COD nhưng thu thêm phí, còn bài này ẩn hẳn COD với đơn lớn. Nếu shop bạn chỉ còn đúng một phương thức thanh toán là COD thì đừng dùng code này, vì đơn lớn sẽ không còn cách nào để thanh toán. Tính năng này đi chung với bài code chỉ hiện miễn phí vận chuyển và nhận tại cửa hàng khi đủ điều kiện trong WooCommerce là thành bộ điều kiện theo giá trị giỏ hàng cho shop.
Kết luận
Vậy là chỉ với 1 đoạn code ngắn bạn đã ẩn thanh toán khi nhận hàng với đơn hàng giá trị cao trong WooCommerce mà không cần cài thêm plugin rồi nhé. Tính năng này đi chung với bài code thêm phụ phí khi khách chọn thanh toán khi nhận hàng (COD) trong WooCommerce và bài code chỉ hiện miễn phí vận chuyển và nhận tại cửa hàng khi đủ điều kiện trong WooCommerce là thành bộ kiểm soát rủi ro đơn hàng cho shop WooCommerce.
Nếu cần mình kèm 1-1 về WooCommerce thì cứ liên hệ mình nhé.
