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

Диагностика задачи: зачем и когда нужна автоматизация скидок в WooCommerce

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

Чаще всего пользователи хотят автоматически создавать купоны со скидками на фиксированную сумму или процент, чтобы они активировались и деактивировались по расписанию без плагинов. Встроенных средств WooCommerce для периодического создания и удаления купонов нет, поэтому задача решается через WP-Cron и программный код.

Пошаговое решение: автосоздание купонов через WP-Cron

1. Создание функции генерации купона с параметрами

Сначала создадим функцию, которая программно создаст купон с заданными параметрами (название, тип скидки, сумма, дата действия).

function wpmax_create_scheduled_coupon($code, $discount_type, $amount, $expiry_date) {
    if (coupon_exists($code)) {
        return; // Купон с таким кодом уже есть
    }

    $coupon = array(
        'post_title' => $code,
        'post_content' => '',
        'post_status' => 'publish',
        'post_author' => 1,
        'post_type' => 'shop_coupon'
    );

    $coupon_id = wp_insert_post($coupon);

    if (!$coupon_id || is_wp_error($coupon_id)) {
        return;
    }

    update_post_meta($coupon_id, 'discount_type', $discount_type); // 'fixed_cart' или 'percent'
    update_post_meta($coupon_id, 'coupon_amount', $amount);
    update_post_meta($coupon_id, 'individual_use', 'no');
    update_post_meta($coupon_id, 'usage_limit', '');
    update_post_meta($coupon_id, 'expiry_date', $expiry_date); // формат YYYY-MM-DD
    update_post_meta($coupon_id, 'apply_before_tax', 'yes');
    update_post_meta($coupon_id, 'free_shipping', 'no');
}

function coupon_exists($code) {
    $args = array(
        'post_type' => 'shop_coupon',
        'title' => $code,
        'post_status' => 'publish',
        'posts_per_page' => 1
    );
    $coupons = get_posts($args);
    return !empty($coupons);
}

2. Регистрация CRON-задачи для проверки и создания купонов

Добавим задачу, которая ежедневно проверяет нужно ли создать купон по расписанию.

add_action('wpmax_daily_coupon_check', 'wpmax_coupon_schedule_handler');

function wpmax_coupon_schedule_handler() {
    // Пример: создаем купон на 10% скидку с 1 по 7 число каждого месяца
    $today = date('Y-m-d');
    $day = date('j');
    if ($day === '1') {
        $expiry = date('Y-m-07');
        wpmax_create_scheduled_coupon('monthly10percent', 'percent', 10, $expiry);
    }
    
    // Здесь можно добавить другие условия и купоны
}

// Регистрируем событие при активации темы/плагина
if (!wp_next_scheduled('wpmax_daily_coupon_check')) {
    wp_schedule_event(time(), 'daily', 'wpmax_daily_coupon_check');
}

3. Очистка устаревших купонов

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

function wpmax_delete_expired_coupons() {
    $today = date('Y-m-d');
    $args = array(
        'post_type' => 'shop_coupon',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'expiry_date',
                'value' => $today,
                'compare' => '<',
                'type' => 'DATE'
            )
        )
    );
    $expired_coupons = get_posts($args);
    foreach ($expired_coupons as $coupon) {
        wp_delete_post($coupon->ID, true);
    }
}

// Вызываем очистку внутри обработчика
function wpmax_coupon_schedule_handler() {
    wpmax_delete_expired_coupons();
    // ... создание купонов
}

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

  1. В админке WooCommerce перейдите в Маркетинг > Купоны и убедитесь, что купон с заданным кодом появился после запуска CRON (ожидайте до суток или запустите вручную событие с помощью плагина WP Crontrol).
  2. Проверьте дату окончания действия купона в метаполях или интерфейсе.
  3. Попробуйте применить купон при оформлении заказа, чтобы убедиться, что скидка применяется корректно.
  4. Проверьте, что устаревшие купоны удаляются после срока действия.

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

  • CRON-задача не срабатывает: Проверьте, активен ли WP-Cron с помощью плагина WP Crontrol. Если сайт имеет низкий трафик, cron может не запускаться вовремя. Для надежной работы настройте системный cron на сервере.
  • Купон не создается из-за дублирования: Функция coupon_exists проверяет только по заголовку. Если купон не удаляется после истечения срока, нужно вручную проверить и очистить базу.
  • Неправильный формат даты в метаполях: Дата должна быть в формате YYYY-MM-DD, иначе WooCommerce не распознает срок действия корректно.
  • Скидка не применяется: Убедитесь, что параметры скидки заданы корректно — тип скидки percent или fixed_cart и сумма указана без лишних символов.

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

  • Для больших магазинов с сотнями купонов оптимизируйте запросы, используйте WP_Query с пагинацией при очистке устаревших купонов.
  • Не создавайте слишком много однотипных купонов — лучше объединять скидки в один купон с условиями.
  • Регулярно проверяйте логи ошибок PHP и WP-Cron, чтобы выявлять проблемы с автоматизацией.
  • Для безопасного добавления кода используйте дочернюю тему или создайте собственный плагин, чтобы избежать потери изменений при обновлениях.

Сравнение вариантов реализации автоматических скидок в WooCommerce

ВариантПлюсыМинусыКомпромисс
Плагины (например, WooCommerce Scheduler)Простота настройки, готовый функционал, UIЗависимость от сторонних решений, нагрузкаИспользовать для небольших магазинов или быстрых задач
Собственный код + WP-CronГибкость, отсутствие лишних плагинов, контрольТребует навыков, ответственность за поддержкуРекомендуется для опытных разработчиков и кастомных задач
Ручное создание купоновПростота, отсутствие кодаРучной труд, ошибки, нет автоматизацииПодходит для нерегулярных акций
WooCommerce: как избежать конфликтов между кастомными плагинами
30.06.2026
Как создать адаптивный обзор постов с помощью AJAX в WordPress
13.02.2026
Как удалить автоматические ревизии в WordPress для оптимизации базы данных
24.02.2026
Как создать и использовать зависимый плагин в WordPress
13.04.2026
Как добавить уникальные поля в WooCommerce без плагинов
23.12.2025