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

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

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

Как создать купон программно в WooCommerce

В WooCommerce купон — это специальный тип записи (shop_coupon). Для создания купона через код используется стандартный класс WC_Coupon. Пример создания купона с фиксированной скидкой:

function wc_create_scheduled_coupon( $code, $amount, $discount_type = 'fixed_cart', $expiry_date = '' ) {
    if ( ! class_exists( 'WC_Coupon' ) ) {
        return new WP_Error( 'woocommerce_not_active', 'WooCommerce не активен' );
    }

    // Проверяем, существует ли купон с таким кодом
    if ( coupon_exists( $code ) ) {
        return new WP_Error( 'coupon_exists', 'Купон с таким кодом уже существует' );
    }

    $coupon = new WC_Coupon();
    $coupon->set_code( $code );
    $coupon->set_discount_type( $discount_type ); // fixed_cart, percent, fixed_product, percent_product
    $coupon->set_amount( $amount );
    if ( $expiry_date ) {
        $coupon->set_date_expires( new WC_DateTime( $expiry_date ) );
    }
    $coupon->save();

    return $coupon->get_id();
}

function coupon_exists( $code ) {
    $coupon = get_page_by_title( $code, OBJECT, 'shop_coupon' );
    return $coupon ? true : false;
}

Как удалить купон программно

Удаление купона — это удаление поста типа shop_coupon. Чтобы удалять только купоны по определённому признаку (например, с префиксом в коде), используйте следующий код:

function wc_delete_coupon_by_code( $code ) {
    $coupon_post = get_page_by_title( $code, OBJECT, 'shop_coupon' );
    if ( $coupon_post ) {
        wp_delete_post( $coupon_post->ID, true ); // true — удаление без перемещения в корзину
        return true;
    }
    return false;
}

function wc_delete_coupons_by_prefix( $prefix ) {
    $args = [
        'post_type' => 'shop_coupon',
        'posts_per_page' => -1,
        'title_like' => $prefix // Кастомный параметр, потребует фильтра
    ];

    // Альтернативно получаем все купоны и фильтруем вручную
    $coupons = get_posts( [ 'post_type' => 'shop_coupon', 'numberposts' => -1 ] );
    foreach ( $coupons as $coupon ) {
        if ( strpos( $coupon->post_title, $prefix ) === 0 ) {
            wp_delete_post( $coupon->ID, true );
        }
    }
}

Автоматизация с WP-Cron: создание и удаление купонов по расписанию

WP-Cron позволяет запускать задачи по расписанию. Для автоматизации создадим две задачи:

  1. Создание купона на завтра (или другое время)
  2. Удаление купона после окончания акции

Пример регистрации и запуска задач:

// Хук для создания купона
add_action( 'wc_create_coupon_event', 'wc_cron_create_coupon' );
function wc_cron_create_coupon() {
    $code = 'promo_' . date( 'Ymd' );
    $amount = 10; // скидка 10 единиц
    $expiry_date = date( 'Y-m-d', strtotime( '+2 days' ) );
    wc_create_scheduled_coupon( $code, $amount, 'fixed_cart', $expiry_date );
}

// Хук для удаления устаревших купонов
add_action( 'wc_delete_expired_coupons_event', 'wc_cron_delete_expired_coupons' );
function wc_cron_delete_expired_coupons() {
    $coupons = get_posts( [
        'post_type' => 'shop_coupon',
        'numberposts' => -1,
    ] );
    foreach ( $coupons as $coupon ) {
        $expiry = get_post_meta( $coupon->ID, 'date_expires', true );
        if ( $expiry && strtotime( $expiry ) < time() ) {
            wp_delete_post( $coupon->ID, true );
        }
    }
}

// Запланировать задачи, если они не запланированы
if ( ! wp_next_scheduled( 'wc_create_coupon_event' ) ) {
    wp_schedule_event( strtotime( 'tomorrow 00:01' ), 'daily', 'wc_create_coupon_event' );
}
if ( ! wp_next_scheduled( 'wc_delete_expired_coupons_event' ) ) {
    wp_schedule_event( strtotime( 'tomorrow 01:00' ), 'daily', 'wc_delete_expired_coupons_event' );
}

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

  • После запуска cron-заданий проверьте в админке WooCommerce -> Купоны, появился ли новый купон с кодом promo_YYYYMMDD.
  • Убедитесь, что у купона стоит дата истечения скидки.
  • Через несколько дней проверьте, что устаревшие купоны автоматически удаляются.
  • Для отладки используйте плагин WP Crontrol (https://ru.wordpress.org/plugins/wp-crontrol/) — он показывает запланированные задачи.

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

  • Купон не создаётся из-за дублирования кода
    Проверьте функцию coupon_exists(), чтобы избежать дубликатов.
  • WP-Cron не запускается автоматически
    WP-Cron зависит от посещений сайта. Для точных расписаний настройте системный cron на сервере или вручную запускайте задачи через WP Crontrol.
  • Купоны не удаляются
    Проверьте, что в метаполе date_expires хранится корректная дата и сравнение времени работает корректно.
  • Удаление не тех купонов
    Используйте уникальные префиксы в кодах купонов или дополнительные метаданные для точной фильтрации.

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

  • Не создавайте слишком много купонов — большие объёмы замедляют админку и поиск.
  • Для массового удаления используйте WP-CLI, если доступен серверный терминал.
  • Храните даты истечения купонов в формате Y-m-d для удобства сравнения.
  • Ограничьте права доступа к созданию и удалению купонов только администраторам.
  • Регулярно проверяйте cron-задачи и логи ошибок, чтобы избежать сбоев в автоматизации.

Обзор вариантов реализации автоматизации купонов

МетодПлюсыМинусы
Плагины для автоматизации купоновПростота внедрения, интерфейсМогут быть тяжёлыми, ограничены в кастомизации
Код с WP-Cron (как в статье)Гибкость, полное управление, без лишних плагиновТребует навыков разработки, зависит от cron WP
Внешний cron и WP-CLIНадёжность, подходит для больших магазиновНужен доступ к серверу, сложнее в настройке
Как автоматически удалять спам из формы обратной связи WordPress
27.03.2026
Как автоматически удалять неиспользуемые категории в WordPress
31.01.2026
Как установить автоматический редирект в WordPress без плагинов
24.01.2026
Хуки и фильтры WooCommerce: практическое руководство по автоматизации
30.04.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
26.05.2026