WooCommerce: как ограничить заказ одного товара в корзине

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

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

Без дополнительной настройки покупатель может положить в корзину 3 разных товара по 5 штук каждый, а нам надо запретить добавление второго товара, если в корзине есть уже один.

Как проверить текущие настройки WooCommerce

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

Пошаговое решение: ограничение корзины одним товаром через код

Используем хук woocommerce_add_to_cart_validation, чтобы проверить содержимое корзины до добавления нового товара и вернуть ошибку, если уже есть товар.

Добавьте следующий код в файл functions.php вашей дочерней темы или в подключаемый плагин:

add_filter('woocommerce_add_to_cart_validation', 'limit_one_product_in_cart', 10, 3);
function limit_one_product_in_cart($passed, $product_id, $quantity) {
    // Если корзина пуста — разрешаем
    if (WC()->cart->is_empty()) {
        return true;
    }
    
    // Проверяем, есть ли уже товар с другим ID
    foreach (WC()->cart->get_cart() as $cart_item) {
        if ($cart_item['product_id'] !== $product_id) {
            wc_add_notice('Вы можете заказать только один товар за раз.', 'error');
            return false;
        }
    }
    
    return $passed;
}

Этот код запрещает добавлять в корзину второй товар с отличным ID, позволяя увеличить количество только того же товара.

Как разрешить только один товар в корзине с количеством 1

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

add_filter('woocommerce_add_to_cart_validation', 'limit_one_item_in_cart', 10, 3);
function limit_one_item_in_cart($passed, $product_id, $quantity) {
    if (!WC()->cart->is_empty()) {
        wc_add_notice('В корзине уже есть товар. Можно заказать только один товар с количеством 1.', 'error');
        return false;
    }
    if ($quantity > 1) {
        wc_add_notice('Максимальное количество товара — 1.', 'error');
        return false;
    }
    return $passed;
}

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

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

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

  • Ошибка: сообщение не выводится, товар добавляется. Проверьте, подключен ли код и нет ли конфликтов с другими плагинами, использующими тот же хук.
  • Ошибка: можно добавить один и тот же товар несколько раз, хотя не надо. Уточните бизнес-требования, измените логику проверки количества в корзине.
  • Ошибка: сообщение об ошибке появляется, но товар все равно добавляется. Убедитесь, что функция возвращает false в случае ошибки, и уведомления выводятся через wc_add_notice.
  • Конфликт с кешированием. Отключите кеш страниц для страниц корзины и добавления в корзину, иначе поведение будет непредсказуемым.

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

  • Добавляйте кастомный код через дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Используйте wc_add_notice для вывода ошибок — WooCommerce корректно их обрабатывает.
  • Тестируйте на разных версиях WooCommerce и PHP.
  • Для крупных магазинов с большим трафиком кешируйте страницы, но исключайте корзину и страницы оформления заказа.

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

МетодОписаниеПлюсыМинусы
Код в functions.phpХук woocommerce_add_to_cart_validation проверяет корзину перед добавлениемБыстро, бесплатно, гибкоТребуется базовый уровень PHP, возможны конфликты
Плагин ограничения корзиныГотовый плагин с визуальными настройкамиПростота настройки, поддержкаПлатные, могут замедлять сайт
Изменение темыДобавление проверки в шаблоны темыИнтеграция с дизайномМенее гибко, сложнее поддерживать
⭐⭐⭐⭐⭐