Проблема: необходимость менять цену и наличие товара автоматически
В интернет-магазинах на 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_Product—set_regular_price(),set_catalog_visibility(),set_stock_status(), и не забывайте вызыватьsave().
Практические советы для безопасности и производительности
- Не запускайте обновления слишком часто — выбирайте интервал в зависимости от задачи, обычно 10-15 минут достаточно.
- Для множества товаров лучше использовать batch-обработку с лимитом на каждый запуск WP-Cron.
- Избегайте изменения цены и статуса в пиковые часы посещаемости, чтобы не создавать нагрузку.
- Проверяйте совместимость с плагинами кеширования и настройте исключения для страниц с товарами.
Сравнение вариантов реализации автоматического обновления цены и наличия
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин для расписания акций | Готовое решение, простота | Ограниченная гибкость, может не менять наличие | Использовать для простых задач |
| Кастомный WP-Cron с кодом (как в статье) | Максимальная гибкость, настройка любых условий | Требует навыков разработки, правильной настройки WP-Cron | Подходит для сложных сценариев |
| Ручное обновление через админку | Простота, без кода | Трудозатратно, не автоматично | Для редких изменений |