WooCommerce: автоматическое создание скидки при покупке N товаров без использования плагинов

Диагностика задачи: как автоматически применять скидку в WooCommerce при покупке определённого количества товаров

Частая задача — дать скидку клиенту, который добавил в корзину определённое количество товаров (например, 3 и более). Обычно для этого используют плагины, но их избыток замедляет сайт и усложняет поддержку. Лучшее решение — реализовать эту логику через собственный код в functions.php или в кастомном плагине.

Перед началом важно проверить, что в WooCommerce настроены базовые корзинные хуки и что у вас есть доступ к файлу functions.php вашей темы или дочерней темы.

Пошаговое решение: добавляем автоматическую скидку при покупке N товаров

1. Проверяем количество товаров в корзине

Для начала нужно подсчитать общее количество товаров в корзине, не считая вариаций, а именно суммарное количество позиций.

function get_cart_items_count() {
    $count = 0;
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $count += $cart_item['quantity'];
    }
    return $count;
}

2. Добавляем скидку через фильтр woocommerce_cart_calculate_fees

Этот хук позволит добавить отрицательную плату (скидку) к корзине. Важно, чтобы функция не дублировала скидку при каждом пересчёте.

add_action( 'woocommerce_cart_calculate_fees', 'apply_bulk_discount_based_on_quantity' );
function apply_bulk_discount_based_on_quantity() {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Пропускаем админку

    $minimum_quantity = 3; // Минимальное количество для скидки
    $discount_percent = 10; // Процент скидки

    $cart = WC()->cart;
    $items_count = 0;
    $cart_total = $cart->get_subtotal(); // Без налогов и скидок

    foreach ( $cart->get_cart() as $cart_item ) {
        $items_count += $cart_item['quantity'];
    }

    if ( $items_count >= $minimum_quantity ) {
        $discount = $cart_total * ( $discount_percent / 100 );
        $cart->add_fee( 'Скидка за покупку 3 и более товаров', -$discount );
    }
}

3. Добавляем локализацию и проверяем правильность отображения скидки

Название скидки можно заменить на любой текст, желательно на русском языке или с локализацией.

Проверка результата после внедрения

  1. Очистите корзину.
  2. Добавьте в корзину 1-2 товара — скидка не должна появиться.
  3. Добавьте в корзину 3 и более товаров — скидка должна появиться в итогах заказа.
  4. Проверьте, что сумма скидки соответствует 10% от суммы товаров без учёта налогов.
  5. Обновите корзину, чтобы убедиться, что скидка не дублируется.

Частые ошибки и их исправление

  • Скидка дублируется после обновления корзины. Причина: добавление скидки происходит несколько раз без проверки. Решение: в нашем коде мы используем add_fee без условия удаления старых скидок, но WooCommerce сбрасывает корзину при каждом пересчёте, поэтому дублирования нет. Если вы добавляете вручную, используйте проверку.
  • Скидка применяется при любом количестве товаров. Проверьте переменную $minimum_quantity и подсчёт количества товаров.
  • Скидка не отображается. Проверьте, что хук woocommerce_cart_calculate_fees зарегистрирован правильно и функция не прерывается ошибками. Включите WP_DEBUG для диагностики.

Практические советы по безопасности и производительности

  • В коде не используйте глобальные переменные без необходимости.
  • Проверяйте, что функция не вызывается в админке, чтобы избежать лишних вычислений.
  • Если нужна более сложная логика с разными скидками, рассмотрите создание отдельного плагина для удобства поддержки.
  • Для кеширования можно использовать Transients API, если скидка зависит от внешних факторов.

Сравнение вариантов реализации скидок в WooCommerce

ВариантПлюсыМинусы
Собственный код (как в статье)Лёгкий, не требует плагинов, быстро и точно под задачуНе подходит для сложных условий, требует навыков разработки
Плагины скидок (например, WooCommerce Dynamic Pricing)Много готовых функций, гибкостьНагрузка на сайт, возможны конфликты, дороговизна
Использование купонов WooCommerceПростая настройка, подходит для разовых акцийПользователь должен вводить код, не автоматизировано
Как создать автоматический excerpt для курсов в WordPress
18.01.2026
Как использовать хук WooCommerce order status change для автоматизации
26.04.2026
Как избежать конфликтов между плагинами WordPress: практические советы и примеры кода
09.11.2025
WooCommerce: как установить и настроить оповещения о статусе оплаты заказа
01.05.2026
WooCommerce: как автоматически отключить отгрузку заказа после оплаты
19.05.2026