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

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

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

Как проверить, разрешено ли повторное использование купона

  • Перейдите в админку WooCommerce — WooCommerce > Купоны.
  • Откройте нужный купон и проверьте параметр Ограничить использование для одного пользователя.
  • Если галочка стоит, но пользователи всё равно применяют купон несколько раз, вероятно, идентификация пользователя не срабатывает — например, для гостей.

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

Чтобы гарантированно запретить повторное использование купонов одним пользователем, в том числе гостем (по IP или кукам), реализуем дополнительную проверку через хук woocommerce_coupon_is_valid.

add_filter('woocommerce_coupon_is_valid', function($valid, $coupon, $discount) {
    if (!$valid) {
        return false;
    }

    $code = $coupon->get_code();
    $user_id = get_current_user_id();
    $used_coupons = [];

    if ($user_id) {
        // Проверяем, использовал ли пользователь этот купон
        $used_coupons = get_user_meta($user_id, 'used_coupons', true) ?: [];
        if (in_array($code, $used_coupons)) {
            wc_add_notice('Вы уже использовали этот купон.', 'error');
            return false;
        }
    } else {
        // Для гостей — проверяем куку
        if (isset($_COOKIE['used_coupons'])) {
            $used_coupons = explode(',', sanitize_text_field($_COOKIE['used_coupons']));
            if (in_array($code, $used_coupons)) {
                wc_add_notice('Вы уже использовали этот купон.', 'error');
                return false;
            }
        }
    }

    return true;
}, 10, 3);

Этот код проверяет, применял ли пользователь купон ранее, и запрещает его повторное использование. Для зарегистрированных пользователей применяется мета-данные, для гостей — куки.

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

add_action('woocommerce_applied_coupon', function($code) {
    $user_id = get_current_user_id();

    if ($user_id) {
        $used_coupons = get_user_meta($user_id, 'used_coupons', true) ?: [];
        if (!in_array($code, $used_coupons)) {
            $used_coupons[] = $code;
            update_user_meta($user_id, 'used_coupons', $used_coupons);
        }
    } else {
        // Для гостей обновляем куку с купонами
        $used_coupons = [];
        if (isset($_COOKIE['used_coupons'])) {
            $used_coupons = explode(',', sanitize_text_field($_COOKIE['used_coupons']));
        }
        if (!in_array($code, $used_coupons)) {
            $used_coupons[] = $code;
            setcookie('used_coupons', implode(',', $used_coupons), time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
        }
    }
});

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

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

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

  • Купон не срабатывает для новых пользователей: Проверьте, что в настройках купона не стоит ограничение по дате или минимальной сумме заказа.
  • Купон повторно срабатывает для гостей: Возможно, куки не устанавливаются из-за настроек браузера или плагинов безопасности. Проверьте заголовки и настройте HTTPS.
  • Ошибка «Вы уже использовали этот купон» появляется сразу: Проверьте, что в базе пользователя нет устаревших данных, очистите мета-данные used_coupons.
  • Куки не обновляются после оформления заказа: Убедитесь, что хук woocommerce_applied_coupon срабатывает, или замените на woocommerce_checkout_order_processed с дополнительной проверкой купонов в заказе.

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

  • Используйте HTTPS для корректной работы куки и защиты данных пользователей.
  • Сократите срок жизни куки для гостей до 30 дней, чтобы избежать переполнения и проблем с хранением.
  • Для пользователей с несколькими аккаунтами используйте привязку по email или IP, если необходимо усилить контроль.
  • При большом количестве пользователей и купонов подумайте о хранении данных в отдельной таблице или кэше, чтобы избежать нагрузки на мета-данные пользователей.
  • Проверяйте совместимость с плагинами кеширования, чтобы куки и проверки не кешировались.

Сравнение вариантов реализации запрета повторного использования купонов

МетодПреимуществаНедостаткиПример кода
Стандартные настройки WooCommerceПростота, нет кодаНе работает для гостей, ограниченоВ настройках купона
Проверка через user_meta + cookiesРаботает для гостей и пользователейНеобходим код, возможны проблемы с кукамиПример из статьи
Использование сторонних плагинов (например, WooCommerce Smart Coupons)Расширенный функционал, готовые решенияДоп. нагрузка, возможны конфликтыЗависит от плагина
Как исправить дублирование SKU в WooCommerce: диагностика и практические решения
06.05.2026
Как защитить WordPress от фейковых регистраций и спама: практические методы и примеры кода
13.12.2025
Как сделать безопасный импорт и экспорт данных WooCommerce: практические решения
20.05.2026
WooCommerce: как исправить отсутствие обновления корзины при добавлении товара через AJAX
23.06.2026
Как отключить автозапуск аудио и видео на сайте WordPress
12.05.2026