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

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

В интернет-магазинах на 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 Требует разработки и поддержки Разработка под проект

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как проверить и исправить ошибки базы данных WordPress: практическое руководство
22.02.2026
Как удалить редиректы в WordPress без плагинов: практическое руководство
13.11.2025
Как отключить уведомления по email от комментариев WordPress
09.01.2026
Как отключить Emoji в WordPress для ускорения сайта
15.02.2026
Как настроить отправку писем через SMTP в WordPress без плагинов
01.03.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше