WooCommerce: как изменить стоимость товара по времени с помощью WP-Cron

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

Частая задача для интернет-магазинов — менять цену товара в зависимости от времени суток, акции или временных периодов. Например, сделать скидку только вечером или увеличить цену в пиковые часы. Стандартных функций WooCommerce для этого нет, но можно реализовать через WP-Cron и пользовательский код.

Диагностика задачи и требования

Нужно определить:

  • Какие товары и когда меняют цену
  • На какое значение меняется цена (фиксированная или процентная скидка)
  • Как вернуть цену к исходной после окончания периода

WP-Cron — это инструмент для планирования задач в WordPress, который позволит автоматически запускать код в нужное время.

Пошаговое решение: настройка изменения цены по времени

1. Добавление метаполей для хранения исходной цены и условий

Сначала сохраняем оригинальную цену товара в метаполе, чтобы можно было ее восстанавливать.

add_action('save_post_product', 'save_original_price_on_product_save');
function save_original_price_on_product_save($post_id) {
    if (get_post_type($post_id) !== 'product') return;
    $product = wc_get_product($post_id);
    $price = $product->get_regular_price();
    update_post_meta($post_id, '_original_regular_price', $price);
}

2. Создание функции изменения цены

Функция будет менять цену на заданный процент, например, снижать на 20% вечером (с 18 до 23 часов).

function change_product_price_by_time() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
    ];
    $products = get_posts($args);
    $current_hour = (int) current_time('H');

    foreach ($products as $product_post) {
        $product = wc_get_product($product_post->ID);
        $original_price = get_post_meta($product->get_id(), '_original_regular_price', true);
        if (!$original_price) continue;

        // Временной интервал для скидки: 18-23
        if ($current_hour >= 18 && $current_hour <= 23) {
            $new_price = $original_price * 0.8; // скидка 20%
            $product->set_price($new_price);
            $product->set_regular_price($new_price);
        } else {
            // Вне интервала - восстановить оригинальную цену
            $product->set_price($original_price);
            $product->set_regular_price($original_price);
        }
        $product->save();
    }
}

3. Регистрация WP-Cron задачи

Добавим собственное событие, которое будет запускать изменение цены каждый час.

add_action('change_price_hourly_event', 'change_product_price_by_time');

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

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

  • Зайдите в админку WooCommerce и посмотрите цены товаров утром и вечером
  • Проверьте метаполе _original_regular_price для товаров через phpMyAdmin или плагин типа Advanced Custom Fields
  • Для отладки можно временно добавить логирование времени и цены в файл debug.log через error_log()
  • Запустите задачу вручную, используя wp cron event run change_price_hourly_event из WP-CLI

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

  • WP-Cron не запускается автоматически: Проверьте, что на хостинге разрешён WP-Cron или настройте системный cron на запуск wp-cron.php.
  • Цена не меняется: Убедитесь, что метаполе _original_regular_price заполнено. Возможно, товар создали до внедрения кода — сохраните товар заново.
  • Цена не возвращается к исходной: Функция должна всегда восстанавливать цену вне временного интервала, проверьте логику условий.
  • Изменения цены не видны на фронте: Очистите кеш, если используете кеширование страниц и объектов.

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

  • Для магазинов с большим количеством товаров оптимизируйте выборку, используйте постраничную обработку.
  • Не храните изменённую цену в постоянных метаполях, используйте transient API для временного кеширования, если нужно.
  • Для безопасности не давайте возможности менять цену через GET-запросы, все изменения должны происходить только по крону.
  • Проверяйте наличие плагинов кеширования и тестируйте совместимость.

Сравнение вариантов реализации

СпособПлюсыМинусы
Код с WP-CronГибкость, нет плагинов, можно адаптировать под любые условияЗависимость от cron, требует знаний PHP, может замедлять сайт при большом каталоге
Плагины динамического ценообразованияПростота настройки, поддержка, дополнительные функцииПлатные, могут конфликтовать, меньше контроля
Ручное изменение через админкуПростота, без кодаНе автоматизируется, риск ошибок
Как создать динамический виджет в WordPress с примерами кода
02.04.2026
Как автоматизировать рассылку новостей в WordPress
17.02.2026
WooCommerce: автоматическое изменение стоимости товара в зависимости от роли пользователя
08.06.2026
Автоматический импорт CSV в WordPress: практическое руководство
01.03.2026
Оптимизация изображений в WordPress для ускорения сайта
24.12.2025