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

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

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

Диагностика проблемы

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

Что проверить перед началом:

  • Активирован ли WP-Cron (проверьте, что define('DISABLE_WP_CRON', true); не стоит в wp-config.php)
  • Работает ли обновление товаров вручную (цена, наличие)
  • Наличие плагинов кеширования, которые могут мешать оперативному обновлению данных

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

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

Если нужны нестандартные интервалы, расширяем WP-Cron, добавив новый интервал, например, каждые 10 минут:

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['every_ten_minutes'])) {
        $schedules['every_ten_minutes'] = [
            'interval' => 600, // 600 секунд = 10 минут
            'display' => __('Каждые 10 минут')
        ];
    }
    return $schedules;
});

2. Регистрируем событие для обновления товаров

Запланируем событие, если оно ещё не запущено:

if (!wp_next_scheduled('custom_update_product_price_and_stock')) {
    wp_schedule_event(time(), 'every_ten_minutes', 'custom_update_product_price_and_stock');
}

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

В этой функции определяем, какие товары и как менять по времени.

add_action('custom_update_product_price_and_stock', function() {
    $current_time = current_time('H:i'); // локальное время хоста WP в формате ЧЧ:мм

    // Пример: с 22:00 до 06:00 скрывать товар с ID 123 и менять цену на 999
    $product_id = 123;
    $product = wc_get_product($product_id);
    if (!$product) return;

    if ($current_time >= '22:00' || $current_time < '06:00') {
        // Устанавливаем цену и скрываем из каталога
        $product->set_regular_price(999);
        $product->set_catalog_visibility('hidden'); // скрыть из каталога
        $product->set_stock_status('outofstock');
    } else {
        // Восстанавливаем исходные значения
        $product->set_regular_price(1500); // исходная цена
        $product->set_catalog_visibility('visible');
        $product->set_stock_status('instock');
    }
    $product->save();
});

4. Очистка кеша и обновление кэша WooCommerce

Если у вас есть кеширование страниц или объектный кеш, нужно сбрасывать кэш после обновления товара, чтобы изменения сразу появились на сайте.

add_action('custom_update_product_price_and_stock', function() {
    // ... код обновления товара ...
    wc_delete_product_transients($product_id); // удаляет кэш товара
    if (function_exists('wp_cache_flush')) {
        wp_cache_flush();
    }
});

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

  • Убедитесь, что событие WP-Cron запланировано: выполните в терминале или плагине WP Crontrol команду для просмотра запланированных задач.
  • Проверьте изменение цены и наличия товара в админке и на фронтенде в заданное время.
  • Очистите кэш браузера и кеш сайта, если изменения не видны сразу.
  • Для отладки можно добавить запись в лог внутри функции обновления:
error_log('Обновление товара ID ' . $product_id . ' в ' . current_time('Y-m-d H:i:s'));

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

  • Отсутствие срабатывания WP-Cron: Проверьте, что WP-Cron не отключен, и что на сайте есть посещения — WP-Cron зависит от заходов пользователей. Для стабильной работы можно настроить системный cron на сервере.
  • Изменения не отображаются на сайте: Проверьте кэширование страниц и объекта, сбрасывайте кеш после обновления товара.
  • Неправильное время выполнения: Убедитесь, что используете current_time() с правильным форматом и часовым поясом WordPress.
  • Ошибки в коде обновления товара: Используйте методы класса WC_Productset_regular_price(), set_catalog_visibility(), set_stock_status(), и не забывайте вызывать save().

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

  • Не запускайте обновления слишком часто — выбирайте интервал в зависимости от задачи, обычно 10-15 минут достаточно.
  • Для множества товаров лучше использовать batch-обработку с лимитом на каждый запуск WP-Cron.
  • Избегайте изменения цены и статуса в пиковые часы посещаемости, чтобы не создавать нагрузку.
  • Проверяйте совместимость с плагинами кеширования и настройте исключения для страниц с товарами.

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

ВариантПлюсыМинусыКомпромисс
Плагин для расписания акцийГотовое решение, простотаОграниченная гибкость, может не менять наличиеИспользовать для простых задач
Кастомный WP-Cron с кодом (как в статье)Максимальная гибкость, настройка любых условийТребует навыков разработки, правильной настройки WP-CronПодходит для сложных сценариев
Ручное обновление через админкуПростота, без кодаТрудозатратно, не автоматичноДля редких изменений
WooCommerce: автоматическое удаление заказов по статусу и дате в 2024
01.07.2026
Отключение автосохранения и ревизий в WordPress для ускорения редактирования
21.05.2026
Как отключить кеширование в WooCommerce без плагинов: практическое руководство
23.04.2026
WooCommerce: как автоматически удалять товары при пустой корзине
29.05.2026
Автоматическая регистрация пользователей в WordPress: как настроить и автоматизировать процесс
02.12.2025