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

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

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

Без такого ограничения покупатели могут добавлять в корзину большое число товаров, что порой приводит к дефициту или нарушению бизнес-логики.

Как проверить текущие ограничения WooCommerce

В базовой установке WooCommerce можно ограничить количество товара на уровне склада (stock quantity), но это ограничение действует глобально, без учета пользователя. Чтобы проверить, не мешает ли уже существующая настройка:

  • Перейдите в админку WordPress > Товары > Выберите товар > вкладка "Запасы".
  • Проверьте поле "Количество на складе" и "Разрешить заказы при отсутствии товара".
  • Обратите внимание, что эти настройки не ограничивают покупку товара одним пользователем, а только общее количество.

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

Реализуем ограничение с помощью хука WooCommerce woocommerce_add_to_cart_validation. Он позволяет проверять и отменять добавление товара в корзину в зависимости от условий.

Пример кода для functions.php вашей темы или в кастомном плагине:

add_filter( 'woocommerce_add_to_cart_validation', 'limit_product_quantity_per_user', 10, 3 );
function limit_product_quantity_per_user( $passed, $product_id, $quantity ) {
    // ID товара, для которого ставим ограничение
    $restricted_product_id = 123; // замените на ID вашего товара
    // Максимальное количество товара, которое может купить один пользователь
    $max_quantity = 3;

    if ( $product_id == $restricted_product_id ) {
        // Получаем текущие количество товара в корзине
        $current_qty_in_cart = 0;
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            if ( $cart_item['product_id'] == $product_id ) {
                $current_qty_in_cart += $cart_item['quantity'];
            }
        }

        // Проверяем, чтобы сумма текущего и нового количества не превышала лимит
        if ( $current_qty_in_cart + $quantity > $max_quantity ) {
            wc_add_notice( sprintf('Вы можете приобрести не более %d единиц этого товара.', $max_quantity ), 'error' );
            return false;
        }
    }
    return $passed;
}

Объяснение:

  • Мы проверяем, добавляется ли именно нужный товар.
  • Считаем, сколько единиц товара уже в корзине.
  • Если сумма текущего количества и запрашиваемого превышает лимит, запрещаем добавление и показываем ошибку.

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

Для нескольких товаров можно использовать массив с ID и циклом, например:

function limit_product_quantity_per_user( $passed, $product_id, $quantity ) {
    $restricted_products = [123 => 3, 456 => 2]; // ID товара => лимит

    if ( isset( $restricted_products[ $product_id ] ) ) {
        $max_quantity = $restricted_products[ $product_id ];
        $current_qty_in_cart = 0;
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            if ( $cart_item['product_id'] == $product_id ) {
                $current_qty_in_cart += $cart_item['quantity'];
            }
        }
        if ( $current_qty_in_cart + $quantity > $max_quantity ) {
            wc_add_notice( sprintf('Вы можете приобрести не более %d единиц этого товара.', $max_quantity ), 'error' );
            return false;
        }
    }
    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'limit_product_quantity_per_user', 10, 3 );

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

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

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

  • Неправильный ID товара: Убедитесь, что $product_id совпадает с ID нужного товара. Используйте get_the_ID() или админку для проверки.
  • Конфликт с другими плагинами корзины: Плагины, изменяющие логику корзины, могут влиять на подсчет количества. Отключите их для теста.
  • Кэширование страницы корзины: Если используется кэш, обновите страницу, чтобы увидеть изменения.
  • Добавление товара на страницу товара не запрещается: Проверьте, что код именно на woocommerce_add_to_cart_validation, а не на другом хуке.
  • Пользователь может оформить несколько заказов подряд: Этот код ограничивает количество товара в одной корзине, не учитывает историю покупок. Для учета покупок пользователя нужно усложнять логику, запрашивая базу данных заказов.

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

  • Не храните в сессии или опциях данные о лимитах — лучше проверять динамически в момент добавления в корзину.
  • Если нужно учитывать покупки за всё время, используйте WP_User_Query и WC_Order_Query с осторожностью — большие базы могут замедлить работу.
  • Ограничение на стороне клиента (JS) — только дополнение, основную проверку делайте на сервере.
  • Если у вас большой магазин с большим количеством товаров и покупателей, рассмотрите использование плагинов для расширенного управления лимитами, например, WooCommerce Purchase Limits.

Сравнение способов реализации ограничения

СпособОписаниеПлюсыМинусы
Код на хуке woocommerce_add_to_cart_validationОграничение на уровне добавления в корзинуБыстро, гибко, бесплатноНе учитывает прошлые заказы, требует навыков кода
Плагин (WooCommerce Purchase Limits)Готовое решение с настройками в админкеПростота, расширенный функционалПотенциальные конфликты, платные версии
Изменение шаблонов и JSОграничение на клиентеУлучшает UXМожно обойти, нужна серверная проверка
WooCommerce: как автоматически удалять товары из корзины после оплаты
19.06.2026
Как удалить meta robots из WordPress на конкретных страницах
20.01.2026
Установка и настройка Redis кэша для WordPress
16.12.2025
WooCommerce: как установить ограничения на количество товаров в корзине
08.06.2026
Как создать обновляемые отзывы в WordPress с помощью WPRemark
04.02.2026