WooCommerce: как запретить повторную покупку товара одним пользователем

Проблема: повторные покупки одного товара одним пользователем

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

Диагностика проблемы

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

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

Пошаговое решение: блокировка повторной покупки товара

1. Проверяем, авторизован ли пользователь

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

2. Проверяем наличие товара в предыдущих заказах

Для этого используем хук woocommerce_add_to_cart_validation, который срабатывает при добавлении товара в корзину. Если товар уже заказан, блокируем добавление с сообщением.

3. Реализация кода

add_filter('woocommerce_add_to_cart_validation', 'wpkey_prevent_duplicate_purchase', 10, 3); 
function wpkey_prevent_duplicate_purchase($passed, $product_id, $quantity) {
    if (!is_user_logged_in()) {
        return $passed; // Разрешаем гостям
    }

    $user_id = get_current_user_id();
    $orders = wc_get_orders(array(
        'customer_id' => $user_id,
        'status' => array('completed', 'processing', 'on-hold'),
        'limit' => -1,
    ));

    foreach ($orders as $order) {
        foreach ($order->get_items() as $item) {
            if ($item->get_product_id() == $product_id) {
                wc_add_notice(__('Вы уже покупали этот товар и не можете приобрести его повторно.', 'woocommerce'), 'error');
                return false;
            }
        }
    }

    return $passed;
}

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

Чтобы убедиться, что запрет работает:

  1. Авторизуйтесь под пользователем, который уже покупал товар.
  2. Попробуйте снова добавить этот товар в корзину.
  3. Должно появиться сообщение об ошибке, и товар не добавится.
  4. Для новых пользователей или тех, кто не покупал товар, добавление должно работать.

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

  • Ошибка: Пользователь не авторизован, и товар можно купить повторно.
    Исправление: Добавьте уведомление, что для покупки товара с ограничением нужно войти в аккаунт.
  • Ошибка: Большая нагрузка и замедление при проверке заказов.
    Исправление: Кэшируйте результаты проверки или ограничьте поиск только по нужным статусам заказов.
  • Ошибка: Запрет работает не для вариативных товаров.
    Исправление: Модифицируйте проверку, учитывая вариации через get_variation_id().

Практические советы по оптимизации и безопасности

  • Не проверяйте заказы со статусом «отменён» или «возврат», чтобы не блокировать повторную покупку по ошибке.
  • Если товаров много, используйте индексы в базе данных или кэширование для ускорения запросов.
  • Добавьте логирование попыток повторной покупки для аудита и анализа поведения пользователей.

Варианты реализации: плагин vs код

ПодходПлюсыМинусы
Реализация через код (хук)Полный контроль, лёгкая кастомизация, без доп. плагиновНужно писать и поддерживать код, требует навыков разработки
Плагин ограничения покупокБыстрая установка, готовый интерфейс, поддержкаМожет нагрузить сайт, ограничения по кастомизации, платные решения
Как добавить просмотры и оценки к постам WordPress
22.02.2026
Как создать автоматическое обновление метаданных в WordPress
30.01.2026
Как использовать REST API в WordPress: практическое руководство
17.11.2025
WooCommerce: автоматизация отмены и возврата заказов
23.04.2026
Как сделать автоматический импорт контента в WordPress
04.01.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс