Диагностика задачи: как автоматически применять скидку в 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 товара — скидка не должна появиться.
- Добавьте в корзину 3 и более товаров — скидка должна появиться в итогах заказа.
- Проверьте, что сумма скидки соответствует 10% от суммы товаров без учёта налогов.
- Обновите корзину, чтобы убедиться, что скидка не дублируется.
Частые ошибки и их исправление
- Скидка дублируется после обновления корзины. Причина: добавление скидки происходит несколько раз без проверки. Решение: в нашем коде мы используем
add_feeбез условия удаления старых скидок, но WooCommerce сбрасывает корзину при каждом пересчёте, поэтому дублирования нет. Если вы добавляете вручную, используйте проверку. - Скидка применяется при любом количестве товаров. Проверьте переменную
$minimum_quantityи подсчёт количества товаров. - Скидка не отображается. Проверьте, что хук
woocommerce_cart_calculate_feesзарегистрирован правильно и функция не прерывается ошибками. Включите WP_DEBUG для диагностики.
Практические советы по безопасности и производительности
- В коде не используйте глобальные переменные без необходимости.
- Проверяйте, что функция не вызывается в админке, чтобы избежать лишних вычислений.
- Если нужна более сложная логика с разными скидками, рассмотрите создание отдельного плагина для удобства поддержки.
- Для кеширования можно использовать Transients API, если скидка зависит от внешних факторов.
Сравнение вариантов реализации скидок в WooCommerce
| Вариант | Плюсы | Минусы |
|---|---|---|
| Собственный код (как в статье) | Лёгкий, не требует плагинов, быстро и точно под задачу | Не подходит для сложных условий, требует навыков разработки |
| Плагины скидок (например, WooCommerce Dynamic Pricing) | Много готовых функций, гибкость | Нагрузка на сайт, возможны конфликты, дороговизна |
| Использование купонов WooCommerce | Простая настройка, подходит для разовых акций | Пользователь должен вводить код, не автоматизировано |