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

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

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

Чтобы проверить, есть ли у вас эта проблема, добавьте товар в корзину и попробуйте добавить его снова. Если количество увеличивается, значит стандартное поведение не подходит для вашего сценария.

Пошаговое решение: запрет повторного добавления одного и того же товара

1. Добавление пользовательского кода в functions.php

Для отключения повторного добавления товара в корзину можно использовать фильтр 'woocommerce_add_to_cart_validation'. Он позволяет перехватить попытку добавления и запретить её, если товар уже есть в корзине.

add_filter('woocommerce_add_to_cart_validation', 'disable_duplicate_product_add_to_cart', 10, 3);
function disable_duplicate_product_add_to_cart($passed, $product_id, $quantity) {
    // Проверяем, есть ли товар в корзине
    foreach (WC()->cart->get_cart() as $cart_item_key => $values) {
        if ($values['product_id'] == $product_id) {
            // Товар уже в корзине — запрещаем добавление
            wc_add_notice(__('Товар уже добавлен в корзину.', 'woocommerce'), 'error');
            return false;
        }
    }
    return $passed;
}

2. Ограничение для определённых товаров (опционально)

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

add_filter('woocommerce_add_to_cart_validation', 'disable_duplicate_for_specific_products', 10, 3);
function disable_duplicate_for_specific_products($passed, $product_id, $quantity) {
    $restricted_ids = array(123, 456); // ID товаров с ограничением
    if (in_array($product_id, $restricted_ids)) {
        foreach (WC()->cart->get_cart() as $cart_item) {
            if ($cart_item['product_id'] == $product_id) {
                wc_add_notice(__('Этот товар уже в корзине и больше не может быть добавлен.', 'woocommerce'), 'error');
                return false;
            }
        }
    }
    return $passed;
}

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

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

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

  • Код не работает — не срабатывает фильтр: Убедитесь, что код добавлен в файл functions.php активной темы или в плагин-сниппет, и что WooCommerce активен.
  • Сообщение об ошибке не отображается: Проверьте, что в шаблоне корзины и страницах есть вызов wc_print_notices(). В стандартных темах WooCommerce это есть по умолчанию.
  • Ограничение применяется ко всем товарам, хотя нужно только к некоторым: Проверьте правильность ID товаров и логику в условии in_array().

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

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

Сравнение методов блокировки повторного добавления

МетодПлюсыМинусы
Фильтр woocommerce_add_to_cart_validationПростой, быстродействующий, работает без плагиновТребует ручного добавления кода, не подходит для новичков
Плагин (например, WooCommerce Max Quantity)Легко настраивается, обычно с дополнительным функционаломМожет замедлять сайт, требует обновлений и поддержки
JS-скрипт на фронтендеБыстрая реакция пользователяМожно обойти, безопасность на сервере не гарантирует
Как автоматически переводить посты WordPress на другие языки
02.03.2026
Как добавить автоматическое удаление старых записей через WP-Cron в WordPress
07.02.2026
Как использовать REST API в WordPress для создания плагинов
24.11.2025
Как изменить slug в своей категории WordPress
15.12.2025
Как добавить динамические поля в WordPress: практическое руководство
09.03.2026