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

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

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

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

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

1. Создаём кастомное событие WP-Cron

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

if (! wp_next_scheduled('wpqa_update_woocommerce_prices')) {
    wp_schedule_event(time(), 'hourly', 'wpqa_update_woocommerce_prices');
}

Это запустит событие wpqa_update_woocommerce_prices ежечасно. Для тестирования можно заменить 'hourly' на 'every_minute' через регистрацию кастомного интервала (см. ниже).

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

Подпишемся на событие и реализуем логику обновления цен в зависимости от времени. Пример: с 18:00 до 23:00 скидка 20% на все товары с категорией «Акция».

add_action('wpqa_update_woocommerce_prices', 'wpqa_update_prices_by_time');

function wpqa_update_prices_by_time() {
    $current_hour = (int) current_time('H');
    $discount_start = 18;
    $discount_end = 23;

    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => 'aktsiya',
            ],
        ],
        'fields' => 'ids',
    ];
    $product_ids = get_posts($args);

    foreach ($product_ids as $product_id) {
        $product = wc_get_product($product_id);
        if (!$product) continue;

        $regular_price = (float) $product->get_regular_price();

        if ($current_hour >= $discount_start && $current_hour < $discount_end) {
            $new_price = $regular_price * 0.8; // скидка 20%
        } else {
            $new_price = $regular_price; // обычная цена
        }

        $current_price = (float) $product->get_price();
        if ($current_price !== $new_price) {
            $product->set_price($new_price);
            $product->save();
        }
    }
}

3. (Опционально) Добавляем интервал для проверки чаще часа

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

add_filter('cron_schedules', 'wpqa_custom_cron_intervals');
function wpqa_custom_cron_intervals($schedules) {
    if (!isset($schedules['every_minute'])) {
        $schedules['every_minute'] = [
            'interval' => 60,
            'display'  => 'Каждую минуту'
        ];
    }
    return $schedules;
}

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

  • Проверить в разделе «Инструменты > Запланированные задачи» (если установлен плагин WP Crontrol), что событие wpqa_update_woocommerce_prices запланировано.
  • В разное время суток проверить изменение цены товаров из категории «Акция» на странице товара и в корзине.
  • Логировать изменения для отладки, например через error_log() внутри функции обновления.

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

  • Отсутствие запланированного события: убедитесь, что wp_schedule_event() вызывается только один раз, иначе могут быть дубли. Используйте проверку wp_next_scheduled().
  • WP-Cron не запускается регулярно: WP-Cron запускается при посещениях сайта, на малопосещаемых сайтах интервалы могут сбиваться. Для надежности настроить системный cron на вызов wp-cron.php.
  • Цены не меняются: проверьте, что категория «акция» существует и правильно указана в запросе. Также убедитесь, что цена у товара задана в поле regular_price.
  • Некорректное время: используйте current_time('H') для получения времени по настройкам WordPress, а не date('H').

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

  • Обновляйте цены только при необходимости — сравнивайте текущую цену и новую, чтобы избежать лишних операций сохранения.
  • Если товаров очень много, разбивайте обновление на части (пагинация в WP_Query) или используйте очереди для уменьшения нагрузки.
  • Для надежности WP-Cron лучше запускать через системный cron (пример для Linux): */5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Логируйте ошибки и изменения в отдельный файл для анализа без влияния на пользовательский опыт.

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

МетодОписаниеПлюсыМинусы
WP-Cron + кастомный кодАвтоматическое обновление цены по расписанию через WP-CronГибкость, нет сторонних плагиновЗависимость от посещаемости сайта, нагрузка при большом количестве товаров
Плагины для динамических ценГотовые решения с интерфейсом для настройки скидок по времениУдобство, дополнительные функции (условия, купоны)Платные, могут быть избыточны или конфликтовать
WP-Cron + вызов внешнего сервисаВнешний скрипт меняет цены через REST APIОтделение нагрузки, интеграция с CRMСложность настройки, безопасность API
Как изменить стоимость доставки в WooCommerce в зависимости от роли пользователя
07.05.2026
Как сделать отложенную загрузку для скриптов в WordPress
23.01.2026
Автоматическое удаление старых changelog-ов в WordPress: практическое руководство
09.02.2026
Как использовать WPRemark для автоматического комментирования в WordPress
06.02.2026
WooCommerce: как разрешить отслеживать отсроченные платежи и корректно обрабатывать заказы
16.07.2026