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

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

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

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

WooCommerce не имеет встроенного функционала для ограничения количества товаров в корзине по ролям. Для решения задачи нужно добавить кастомный PHP-код через functions.php вашей темы или в виде отдельного плагина.

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

add_action('woocommerce_check_cart_items', 'limit_cart_items_by_user_role');

function limit_cart_items_by_user_role() {
    // Получаем объект текущего пользователя
    $user = wp_get_current_user();
    if ( ! $user->exists() ) {
        return; // Для гостей ограничений не ставим
    }

    // Определяем роли и лимиты
    $limits = array(
        'subscriber' => 3,  // обычный пользователь может добавить не более 3 товаров
        'wholesale_customer' => 100, // оптовик — до 100 товаров
        'administrator' => 0, // без ограничений
    );

    // Проверяем роли пользователя и устанавливаем лимит
    $user_roles = (array) $user->roles;
    $max_items = 0;
    foreach ($user_roles as $role) {
        if (isset($limits[$role])) {
            $max_items = max($max_items, $limits[$role]);
        }
    }

    // 0 значит без ограничений
    if ($max_items === 0) {
        return;
    }

    // Считаем количество товаров в корзине
    $cart_quantity = WC()->cart->get_cart_contents_count();

    // Если превышен лимит, выводим ошибку и очищаем корзину
    if ($cart_quantity > $max_items) {
        wc_add_notice(sprintf('Вы не можете добавить более %d товаров в корзину.', $max_items), 'error');
        // Дополнительно можно удалить лишние товары или блокировать добавление
    }
}

Данный код проверяет роли пользователя, находит максимальный установленный лимит и сравнивает с текущим количеством товаров в корзине. При превышении выводится ошибка.

Как расширить функционал: ограничения по каждому товару

Если нужно ограничивать количество по каждому товару, можно заменить подсчет на проверку количества каждого товара отдельно:

add_action('woocommerce_add_to_cart_validation', 'limit_quantity_per_product_by_role', 10, 3);

function limit_quantity_per_product_by_role($passed, $product_id, $quantity) {
    $user = wp_get_current_user();
    if ( ! $user->exists() ) {
        return $passed;
    }

    $limits = array(
        'subscriber' => 3,
        'wholesale_customer' => 100,
        'administrator' => 0,
    );

    $user_roles = (array) $user->roles;
    $max_quantity = 0;
    foreach ($user_roles as $role) {
        if (isset($limits[$role])) {
            $max_quantity = max($max_quantity, $limits[$role]);
        }
    }

    if ($max_quantity === 0) {
        return $passed;
    }

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

    if (($current_quantity + $quantity) > $max_quantity) {
        wc_add_notice(sprintf('Для вашей роли максимальное количество этого товара — %d.', $max_quantity), 'error');
        return false;
    }

    return $passed;
}

Проверка результата

Чтобы проверить работу кода:

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

Частые ошибки и их исправления

  • Код не срабатывает: Возможно, код добавлен в неправильный файл или тема не активна. Проверьте, что functions.php подключен и нет ошибок PHP.
  • Пользователь без роли получает ошибку: Проверьте, что проверка роли корректна, и для гостей ограничения не установлены.
  • Ошибка не выводится, но добавление блокируется: Удостоверьтесь, что функция wc_add_notice вызывается до редиректа, и тема выводит уведомления WooCommerce.
  • Лимиты не учитывают все роли пользователя: В коде используется максимальный лимит из всех ролей — измените логику, если нужно другое поведение.

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

  • Используйте минимально необходимый объем кода в хуках, чтобы не замедлять добавление в корзину.
  • Кешируйте роли пользователя, если получаете их часто в других местах сайта.
  • Проверяйте, что уведомления WooCommerce выводятся корректно, чтобы пользователь понимал причину блокировки.
  • Для сложных ограничений рассмотрите создание отдельного плагина вместо добавления кода в тему — так проще обновлять и контролировать функционал.

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

СпособПлюсыМинусыПример
Код в functions.phpБыстро, бесплатно, гибкоМожет потеряться при смене темы, требует навыков PHPКод из статьи
Плагин ограничения корзины (например, WooCommerce Max Quantity)Простой интерфейс, поддержкаПлатные, ограниченная кастомизацияWooCommerce Max Quantity
Комбинация кода и плагиновГибкость и удобствоСложнее поддерживатьКод + плагин уведомлений
Как удалить автоматически неиспользуемые шорткоды в WordPress
01.04.2026
Как отладить проблемы с AJAX в WordPress
17.11.2025
Как автоматически отключать плагины в WordPress при возникновении ошибок
18.03.2026
WooCommerce: автоматическое изменение стоимости товара при выборе способа доставки
14.07.2026
Как сделать автоматический logout пользователей в WordPress
07.01.2026