Проблема: необходимость автоматического обновления цен и остатков товаров в 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 для обновления товаров |