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

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

В интернет-магазинах на WooCommerce часто возникает необходимость ограничить максимальное количество товаров, которые пользователь может добавить в корзину, в зависимости от его роли. Это актуально для оптовых покупателей, партнеров или VIP-клиентов. Стандартный WooCommerce не предоставляет таких гибких настроек, поэтому требуется кастомизация.

Как реализовать ограничение количества товаров в корзине по ролям пользователей

1. Определяем роль пользователя и максимальное количество товаров

Для начала создадим массив с ролями и соответствующими лимитами:

function get_max_cart_items_by_role() {
    return [
        'subscriber' => 5,      // Обычные пользователи
        'wholesale_customer' => 50,  // Оптовики
        'vip_customer' => 100,        // VIP-клиенты
    ];
}

2. Проверяем добавление товара в корзину и ограничиваем

Используем хук 'woocommerce_add_to_cart_validation' для проверки перед добавлением товара:

add_filter('woocommerce_add_to_cart_validation', 'limit_cart_items_by_user_role', 10, 3);
function limit_cart_items_by_user_role($passed, $product_id, $quantity) {
    if (!is_user_logged_in()) {
        return $passed; // Неавторизованные пользователи без ограничений
    }

    $user = wp_get_current_user();
    $limits = get_max_cart_items_by_role();

    foreach ($user->roles as $role) {
        if (isset($limits[$role])) {
            $max_items = $limits[$role];
            break;
        }
    }

    if (empty($max_items)) {
        $max_items = 5; // Значение по умолчанию
    }

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

    if (($current_cart_quantity + $quantity) > $max_items) {
        wc_add_notice(sprintf('Вы не можете добавить больше %d товаров в корзину.', $max_items), 'error');
        return false;
    }

    return $passed;
}

3. Ограничение на странице оформления заказа (checkout)

Чтобы дополнительно не допустить обход ограничения, проверим корзину при оформлении заказа:

add_action('woocommerce_checkout_process', 'check_cart_limit_on_checkout');
function check_cart_limit_on_checkout() {
    if (!is_user_logged_in()) {
        return;
    }

    $user = wp_get_current_user();
    $limits = get_max_cart_items_by_role();

    foreach ($user->roles as $role) {
        if (isset($limits[$role])) {
            $max_items = $limits[$role];
            break;
        }
    }

    if (empty($max_items)) {
        $max_items = 5;
    }

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

    if ($current_cart_quantity > $max_items) {
        wc_add_notice(sprintf('Ваша корзина содержит %d товаров, что превышает лимит %d для вашей роли.', $current_cart_quantity, $max_items), 'error');
    }
}

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

  • Авторизуйтесь под разными ролями (например, subscriber и wholesale_customer).
  • Попробуйте добавить в корзину товаров больше, чем разрешено для роли.
  • Убедитесь, что появляется сообщение об ошибке и товар не добавляется.
  • Проверьте, что на странице оформления заказа при превышении лимита выводится предупреждение.
  • Для неавторизованных пользователей ограничения не применяется (можно дополнительно добавить, если нужно).

Частые ошибки и как исправить

  • Ошибка: Лимит не срабатывает для пользователей с несколькими ролями.
    Причина: Скрипт берет первый найденный лимит, но роль с лимитом может отсутствовать.
    Решение: Добавьте логику выбора максимального лимита из всех ролей пользователя.
  • Ошибка: Ограничение применяется к гостям.
    Причина: В коде не проверена авторизация.
    Решение: Добавьте проверку is_user_logged_in() и настройте поведение для гостей отдельно.
  • Ошибка: При обновлении количества в корзине лимит не проверяется.
    Причина: Не обработан хук на изменение количества в корзине.
    Решение: Добавьте проверку в 'woocommerce_check_cart_items' или используйте хук 'woocommerce_after_cart_item_quantity_update'.

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

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

Сравнение вариантов реализации ограничения

МетодОписаниеПлюсыМинусы
Чистый PHP-код (как в статье) Хуки и функции в functions.php или кастомном плагине Полный контроль, нет зависимостей, гибкость Требует навыков, нет UI, изменения через код
Плагины ограничения корзины Готовые решения с настройками через админку Простота настройки, UI, поддержка Может быть дорого, ограниченная гибкость, дополнительные зависимости
Комбинация кода и плагинов Использование плагинов для базовых функций + кастомных хуков Гибкость и удобство Сложнее отлаживать, возможны конфликты
WooCommerce: как автоматически удалять товар из корзины после оплаты
10.06.2026
WooCommerce: установка ограничений на скидки по ролям пользователей
21.04.2026
Автоматизация обработки изображений в WordPress с помощью WP8
27.03.2026
Как удалить неиспользуемые шорткоды в WordPress
11.03.2026
WooCommerce: как отключить автологин после регистрации пользователя
17.05.2026