Диагностика задачи: зачем менять цену товара по времени
В WooCommerce иногда требуется автоматически менять стоимость товара в зависимости от времени суток, дня недели или специальных периодов (например, акция с 9:00 до 18:00). Стандартными средствами это реализовать сложно, а плагины для динамического ценообразования часто избыточны и влияют на производительность.
Если вы хотите реализовать смену цены товара по расписанию с минимальным количеством сторонних плагинов, WP-Cron — удобное решение.
Пошаговое решение: реализация изменения цены с WP-Cron
1. Создаем функцию для смены цены
Ниже пример функции, которая изменяет цену товара с ID 123 на заданную сумму:
function set_product_price_by_id($product_id, $new_price) {
$product = wc_get_product($product_id);
if (!$product) return false;
$product->set_regular_price($new_price);
$product->save();
return true;
}2. Регистрируем WP-Cron событие
Добавим расписание и событие, которое будет вызывать смену цены:
add_action('init', function() {
if (!wp_next_scheduled('change_price_event')) {
wp_schedule_event(time(), 'hourly', 'change_price_event');
}
});
add_action('change_price_event', function() {
$current_hour = (int) current_time('H');
$product_id = 123; // ID товара
if ($current_hour >= 9 && $current_hour < 18) {
set_product_price_by_id($product_id, 1000); // Цена в рабочие часы
} else {
set_product_price_by_id($product_id, 1200); // Цена вне рабочего времени
}
});3. Добавление пользовательского расписания (если нужно)
По умолчанию WP-Cron поддерживает расписания 'hourly', 'twicedaily', 'daily'. Для более точного контроля можно добавить собственные интервалы:
add_filter('cron_schedules', function($schedules) {
$schedules['every_15_minutes'] = [
'interval' => 900, // 15 минут в секундах
'display' => __('Каждые 15 минут'),
];
return $schedules;
});Проверка результата после внедрения
- Проверьте наличие запланированных задач через WP-CLI:
wp cron event list --fields=hook,next_run. Должно быть событиеchange_price_eventс запланированным временем. - В админке WooCommerce проверьте цену товара до и после смены времени. Можно временно подменить условие времени для быстрой проверки.
- Для мгновенного теста вручную вызовите событие:
do_action('change_price_event');и проверьте изменение цены.
Частые ошибки и как их исправить
- WP-Cron не срабатывает на сервере: Стандартный WP-Cron запускается при посещении сайта, что ненадежно. Для стабильной работы настройте системный cron job для вызова
wp-cron.phpкаждые 5 минут. - Цена не меняется: Убедитесь, что ID товара указан правильно и продукт активен. Проверьте, что функция
wc_get_productвозвращает объект. - Изменение цены не отображается в магазине: Кеширование страницы может мешать видеть изменения. Очистите кеш сайта и браузера.
- Событие WP-Cron дублируется: Проверьте, что создание cron события происходит один раз, например, только при инициализации темы или плагина, а не на каждом
init.
Практические советы по безопасности и производительности
- Используйте WP-Cron только для нечастых задач. Для более точных и критичных изменений лучше системные cron.
- Не меняйте цены слишком часто — это может привести к нагрузке на базу данных.
- Если у вас много товаров, применяйте изменения пакетно и с кешированием, чтобы снизить нагрузку.
- Перед изменением цены проверяйте, не идет ли в данный момент оформление заказа с этим товаром, чтобы избежать конфликтов.
- Для безопасности не добавляйте в cron задачи тяжелые операции без контроля.
Сравнение вариантов реализации изменения цены по времени
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомный код | Легко настроить, без сторонних плагинов, гибко | Зависит от посещаемости сайта, возможны задержки |
| Системный cron + кастомный код | Точный запуск, надежность | Требует доступа к серверу, настройка сложнее |
| Плагины динамического ценообразования | Много функций, готовые решения | Дополнительная нагрузка, сложность, цена |