Диагностика задачи: зачем менять цену товара по времени
В WooCommerce нередко возникает задача динамического изменения цены товаров в зависимости от времени суток, даты или определённых периодов (акции, скидки в часы пик и т.п.). Встроенных инструментов для автоматического обновления цен по расписанию нет, а ручное изменение неэффективно для большого количества товаров.
WP-Cron — встроенный в WordPress механизм планировщика задач, который позволяет запускать кастомные функции по расписанию. Используя его, можно обновлять цены товаров автоматически.
Пошаговое решение: настройка автоматического изменения цены с WP-Cron
1. Создаём кастомное событие WP-Cron
Добавим в functions.php или в отдельный плагин код, который регистрирует событие:
if (! wp_next_scheduled('wpqa_update_woocommerce_prices')) {
wp_schedule_event(time(), 'hourly', 'wpqa_update_woocommerce_prices');
}Это запустит событие wpqa_update_woocommerce_prices ежечасно. Для тестирования можно заменить 'hourly' на 'every_minute' через регистрацию кастомного интервала (см. ниже).
2. Добавляем функцию обновления цен
Подпишемся на событие и реализуем логику обновления цен в зависимости от времени. Пример: с 18:00 до 23:00 скидка 20% на все товары с категорией «Акция».
add_action('wpqa_update_woocommerce_prices', 'wpqa_update_prices_by_time');
function wpqa_update_prices_by_time() {
$current_hour = (int) current_time('H');
$discount_start = 18;
$discount_end = 23;
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'aktsiya',
],
],
'fields' => 'ids',
];
$product_ids = get_posts($args);
foreach ($product_ids as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
$regular_price = (float) $product->get_regular_price();
if ($current_hour >= $discount_start && $current_hour < $discount_end) {
$new_price = $regular_price * 0.8; // скидка 20%
} else {
$new_price = $regular_price; // обычная цена
}
$current_price = (float) $product->get_price();
if ($current_price !== $new_price) {
$product->set_price($new_price);
$product->save();
}
}
}3. (Опционально) Добавляем интервал для проверки чаще часа
Если нужно запускать задачу чаще, например каждую минуту, добавляем интервал:
add_filter('cron_schedules', 'wpqa_custom_cron_intervals');
function wpqa_custom_cron_intervals($schedules) {
if (!isset($schedules['every_minute'])) {
$schedules['every_minute'] = [
'interval' => 60,
'display' => 'Каждую минуту'
];
}
return $schedules;
}Проверка результата после внедрения
- Проверить в разделе «Инструменты > Запланированные задачи» (если установлен плагин WP Crontrol), что событие
wpqa_update_woocommerce_pricesзапланировано. - В разное время суток проверить изменение цены товаров из категории «Акция» на странице товара и в корзине.
- Логировать изменения для отладки, например через
error_log()внутри функции обновления.
Частые ошибки и как их исправить
- Отсутствие запланированного события: убедитесь, что
wp_schedule_event()вызывается только один раз, иначе могут быть дубли. Используйте проверкуwp_next_scheduled(). - WP-Cron не запускается регулярно: WP-Cron запускается при посещениях сайта, на малопосещаемых сайтах интервалы могут сбиваться. Для надежности настроить системный cron на вызов
wp-cron.php. - Цены не меняются: проверьте, что категория «акция» существует и правильно указана в запросе. Также убедитесь, что цена у товара задана в поле regular_price.
- Некорректное время: используйте
current_time('H')для получения времени по настройкам WordPress, а неdate('H').
Практические советы по безопасности и производительности
- Обновляйте цены только при необходимости — сравнивайте текущую цену и новую, чтобы избежать лишних операций сохранения.
- Если товаров очень много, разбивайте обновление на части (пагинация в WP_Query) или используйте очереди для уменьшения нагрузки.
- Для надежности WP-Cron лучше запускать через системный cron (пример для Linux):
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Логируйте ошибки и изменения в отдельный файл для анализа без влияния на пользовательский опыт.
Сравнение вариантов реализации автоматического изменения цены
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + кастомный код | Автоматическое обновление цены по расписанию через WP-Cron | Гибкость, нет сторонних плагинов | Зависимость от посещаемости сайта, нагрузка при большом количестве товаров |
| Плагины для динамических цен | Готовые решения с интерфейсом для настройки скидок по времени | Удобство, дополнительные функции (условия, купоны) | Платные, могут быть избыточны или конфликтовать |
| WP-Cron + вызов внешнего сервиса | Внешний скрипт меняет цены через REST API | Отделение нагрузки, интеграция с CRM | Сложность настройки, безопасность API |