WooCommerce: автоматическое изменение стоимости и наличия товаров по расписанию

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

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

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

  • Вы хотите, чтобы цены менялись без вашего участия в строго заданное время (например, каждый день или неделю).
  • Необходимо автоматически менять статус наличия товара (в наличии/нет в наличии) в зависимости от времени или других условий.
  • Вы работаете со стандартными товарами WooCommerce (simple) или вариативными.
  • Вы готовы добавить свой код в functions.php или в собственный плагин.

Решение: изменение цены и статуса наличия через WP-Cron и хук WooCommerce

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

1. Добавление кастомного интервала для WP-Cron

add_filter('cron_schedules', function($schedules) {
    if(!isset($schedules['every_hour'])) {
        $schedules['every_hour'] = [
            'interval' => 3600, // 1 час
            'display' => __('Каждый час')
        ];
    }
    return $schedules;
});

2. Регистрация и запуск крон-задачи

function schedule_price_stock_update() {
    if(!wp_next_scheduled('update_price_and_stock_hook')) {
        wp_schedule_event(time(), 'every_hour', 'update_price_and_stock_hook');
    }
}
add_action('wp', 'schedule_price_stock_update');

3. Функция для обновления цены и наличия товаров

add_action('update_price_and_stock_hook', function() {
    // Получаем товары, которые нужно обновить (например, по категории или метке)
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => 'sale' // пример категории
            ]
        ]
    ];
    $products = get_posts($args);

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

        $current_hour = (int) current_time('H');

        // Пример логики: с 9 до 18 цена снижается, в остальное время — обычная цена
        if($current_hour >= 9 && $current_hour < 18) {
            $sale_price = $product->get_regular_price() * 0.9; // скидка 10%
            $product->set_sale_price($sale_price);
            $product->set_stock_status('instock');
        } else {
            $product->set_sale_price('');
            $product->set_stock_status('outofstock');
        }

        $product->save();
    }
});

Проверка результата

  • Дождитесь запуска крон-задачи (или запустите вручную через WP CLI: wp cron event run update_price_and_stock_hook).
  • Зайдите в админку WooCommerce, в карточки товаров категории sale и проверьте актуальные цены и статус наличия.
  • Проверьте отображение на фронтенде — цены должны меняться в зависимости от времени суток.

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

  • Крон-задача не запускается: Проверьте, что WP-Cron активен и работает. Для теста запустите команду вручную через WP CLI или используйте плагин WP Crontrol.
  • Товары не обновляются: Убедитесь, что правильно указана категория или критерии выборки товаров в запросе.
  • Цена не меняется или сбрасывается некорректно: Используйте методы set_sale_price() и set_regular_price() корректно, не забывайте вызывать save() у объекта товара.
  • Статус наличия не обновляется: Убедитесь, что используете set_stock_status() с допустимыми значениями: instock, outofstock, onbackorder.

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

  • WP-Cron вызывается при заходе пользователей на сайт. Для точного расписания рекомендуется настроить системный cron на сервере для вызова wp-cron.php.
  • Если товаров много, разбивайте обработку на чанки, чтобы избежать превышения лимита памяти и таймаута.
  • Кешируйте результаты выборки, если планируете использовать данные в других местах.
  • Для изменения цен и наличия в реальном времени рассмотрите интеграцию с внешними системами через Webhook или API.

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

СпособПлюсыМинусыПример
WP-Cron + кастомный кодГибкость, не требует сторонних плагиновЗависит от посещаемости, требует навыков PHPДемонстрируется в статье
Плагины (например, WooCommerce Scheduler)Простота настройки, интерфейсМожет быть избыточным, ограничены условияClearfy Pro — оптимизация и автоматизация
Внешние скрипты + REST APIПолный контроль, интеграция с ERPСложность, требует поддержки сервераКод с wp_remote_post для обновления товаров
WooCommerce: автоматическое изменение стоимости и наличия товаров через Webhook с подробным примером
13.06.2026
Как автоматически создавать уникальные изображения для постов в WordPress
06.04.2026
Как автоматически создать XML Sitemap в WordPress с помощью кода
30.03.2026
Автоматическое отключение неактивных заказов в WooCommerce
09.06.2026
Как автоматически создавать посты с изображениями в WordPress
26.02.2026