Диагностика задачи: зачем ограничивать количество товаров в корзине WooCommerce
В интернет-магазинах на WooCommerce иногда возникает необходимость ограничить максимальное количество товаров в корзине. Это может быть актуально для распродаж, акций, предотвращения оптовых закупок обычными пользователями или ограничения нагрузки на склад. Стандартных настроек WooCommerce для этого нет, поэтому приходится использовать кастомный код.
Пошаговое решение: установка лимита на количество товаров в корзине
1. Добавление проверки при добавлении товара в корзину
Нужно использовать хук woocommerce_add_to_cart_validation, который позволяет проверить условия до добавления товара в корзину и вернуть ошибку, если лимит превышен.
add_filter('woocommerce_add_to_cart_validation', 'limit_cart_items_quantity', 10, 3);
function limit_cart_items_quantity($passed, $product_id, $quantity) {
$max_items = 5; // Максимальное количество товаров в корзине
$current_qty = 0;
foreach (WC()->cart->get_cart() as $cart_item) {
$current_qty += $cart_item['quantity'];
}
if (($current_qty + $quantity) > $max_items) {
wc_add_notice(sprintf('Вы не можете добавить больше %d товаров в корзину.', $max_items), 'error');
return false;
}
return $passed;
}2. Ограничение количества товаров на странице корзины
Пользователи могут менять количество товаров прямо на странице корзины. Нужно ограничить максимальное значение в поле количества и дополнительно проверить на сервере при обновлении корзины.
// Ограничение максимума через JS для страницы корзины
add_action('wp_footer', 'limit_cart_quantity_js');
function limit_cart_quantity_js() {
if (is_cart()) {
?>
<script>
jQuery(function($) {
var maxQty = 5;
$('.qty').attr('max', maxQty);
$('.qty').on('input', function() {
var val = parseInt($(this).val());
if (val > maxQty) {
$(this).val(maxQty);
} else if (val < 1 || isNaN(val)) {
$(this).val(1);
}
});
});
</script>
<?php
}
}
// Проверка при обновлении корзины
add_action('woocommerce_check_cart_items', 'validate_cart_quantities');
function validate_cart_quantities() {
$max_items = 5;
$total_qty = 0;
foreach (WC()->cart->get_cart() as $cart_item) {
$total_qty += $cart_item['quantity'];
}
if ($total_qty > $max_items) {
wc_add_notice(sprintf('Общее количество товаров в корзине не может превышать %d.', $max_items), 'error');
}
}Проверка результата после внедрения
- Попробуйте добавить в корзину товаров больше, чем разрешено (например, 6 при лимите 5) — должна появиться ошибка и товар не добавится.
- На странице корзины поле количества должно ограничивать ввод значением не выше лимита.
- При попытке обновить корзину с превышением лимита появится сообщение об ошибке, и количество не изменится.
Частые ошибки и их исправление
- Ошибка: лимит не срабатывает, можно добавить больше товаров. Проверьте, что код добавлен в functions.php активной темы или в плагин, и что WooCommerce активен.
- Ошибка: сообщения об ошибке не отображаются. Убедитесь, что в шаблоне корзины и на страницах есть вызов
wc_print_notices(). - Ошибка: при изменении количества в корзине лимит не применяется. Проверьте, подключен ли хук
woocommerce_check_cart_items. - Конфликт с другими плагинами, которые изменяют корзину. Временно отключите сторонние плагины и проверьте работу лимита.
Практические советы по безопасности и производительности
- Код не создает дополнительных запросов к базе — работает с объектом корзины.
- Не используйте слишком сложную логику проверки лимита, чтобы не ухудшить производительность.
- В случае необходимости динамического лимита (например, для разных ролей пользователей) добавьте проверку
current_user_can(). - Для улучшения UX используйте AJAX-валидацию количества на странице товара и корзины.
Сравнение вариантов реализации ограничения количества товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код на PHP (хуки WooCommerce) | Полный контроль, работает на сервере, легко кастомизируется | Требует навыков программирования, нужно тестировать | Пример выше |
| Плагины ограничения корзины | Простота установки, готовый функционал | Может быть избыточным, влияние на производительность, не всегда бесплатные | WooCommerce Max Quantity, Min/Max Quantities for WooCommerce |
| JavaScript на фронтенде | Улучшение UX, блокировка сразу на клиенте | Можно обойти, не заменяет серверную проверку | Пример JS из кода выше |