WooCommerce: автоматическое изменение цен товаров по расписанию с помощью кода

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

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

Как работает расписание изменения цен в WooCommerce: обзор подхода

Основная идея — создать WP-Cron задачу, которая будет в нужное время запускать функцию изменения цен. Эта функция проходит по товарам и обновляет цену (например, стоимость продаж или базовую цену) согласно заданным условиям. Для активации расписания достаточно добавить код в functions.php темы или в свой плагин.

Почему WP-Cron, а не системный cron

WP-Cron запускается при заходе посетителей на сайт, что достаточно для большинства сайтов. Если нужен точный cron, его можно настроить через сервер, но WP-Cron — простой и универсальный вариант.

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

1. Регистрируем событие WP-Cron

if (!wp_next_scheduled('custom_price_update_cron')) {
    wp_schedule_event(strtotime('00:00:00'), 'daily', 'custom_price_update_cron');
}

Это создаст ежедневное событие в полночь.

2. Создаем функцию обновления цен

add_action('custom_price_update_cron', 'update_product_prices_by_schedule');

function update_product_prices_by_schedule() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
    ];
    $products = get_posts($args);

    foreach ($products as $product_post) {
        $product = wc_get_product($product_post->ID);
        if (!$product) continue;

        // Пример: применяем скидку 10% на все товары
        $regular_price = $product->get_regular_price();
        if ($regular_price) {
            $new_price = $regular_price * 0.9; // скидка 10%
            $product->set_sale_price($new_price);
            $product->save();
        }
    }
}

3. Очистка цен после окончания акции

Чтобы убрать скидку после определённой даты, можно добавить еще одно cron-событие или расширить текущую функцию проверкой даты и сбросом цены.

function reset_sale_prices() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
    ];
    $products = get_posts($args);

    foreach ($products as $product_post) {
        $product = wc_get_product($product_post->ID);
        if (!$product) continue;

        // Сброс скидочной цены
        $product->set_sale_price('');
        $product->save();
    }
}
// Зарегистрировать cron для сброса, например, через неделю после начала акции
if (!wp_next_scheduled('custom_price_reset_cron')) {
    wp_schedule_event(strtotime('+7 days 00:00:00'), 'daily', 'custom_price_reset_cron');
}
add_action('custom_price_reset_cron', 'reset_sale_prices');

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

  • Перейдите в WooCommerce > Товары и выберите товар, у которого должна измениться цена.
  • Проверьте, что цена продаж изменилась согласно расписанию.
  • Для проверки cron-заданий используйте плагин WP Crontrol — он покажет запланированные задачи и позволит запустить их вручную.
  • Включите логирование ошибок PHP для отладки, если цены не меняются.

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

  • WP-Cron не запускается: если на сайт редко заходят посетители, cron-задачи не запускаются. Решение — настроить системный cron или вручную запускать через WP Crontrol.
  • Функция не обновляет цену: проверьте, что продукт получен через wc_get_product() и что цена есть. Убедитесь, что вызывается $product->save().
  • Цена меняется, но в магазине не отображается: очистите кэш сайта и браузера, проверьте кэш плагинов.
  • Хранение цены в метаданных: не меняйте напрямую мета-поля _price, используйте методы WooCommerce для обновления цен.

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

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

Сравнение вариантов реализации автоматического изменения цен

СпособПлюсыМинусыКомпромисс
WP-Cron + кастомный кодПростота, гибкость, не требует плагиновЗависит от посещаемости сайта, требует навыков программированияПодходит для малого и среднего магазина
Системный cron + кастомный кодТочный запуск, стабильностьТребует доступа к серверу, технические знанияЛучше для больших сайтов с большим трафиком
Плагины для акций и скидокУдобный интерфейс, готовые функцииЧасто платные, могут нагружать сайтХорошо для магазинов без разработчиков
Автоматическая оптимизация базы данных WordPress: как улучшить производительность сайта
30.03.2026
WooCommerce: решение проблемы с отключённой платёжной системой
21.04.2026
Как автоматизировать управление комментариями в WordPress
09.03.2026
Как использовать WP-Cron для решения проблем с задержкой запусков задач в WordPress
18.04.2026
Как удалить старые перенаправления и исправить циклы редиректов в WordPress
22.08.2026