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

Проблема: промо-коды остаются активными после использования

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

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

Чтобы понять, работает ли отключение купона после использования, проверьте следующие моменты:

  • Сколько раз можно использовать купон в настройках WooCommerce (максимальное количество использований купона).
  • Есть ли ограничения по пользователям (например, «Ограничить использование для одного пользователя»).
  • Проверить, не сохраняется ли купон в сессии после оформления заказа.

Однако WooCommerce не отключает купон автоматически сразу после успешного заказа — он просто учитывает количество использований. Если нужно именно автоматическое отключение (например, после первого использования купона всеми пользователями), придется реализовать дополнительную логику.

Пошаговое решение: автоматическое отключение купона после первой покупки с ним

Реализуем хук, который при смене статуса заказа проверяет наличие купона и отключает его, если он был применён.

add_action('woocommerce_order_status_completed', 'disable_coupon_after_first_use', 10, 1);
function disable_coupon_after_first_use( $order_id ) {
    if ( ! $order_id ) return;
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    $used_coupons = $order->get_used_coupons();
    if ( empty( $used_coupons ) ) return;

    foreach ( $used_coupons as $coupon_code ) {
        $coupon = new WC_Coupon( $coupon_code );
        if ( ! $coupon->get_id() ) continue;

        // Деактивируем купон
        $coupon->set_usage_limit( 0 );
        $coupon->save();
    }
}

Объяснение:

  • Хук woocommerce_order_status_completed срабатывает при смене статуса заказа на «завершён».
  • Получаем список купонов, использованных в заказе.
  • Для каждого купона устанавливаем лимит использования в 0, что фактически отключает его.

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

  • Создайте тестовый купон с неограниченным количеством использований.
  • Сделайте заказ с использованием этого купона, переведите заказ в статус «завершён».
  • Попробуйте применить тот же купон в новом заказе — он должен быть недоступен.

Для визуальной проверки можно зайти в админку WooCommerce в раздел «Купоны» и проверить поле «Максимальное количество использований» — после использования должно быть установлено 0.

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

  • Купон не отключается после применения: проверьте, что заказ действительно переводится в статус «завершён». Если используется другой статус, например «обрабатывается», замените хук на woocommerce_order_status_processing или добавьте обработку нескольких статусов.
  • Купон не применяется к заказу: удостоверьтесь, что купон активен и применён корректно до завершения заказа.
  • Лимит использования не меняется: убедитесь, что функция сохраняет объект купона методом $coupon->save(), без этого изменения не сохранятся.

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

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

Альтернативы: плагин vs. кастомный код

ВариантПлюсыМинусы
Кастомный код (как выше)Гибкость, полный контроль, бесплатноТребует поддержки при обновлениях, возможны ошибки без опыта
Плагин для управления купонами с расширенными правиламиПростота настройки, дополнительные функции (ограничения по времени, пользователям)Платные или сложные, могут влиять на производительность
Как создать автоматический экспорт пользовательских данных в WordPress
06.04.2026
Как создать автоматический канонический URL в WordPress
25.01.2026
WooCommerce: автоматическое изменение стоимости вариативных товаров в зависимости от выбранных опций
18.06.2026
WooCommerce: автоматическое обновление стоимости товаров по расписанию
02.07.2026
Как автоматически удалять неиспользуемые виджеты WordPress
27.03.2026