WooCommerce: автоматическое изменение цен по акциям на основе даты

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

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

Как автоматически менять цены товаров по дате в WooCommerce

Выбор подхода: изменение цены напрямую или через скидки

В WooCommerce можно менять цену товара двумя способами:

  • Прямое изменение цены regular_price или sale_price в мета-данных товара.
  • Использование поля sale_price и sale_price_dates_from, sale_price_dates_to для установки периода акции.

Второй способ предпочтительнее, так как WooCommerce учитывает периоды акции и автоматически применяет скидку.

Пример кода для автоматического включения и выключения скидок по расписанию

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

add_action('init', 'auto_set_sale_price_by_date');
function auto_set_sale_price_by_date() {
    if ( wp_doing_cron() ) {
        return; // избегаем вызов во время cron
    }

    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_auto_sale_start',
                'compare' => 'EXISTS',
            ],
        ],
    ];

    $products = get_posts($args);
    $now = current_time('Y-m-d');

    foreach ( $products as $product_post ) {
        $product = wc_get_product($product_post->ID);
        $start_date = get_post_meta($product->get_id(), '_auto_sale_start', true);
        $end_date = get_post_meta($product->get_id(), '_auto_sale_end', true);
        $sale_price = get_post_meta($product->get_id(), '_auto_sale_price', true);

        if ( !$start_date || !$end_date || !$sale_price ) {
            continue;
        }

        if ( $now >= $start_date && $now <= $end_date ) {
            // В период акции включаем скидку
            $product->set_sale_price($sale_price);
            $product->set_date_on_sale_from(strtotime($start_date));
            $product->set_date_on_sale_to(strtotime($end_date));
            $product->save();
        } else {
            // Вне периода акции сбрасываем скидку
            $product->set_sale_price('');
            $product->set_date_on_sale_from('');
            $product->set_date_on_sale_to('');
            $product->save();
        }
    }
}

В этом коде мы предполагаем, что для товаров заданы пользовательские мета-поля:

  • _auto_sale_start — дата начала акции в формате YYYY-MM-DD
  • _auto_sale_end — дата окончания акции
  • _auto_sale_price — цена со скидкой

Вы можете задать эти поля вручную или через админку с помощью Advanced Custom Fields или другого плагина.

Добавление задачи в планировщик WP-Cron для автоматизации обновлений

Чтобы скидки автоматически включались и выключались без ручного вызова функции, зарегистрируйте cron-задание:

add_action('wp', 'auto_sale_schedule_cron');
function auto_sale_schedule_cron() {
    if ( ! wp_next_scheduled( 'auto_sale_update_event' ) ) {
        wp_schedule_event(time(), 'hourly', 'auto_sale_update_event');
    }
}

add_action('auto_sale_update_event', 'auto_set_sale_price_by_date');

Этот код запускает проверку скидок каждый час. Вы можете изменить интервал на дневной, если хотите.

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

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

  • Проверьте в админке, что у нужных товаров заполнены мета-поля _auto_sale_start, _auto_sale_end, _auto_sale_price.
  • Запустите функцию вручную (например, через WP-CLI или временно вызовом auto_set_sale_price_by_date() в functions.php) и проверьте, изменились ли цены и даты начала/окончания акции.
  • Посмотрите карточку товара на сайте — цена должна отображаться как со скидкой в период акции.
  • Проверьте, что после окончания периода скидка исчезает и цена возвращается к обычной.

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

  • Скидка не применяется: проверьте правильность формата дат (YYYY-MM-DD) и наличие мета-полей.
  • Цены не обновляются автоматически: убедитесь, что cron-задание зарегистрировано и выполняется. Используйте плагин WP Crontrol для просмотра и запуска cron-событий.
  • Функция слишком ресурсоёмка: если товаров много, оптимизируйте запросы, добавьте постраничную обработку.
  • Проблемы с кешем: если используется кеширование страниц, очистите кеш после изменения цен.

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

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

Сравнение вариантов автоматизации изменения цен в WooCommerce

ВариантПлюсыМинусыКогда использовать
Ручное изменение ценПросто, не требует кодаОшибка человека, неудобно для акцийМало товаров, редкие акции
Использование полей sale_price_dates_from/toАвтоматическое включение/выключение скидок WooCommerceНужно заранее задавать даты для каждого товараСредние магазины с планируемыми акциями
Кастомный код с cronГибкое управление, можно автоматизировать по сложным правиламТребует поддержки и отладкиБольшие магазины, сложные акции
Плагины для управления акциямиГрафический интерфейс, дополнительные функцииМожет нагружать сайт, стоит денегБыстрое внедрение без кода
Как автоматизировать ответы на комментарии в WordPress с помощью GPT
18.12.2025
Как создать автоматический генератор описаний для продуктов в WordPress с помощью GPT
28.01.2026
Как использовать WPGPT для автоматизации создания контекста в блоках Gutenberg
26.03.2026
Автоматический перевод отзывов в WordPress с помощью WPGPT
11.02.2026
WooCommerce: автоматическое изменение цен по акциям на основе даты
16.06.2026