WooCommerce: автоматическое изменение стоимости товара в зависимости от времени суток

Диагностика задачи: зачем менять цену товара в зависимости от времени суток

В WooCommerce иногда требуется динамически корректировать цену товара в зависимости от времени суток — например, для акций в вечерние часы, ночных скидок или повышения цены в часы пик. Эта задача не реализуется стандартными средствами WooCommerce и требует кастомного кода или специальных плагинов.

Как реализовать автоматическое изменение цены в WooCommerce по времени суток

Основной способ — использовать фильтр woocommerce_get_price или woocommerce_product_get_price, чтобы подменять цену товара прямо при выводе на фронтенде и в корзине. При этом важно учитывать, что цена должна изменяться только визуально, без изменения в базе, чтобы не сломать логику магазина.

Пример кода для изменения цены с 18:00 до 23:59 с 10% скидкой

add_filter('woocommerce_product_get_price', 'change_price_by_time', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'change_price_by_time', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'change_price_by_time', 10, 2);

function change_price_by_time($price, $product) {
    $current_hour = (int) current_time('H'); // Получаем час по часовому поясу WP
    // Скидка с 18 до 23 часов
    if ($current_hour >= 18 && $current_hour <= 23) {
        $discount = 0.10; // 10% скидка
        $price = $price * (1 - $discount);
    }
    return $price;
}

Как интегрировать изменение цены в корзину и на странице заказа

Для корректного отображения и расчётов необходимо также менять цену товара в корзине и на странице оформления заказа. Для этого используйте хук woocommerce_before_calculate_totals:

add_action('woocommerce_before_calculate_totals', 'apply_time_based_price_cart', 10, 1);
function apply_time_based_price_cart($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $current_hour = (int) current_time('H');
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        $price = $product->get_regular_price();
        if ($current_hour >= 18 && $current_hour <= 23) {
            $discount = 0.10;
            $new_price = $price * (1 - $discount);
            $product->set_price($new_price);
        } else {
            $product->set_price($price); // Возврат к обычной цене
        }
    }
}

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

  • Перейдите на страницу товара в разное время суток (например, измените локальное время сервера или временную зону WordPress) и проверьте цену.
  • Добавьте товар в корзину в часы действия скидки и вне их — убедитесь, что цена в корзине меняется соответственно.
  • Оформите заказ, чтобы проверить итоговую сумму.
  • Проверьте, что в админке WooCommerce и в базе данных исходная цена не меняется.

Частые ошибки и как их исправить

  • Цена не меняется в корзине или на странице заказа: забыли добавить обработчик woocommerce_before_calculate_totals.
  • Цена меняется в админке или базе данных: используйте только фильтры для вывода цены, а не прямое изменение цены в базе.
  • Временная зона не совпадает: используйте функцию current_time('H') вместо date('H') для получения времени с учетом настроек WordPress.
  • Дублирование скидки, если у товара уже есть скидка: учитывайте get_sale_price() и корректно комбинируйте скидки, чтобы не применять двойную.

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

  • Выносите логику определения текущего времени и скидки в отдельную функцию, чтобы не дублировать код.
  • Старайтесь минимизировать количество вычислений в хукe woocommerce_before_calculate_totals, так как он вызывается часто.
  • Не сохраняйте изменённые цены в метаданные товара — это приводит к проблемам с учётом бухгалтерии и отчетами.
  • Если у вас большой магазин, рассмотрите кэширование результата функции изменения цены, чтобы уменьшить нагрузку.

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

МетодПлюсыМинусыКогда использовать
Кастомный код на хуках WooCommerceПолный контроль, бесплатный, легко адаптируетсяТребует навыков PHP, возможны ошибки без тестовСредние и крупные проекты с уникальными сценариями
Плагины динамического ценообразованияЛегко настраивается, содержит дополнительные функции (купоны, группы пользователей)Платные, могут грузить сайт, не всегда можно кастомизироватьМаленькие магазины, где важна скорость настройки
Внешние сервисы и API для ценМощная аналитика, автоматизацияСложность интеграции, дополнительные расходыБольшие проекты с аналитикой и интеграциями

Чек-лист для внедрения динамических цен по времени суток в WooCommerce

  • Определить точные часы и правила изменения цены
  • Реализовать фильтр изменения цены для фронтенда
  • Добавить корректировку цены в корзине и заказах
  • Проверить время по часовому поясу WordPress
  • Тестировать изменения на разных этапах — страница товара, корзина, заказ
  • Обеспечить возврат к обычной цене вне времени акции
  • Учесть возможные конфликты с другими плагинами скидок
  • Оптимизировать код по производительности
Как отключить Gutenberg и вернуть классический редактор в WordPress
18.12.2025
WooCommerce: как отключить возможность повторного добавления товара в корзину
28.07.2026
Как создать уникальный XML Sitemap в WordPress для улучшения индексации
06.01.2026
Как заменить default-аватар в WordPress: практическое руководство
09.04.2026
WooCommerce: автоматическое изменение стоимости товара в зависимости от роли пользователя
17.07.2026