Active License Elementor Pro chỉ với 300k/năm/domain Shop Now
Mới Dịch vụ thiết kế website, xử lý mã độc & tối ưu tốc độ chuyên sâu

Code giới hạn mỗi khách chỉ mua 1 sản phẩm khuyến mãi trong WooCommerce

Trang giỏ hàng với thông báo đỏ Mỗi đơn hàng chỉ được mua 1 sản phẩm khuyến mãi, sản phẩm Serum Vitamin C giảm 30% có số lượng 1

Bài viết này mình sẽ hướng dẫn bạn cách giới hạn mỗi khách chỉ mua 1 sản phẩm khuyến mãi trong WooCommerce nhé.

Shop chạy chương trình “mỗi khách chỉ mua 1 sản phẩm khuyến mãi” để chống ôm hàng giá rẻ rồi bán lại, nhưng WooCommerce mặc định không chặn được kiểu này. WooCommerce có sẵn tùy chọn “Bán riêng lẻ” cho từng sản phẩm, nhưng nó chỉ giới hạn số lượng của chính sản phẩm đó, không chặn được khách mua 2 sản phẩm khuyến mãi khác nhau trong cùng một đơn. Muốn giới hạn theo cả giỏ hàng thì bạn phải code thêm nhé.

Thêm code giới hạn sản phẩm khuyến mãi

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
// Giới hạn mỗi khách chỉ mua 1 sản phẩm khuyến mãi trong mỗi đơn hàng
// Cách dùng: dán code này vào cuối file functions.php của child theme,
// WooCommerce tự chặn khi khách thêm sản phẩm khuyến mãi thứ hai vào giỏ
add_filter('woocommerce_add_to_cart_validation', 'nn_gioi_han_san_pham_khuyen_mai', 10, 4);
function nn_gioi_han_san_pham_khuyen_mai($duoc_phep, $product_id, $so_luong, $variation_id) {
    $san_pham = wc_get_product($product_id);
    if (!is_object($san_pham) || !$san_pham->is_on_sale()) {
        return $duoc_phep;
    }
    if ($so_luong > 1) {
        wc_add_notice('Sản phẩm khuyến mãi chỉ được mua tối đa 1 cái mỗi đơn hàng.', 'error');
        return false;
    }
    if (!is_object(WC()->cart)) {
        return $duoc_phep;
    }
    foreach (WC()->cart->get_cart() as $item) {
        $sp_trong_gio = $item['data'];
        if (is_object($sp_trong_gio) && $sp_trong_gio->is_on_sale()) {
            wc_add_notice('Mỗi đơn hàng chỉ được mua 1 sản phẩm khuyến mãi. Bạn hãy thanh toán đơn hiện tại trước nhé.', 'error');
            return false;
        }
    }
    return $duoc_phep;
}

add_filter('woocommerce_update_cart_validation', 'nn_gioi_han_cap_nhat_gio_khuyen_mai', 10, 4);
function nn_gioi_han_cap_nhat_gio_khuyen_mai($duoc_phep, $cart_item_key, $values, $so_luong) {
    if ($so_luong <= 1) {
        return $duoc_phep;
    }
    $san_pham = isset($values['data']) ? $values['data'] : null;
    if (is_object($san_pham) && $san_pham->is_on_sale()) {
        wc_add_notice('Sản phẩm khuyến mãi chỉ được mua tối đa 1 cái mỗi đơn hàng.', 'error');
        return false;
    }
    return $duoc_phep;
}

Code trên có hai phần. Phần đầu móc vào filter woocommerce_add_to_cart_validation, chạy ngay trước khi WooCommerce cho sản phẩm vào giỏ: nếu sản phẩm đang giảm giá (hàm is_on_sale() trả về đúng) mà khách chọn số lượng lớn hơn 1 thì chặn và hiện thông báo lỗi, nếu giỏ hàng đã có sẵn một sản phẩm khuyến mãi khác thì cũng chặn và báo khách thanh toán đơn hiện tại trước. Phần sau móc vào filter woocommerce_update_cart_validation để chặn luôn đường vòng: khách đã có sản phẩm khuyến mãi trong giỏ mà tăng số lượng lên 2 ở trang giỏ hàng thì cũng bị chặn, không lọt qua được.

Kiểm tra giới hạn trên shop

Bạn thêm một sản phẩm đang giảm giá vào giỏ, rồi thêm tiếp một sản phẩm khuyến mãi khác, WooCommerce sẽ hiện thông báo lỗi đỏ “Mỗi đơn hàng chỉ được mua 1 sản phẩm khuyến mãi” và không thêm sản phẩm thứ hai vào giỏ. Thử tăng số lượng sản phẩm khuyến mãi trong giỏ lên 2 rồi bấm cập nhật giỏ hàng thì cũng bị chặn với thông báo tương tự. Sản phẩm không giảm giá thì vẫn thêm và mua bình thường, không bị ảnh hưởng.

Trang giỏ hàng với thông báo đỏ Mỗi đơn hàng chỉ được mua 1 sản phẩm khuyến mãi, sản phẩm Serum Vitamin C giảm 30% có số lượng 1
Kết quả: WooCommerce hiện thông báo lỗi đỏ và chặn khi khách thêm sản phẩm khuyến mãi thứ hai vào giỏ hàng.

Lưu ý khi dùng

Quy tắc này tính theo mỗi đơn hàng (giỏ hàng hiện tại), khách vẫn mua được sản phẩm khuyến mãi khác ở đơn sau, đúng với cách hầu hết shop chạy chương trình “mỗi khách 1 sản phẩm”. “Sản phẩm khuyến mãi” ở đây là sản phẩm đang có giá sale theo hàm is_on_sale(), kể cả giảm giá theo lịch đã hẹn trước. Nếu shop bạn muốn giới hạn theo một danh mục riêng thay vì mọi sản phẩm giảm giá thì thay điều kiện is_on_sale() bằng kiểm tra danh mục của sản phẩm. Tính năng này đi chung với bài code đặt số lượng mua tối thiểu cho sản phẩm trong WooCommerce là thành combo kiểm soát số lượng mua cho shop chạy khuyến mãi.

Kết luận

Vậy là chỉ với 1 đoạn code ngắn bạn đã giới hạn mỗi khách chỉ mua 1 sản phẩm khuyến mãi trong WooCommerce rồi nhé. Tính năng này đi chung với bài code đặt số lượng mua tối thiểu cho sản phẩm trong WooCommerce và bài code tự động áp dụng mã giảm giá khi khách vào link trong WooCommerce là thành bộ công cụ chạy khuyến mãi gọn gàng cho shop WooCommerce.

Nếu cần mình kèm 1-1 về WooCommerce thì cứ liên hệ mình nhé.

Nhân Viên

Nhân Viên

Web Developer & WordPress Expert

Ngọc Nguyễn - Chuyên gia thiết kế Website WordPress, tối ưu tốc độ 90+ và xử lý dứt điểm mã độc. Đam mê chia sẻ kiến thức hữu ích đến cộng đồng lập trình & webmaster.

Để lại bình luận hoặc thắc mắc

Email của bạn sẽ không được hiển thị công khai.

Ngọc Nguyễn
Ngọc Nguyễn
| Thiết kế Website | Hosting tốc độ cao | Giải pháp hạ tầng | Fix lỗi WordPress, mã độc | Tối ưu tốc độ | Thiết kế Website | Hosting tốc độ cao | Giải pháp hạ tầng | Fix lỗi WordPress, mã độc | Tối ưu tốc độ
Tư vấn miễn phí