WooCommerce: автоматическое отключение неактивных купонов

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

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

Проверить проблему можно так:

  • Зайдите в админку WooCommerce → Купоны.
  • Отсортируйте купоны по дате последнего использования (если доступно) или посмотрите метаданные купона.
  • Проверьте, есть ли купоны, которые не применялись к заказам более 3-6 месяцев.

Если таких купонов много — имеет смысл автоматизировать процесс их отключения.

Как автоматически отключать неактивные купоны в WooCommerce

Общая идея решения

WooCommerce не хранит напрямую дату последнего использования купона. Нужно проанализировать заказы с применёнными купонами и определить дату последнего применения для каждого купона. Затем отключить купоны, которые не использовались заданное время.

Пошаговое решение с кодом

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

function disable_inactive_coupons() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    global $wpdb;
    $months_inactive = 6; // Период неактивности в месяцах
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$months_inactive} months" ) );

    // Получаем все активные купоны
    $args = array(
        'posts_per_page' => -1,
        'post_type'      => 'shop_coupon',
        'post_status'    => 'publish',
    );
    $coupons = get_posts( $args );

    foreach ( $coupons as $coupon_post ) {
        $coupon_code = $coupon_post->post_title;

        // Запрос даты последнего использования купона
        $last_used = $wpdb->get_var( $wpdb->prepare(
            "SELECT MAX(p.post_date) FROM {$wpdb->prefix}posts p
             INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id
             WHERE p.post_type = 'shop_order'
               AND pm.meta_key = '_used_coupons'
               AND pm.meta_value LIKE %s
               AND p.post_status IN ('wc-completed', 'wc-processing')",
            '%' . $wpdb->esc_like( $coupon_code ) . '%'
        ) );

        // Если купон не использовался или не использовался долго
        if ( ! $last_used || $last_used < $date_threshold ) {
            // Отключаем купон
            wp_update_post( array(
                'ID'          => $coupon_post->ID,
                'post_status' => 'draft',
            ) );
        }
    }
}

// Запускаем функцию раз в день через WP-Cron
if ( ! wp_next_scheduled( 'disable_inactive_coupons_hook' ) ) {
    wp_schedule_event( time(), 'daily', 'disable_inactive_coupons_hook' );
}
add_action( 'disable_inactive_coupons_hook', 'disable_inactive_coupons' );

Этот код проверяет все активные купоны, ищет дату их последнего применения в заказах со статусом wc-completed и wc-processing и переводит купоны в статус draft, если они не использовались более 6 месяцев. Запуск происходит автоматически раз в день.

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

  • Зайдите в WooCommerce → Купоны и убедитесь, что купоны, не применявшиеся долгое время, имеют статус "Черновик".
  • Создайте тестовый заказ с купоном, который должен остаться активным — он должен работать.
  • Проверьте Cron задачи через плагин WP Crontrol, чтобы убедиться, что задача disable_inactive_coupons_hook выполняется.

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

  • Купоны не отключаются
    Проверьте, выполняется ли cron задача. Если нет, запустите вручную disable_inactive_coupons().
  • Неправильный поиск использования купона
    Купоны могут храниться в мета _used_coupons как сериализованный массив. Запрос с LIKE может не работать корректно на всех сайтах. В этом случае сделайте дополнительную проверку через PHP, перебрав заказы.
  • Статус купона не меняется
    Убедитесь, что у пользователя, под которым работает cron, есть права на редактирование купонов.

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

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

Альтернативные варианты решения

МетодПлюсыМинусы
Код на functions.php с WP-CronБесплатно, гибкоНужны знания PHP, может нагружать БД
Плагин автоматизации (например, Advanced Coupons)Простота, готовый интерфейсПлатно, ограничена кастомизация
Ручное отключение купоновБезопасно, полный контрольЗатратно по времени, риск ошибок
Автоматическое создание собственного шорткода с параметрами в WordPress
11.12.2025
Как удалить кэш в WordPress: практическое руководство
21.11.2025
Удаление старых кэшей и оптимизация базы данных WordPress для ускорения сайта
25.02.2026
Как сделать динамические заголовки H1 в WordPress
15.04.2026
WooCommerce: автоматическое удаление неоплаченных заказов через заданное время
17.07.2026