Диагностика задачи: зачем ограничивать товары в корзине по категориям
В интернет-магазинах на WooCommerce иногда требуется ограничить максимальное количество товаров в корзине, но не общее, а именно по категориям товаров. Это помогает контролировать продажи, предотвращать накопление больших заказов определённых групп товаров или управлять складскими запасами. Стандартного функционала в WooCommerce для такого ограничения нет, поэтому решение требует кастомной доработки.
Пошаговое решение: установка ограничения количества товаров по категориям в корзине
1. Добавляем фильтр для проверки корзины перед оформлением заказа
Используем хук 'woocommerce_check_cart_items', чтобы при добавлении товаров или переходе к оформлению заказа проверять лимит по категориям.
2. Считаем общее количество товаров по каждой заданной категории
Для этого перебираем все позиции в корзине, определяем категории товаров и суммируем их количество.
3. Выводим ошибку и блокируем оформление заказа при превышении лимита
Если количество товаров в категории превысило лимит, выводим уведомление через wc_add_notice с типом ошибки.
Пример кода для functions.php темы или собственного плагина:
add_action('woocommerce_check_cart_items', 'limit_cart_quantity_by_category');
function limit_cart_quantity_by_category() {
// Установим лимиты по категориям (slug => максимальное количество)
$category_limits = array(
'elektronika' => 3,
'odezhda' => 5,
'aksessuary' => 2,
);
// Подсчет количества товаров по категориям в корзине
$category_counts = array();
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product_id = $cart_item['product_id'];
$quantity = $cart_item['quantity'];
$terms = get_the_terms( $product_id, 'product_cat' );
if ( $terms && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
$cat_slug = $term->slug;
if ( isset( $category_limits[ $cat_slug ] ) ) {
if ( ! isset( $category_counts[ $cat_slug ] ) ) {
$category_counts[ $cat_slug ] = 0;
}
$category_counts[ $cat_slug ] += $quantity;
}
}
}
}
// Проверка превышения лимитов
foreach ( $category_counts as $cat_slug => $count ) {
if ( $count > $category_limits[ $cat_slug ] ) {
$cat_name = get_term_by( 'slug', $cat_slug, 'product_cat' )->name;
wc_add_notice( sprintf( 'Максимальное количество товаров категории "%s" в корзине: %d. У вас сейчас %d.', $cat_name, $category_limits[ $cat_slug ], $count ), 'error' );
}
}
}Проверка результата после внедрения
1. Добавьте в корзину товары из категорий, указанных в массиве $category_limits, и попробуйте превысить лимит по количеству.
2. При превышении лимита должна появиться ошибка на странице корзины и оформление заказа будет заблокировано.
3. Проверьте, что для товаров из других категорий ограничение не применяется.
4. Для отладки можно временно добавить error_log внутри функции, чтобы фиксировать подсчёт категорий.
Частые ошибки и как их исправить
- Ошибка: ограничение не срабатывает
Проверьте, что функция подключена и хукwoocommerce_check_cart_itemsактивен. Убедитесь, что категории товаров заданы верно, через слаг (slug). - Ошибка: лимит применяется ко всем товарам, а не по категориям
Проверьте структуру массива$category_limitsи получение категорий черезget_the_terms. - Ошибка: пользователь видит ошибку, хотя лимит не превышен
Возможно, в корзине дублируются товары, или категории товаров перекрываются. Убедитесь, что подсчёт идёт корректно и не суммирует один товар несколько раз по разным категориям. - Ошибка: ошибка не отображается на странице оформления заказа
Проверьте, что в шаблонах используются стандартные хуки WooCommerce для вывода уведомлений (wc_print_notices()).
Практические советы по производительности и безопасности
- Кешируйте результаты
get_the_termsесли корзина большая, чтобы не нагружать базу. - Проверяйте права доступа — функция не должна раскрывать лишнюю информацию о товарах.
- В случае большого каталога рассмотрите возможность настройки лимитов через админ-панель и хранение их в опциях, а не в коде.
- Для расширения функционала можно добавить уведомления на страницу товара при попытке добавить запрещённое количество товаров.
Сравнение вариантов реализации ограничения товаров в корзине
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код в functions.php | Быстро, без плагинов, гибко | Требует навыков, не всегда удобно изменять | Пример из статьи |
| Плагин ограничения корзины (например, WooCommerce Max Quantity) | Готовое решение, удобный интерфейс | Может быть платным, нет гибкости по категориям | WooCommerce Max Quantity plugin |
| Кастомный плагин с настройками | Полный контроль, можно добавить UI | Требует разработки и поддержки | Разработка под проект |