auto apply_coupon

add_action('woocommerce_before_calculate_totals', 'apply_coupon_if_eligible');

function apply_coupon_if_eligible($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    // Đảm bảo chỉ chạy một lần
    if (did_action('woocommerce_before_calculate_totals') >= 2) {
        return;
    }

    $coupon_code = 'COUPON_CODE'; // Thay COUPON_CODE bằng mã giảm giá của bạn
    $minimum_amount = 500000; // Số tiền tối thiểu để áp dụng mã giảm giá (nếu có)

    // Kiểm tra điều kiện áp dụng
    if ($cart->subtotal >= $minimum_amount) {
        // Kiểm tra xem mã đã được áp dụng chưa
        if (!$cart->has_discount($coupon_code)) {
            $cart->apply_coupon($coupon_code);
            wc_add_notice(__('Mã giảm giá đã được tự động áp dụng cho đơn hàng của bạn!'), 'success');
        }
    } else {
        // Gỡ mã giảm giá nếu không đủ điều kiện
        if ($cart->has_discount($coupon_code)) {
            $cart->remove_coupon($coupon_code);
            wc_add_notice(__('Đơn hàng không còn đủ điều kiện áp dụng mã giảm giá.'), 'notice');
        }
    }
}
add_action('woocommerce_before_calculate_totals', 'apply_multiple_coupons_if_eligible');

function apply_multiple_coupons_if_eligible($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }

    // Đảm bảo chỉ chạy một lần
    if (did_action('woocommerce_before_calculate_totals') >= 2) {
        return;
    }

    // Danh sách mã giảm giá và điều kiện
    $coupons = [
        [
            'code' => 'DISCOUNT10', // Mã giảm giá 1
            'minimum_amount' => 500000, // Điều kiện số tiền tối thiểu
            'categories' => [12, 15], // Áp dụng cho danh mục cụ thể (IDs)
        ],
        [
            'code' => 'FREESHIP', // Mã giảm giá 2
            'minimum_amount' => 300000, // Điều kiện số tiền tối thiểu
            'products' => [101, 102], // Áp dụng cho sản phẩm cụ thể (IDs)
        ],
        [
            'code' => 'SALE20', // Mã giảm giá 3
            'minimum_amount' => 700000, // Điều kiện số tiền tối thiểu
            'all_products' => true, // Áp dụng cho toàn bộ đơn hàng
        ],
    ];

    foreach ($coupons as $coupon) {
        $coupon_code = $coupon['code'];

        // Kiểm tra xem mã giảm giá đã được áp dụng chưa
        if ($cart->has_discount($coupon_code)) {
            continue;
        }

        $eligible = false;

        // Kiểm tra điều kiện số tiền tối thiểu
        if (!empty($coupon['minimum_amount']) && $cart->subtotal >= $coupon['minimum_amount']) {
            $eligible = true;
        }

        // Kiểm tra danh mục
        if (!empty($coupon['categories'])) {
            $category_in_cart = false;
            foreach ($cart->get_cart() as $cart_item) {
                $product_id = $cart_item['product_id'];
                $categories = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);
                if (array_intersect($categories, $coupon['categories'])) {
                    $category_in_cart = true;
                    break;
                }
            }
            $eligible = $eligible && $category_in_cart;
        }

        // Kiểm tra sản phẩm
        if (!empty($coupon['products'])) {
            $product_in_cart = false;
            foreach ($cart->get_cart() as $cart_item) {
                if (in_array($cart_item['product_id'], $coupon['products'])) {
                    $product_in_cart = true;
                    break;
                }
            }
            $eligible = $eligible && $product_in_cart;
        }

        // Kiểm tra áp dụng cho tất cả sản phẩm
        if (!empty($coupon['all_products'])) {
            $eligible = $eligible && true;
        }

        // Áp dụng mã giảm giá nếu đủ điều kiện
        if ($eligible) {
            $cart->apply_coupon($coupon_code);
            wc_add_notice(__('Mã giảm giá "' . $coupon_code . '" đã được tự động áp dụng.'), 'success');
        } else {
            // Gỡ bỏ mã giảm giá nếu không còn đủ điều kiện
            if ($cart->has_discount($coupon_code)) {
                $cart->remove_coupon($coupon_code);
                wc_add_notice(__('Đơn hàng không còn đủ điều kiện cho mã giảm giá "' . $coupon_code . '".'), 'notice');
            }
        }
    }
}