Диагностика задачи: зачем менять цену товара в зависимости от времени суток
В 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
- Тестировать изменения на разных этапах — страница товара, корзина, заказ
- Обеспечить возврат к обычной цене вне времени акции
- Учесть возможные конфликты с другими плагинами скидок
- Оптимизировать код по производительности