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

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

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

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

Пошаговое решение: реализация автоматического изменения цен и скидок в WooCommerce

1. Определяем расписание и товары для изменения цен

Для начала решим, по какому расписанию будем менять цены. Допустим, нужно установить скидку 20% на определённые категории товаров с пятницы 00:00 до воскресенья 23:59.

2. Создаём функцию для применения скидки

Далее напишем функцию, которая пройдётся по нужным товарам и изменит их цену.

function wpb_apply_weekend_discount() {
    if ( ! class_exists('WooCommerce') ) return;
    $today = current_time('w'); // 5=пятница,6=суббота,0=воскресенье
    if ( in_array($today, array(5,6,0)) ) {
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field' => 'slug',
                    'terms' => array('sale-category') // Замените на вашу категорию
                )
            )
        );
        $loop = new WP_Query( $args );
        while ( $loop->have_posts() ) : $loop->the_post();
            $product = wc_get_product( get_the_ID() );
            $regular_price = floatval($product->get_regular_price());
            if ( $regular_price > 0 ) {
                $sale_price = $regular_price * 0.8; // скидка 20%
                $product->set_sale_price( $sale_price );
                $product->save();
            }
        endwhile;
        wp_reset_postdata();
    } else {
        // В остальные дни снимаем скидки
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => -1,
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field' => 'slug',
                    'terms' => array('sale-category')
                )
            )
        );
        $loop = new WP_Query( $args );
        while ( $loop->have_posts() ) : $loop->the_post();
            $product = wc_get_product( get_the_ID() );
            if ( $product->get_sale_price() ) {
                $product->set_sale_price('');
                $product->save();
            }
        endwhile;
        wp_reset_postdata();
    }
}

3. Запускаем функцию по расписанию через WP-Cron

Создадим событие WP-Cron, которое будет запускать эту функцию ежедневно в полночь.

function wpb_schedule_discount_cron() {
    if ( ! wp_next_scheduled( 'wpb_daily_discount_event' ) ) {
        wp_schedule_event( strtotime('00:00:00'), 'daily', 'wpb_daily_discount_event' );
    }
}
add_action( 'wp', 'wpb_schedule_discount_cron' );
add_action( 'wpb_daily_discount_event', 'wpb_apply_weekend_discount' );

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

  • Посмотреть страницу с товарами из категории sale-category в пятницу, субботу и воскресенье — цены должны отображаться со скидкой 20%.
  • В другие дни скидки должны автоматически сниматься.
  • Можно проверить в админке WooCommerce на странице редактирования товара, отображается ли поле "Цена со скидкой" с нужным значением.
  • Логирование: для отладки можно добавить запись в лог при каждом запуске функции, например через error_log().

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

  • Скидки не применяются: Проверьте, активен ли WP-Cron на сайте, нет ли конфликтов с другими плагинами, и правильно ли указана категория товаров.
  • Функция запускается чаще, чем нужно: Убедитесь, что хук для планировщика установлен только один раз. Используйте wp_next_scheduled() для проверки.
  • Цены не обновляются на фронтенде: Очистите кеш сайта и браузера, проверьте, не конфликтует ли кеширование с динамическим обновлением цен.
  • Ошибка при сохранении товара: Убедитесь, что функция вызывается в подходящий момент, и объект продукта корректно инициализирован.

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

  • Если товаров много, разбейте обновление на части через batch-обработку, чтобы избежать таймаутов.
  • Используйте транзиенты для кеширования результатов выборки товаров, если расписание меняется редко.
  • Для безопасности не меняйте цены напрямую в базе — используйте методы API WooCommerce (set_sale_price, save).
  • Для дополнительного контроля добавьте проверку прав пользователя, если функция вызывается из админки.

Сравнение подходов: код vs плагины для автоматического изменения цен

МетодПлюсыМинусы
Собственный код WP-Cron + WooCommerce APIМаксимальная гибкость, нет лишних зависимостей, легко адаптировать под задачиТребует навыков программирования, возможны ошибки при реализации
Плагины автоматизации скидок (например, WooCommerce Dynamic Pricing)Готовое решение, удобный интерфейс, поддержка сложных правилСтоимость, возможные конфликты, нагрузка на сайт, избыточность для простых задач
Как добавить уникальные метаданные для продуктов WooCommerce и вывести их на страницу товара
07.02.2026
Как отключить REST API в WordPress без потери функциональности
01.04.2026
WooCommerce: как автоматически удалять неактивные варианты товара
27.06.2026
WooCommerce: как автоматически удалять неактивные заказы
23.04.2026
Как удалить или изменить slug в WordPress без потери SEO
14.11.2025