Проблема: динамическое изменение цены товара в WooCommerce по времени
Частая задача для интернет-магазинов — менять цену товара в зависимости от времени суток, акции или временных периодов. Например, сделать скидку только вечером или увеличить цену в пиковые часы. Стандартных функций WooCommerce для этого нет, но можно реализовать через WP-Cron и пользовательский код.
Диагностика задачи и требования
Нужно определить:
- Какие товары и когда меняют цену
- На какое значение меняется цена (фиксированная или процентная скидка)
- Как вернуть цену к исходной после окончания периода
WP-Cron — это инструмент для планирования задач в WordPress, который позволит автоматически запускать код в нужное время.
Пошаговое решение: настройка изменения цены по времени
1. Добавление метаполей для хранения исходной цены и условий
Сначала сохраняем оригинальную цену товара в метаполе, чтобы можно было ее восстанавливать.
add_action('save_post_product', 'save_original_price_on_product_save');
function save_original_price_on_product_save($post_id) {
if (get_post_type($post_id) !== 'product') return;
$product = wc_get_product($post_id);
$price = $product->get_regular_price();
update_post_meta($post_id, '_original_regular_price', $price);
}2. Создание функции изменения цены
Функция будет менять цену на заданный процент, например, снижать на 20% вечером (с 18 до 23 часов).
function change_product_price_by_time() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
];
$products = get_posts($args);
$current_hour = (int) current_time('H');
foreach ($products as $product_post) {
$product = wc_get_product($product_post->ID);
$original_price = get_post_meta($product->get_id(), '_original_regular_price', true);
if (!$original_price) continue;
// Временной интервал для скидки: 18-23
if ($current_hour >= 18 && $current_hour <= 23) {
$new_price = $original_price * 0.8; // скидка 20%
$product->set_price($new_price);
$product->set_regular_price($new_price);
} else {
// Вне интервала - восстановить оригинальную цену
$product->set_price($original_price);
$product->set_regular_price($original_price);
}
$product->save();
}
}3. Регистрация WP-Cron задачи
Добавим собственное событие, которое будет запускать изменение цены каждый час.
add_action('change_price_hourly_event', 'change_product_price_by_time');
function schedule_price_change_event() {
if (!wp_next_scheduled('change_price_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'change_price_hourly_event');
}
}
add_action('wp', 'schedule_price_change_event');Проверка результата после внедрения
- Зайдите в админку WooCommerce и посмотрите цены товаров утром и вечером
- Проверьте метаполе
_original_regular_priceдля товаров через phpMyAdmin или плагин типа Advanced Custom Fields - Для отладки можно временно добавить логирование времени и цены в файл
debug.logчерезerror_log() - Запустите задачу вручную, используя
wp cron event run change_price_hourly_eventиз WP-CLI
Частые ошибки и как исправить
- WP-Cron не запускается автоматически: Проверьте, что на хостинге разрешён WP-Cron или настройте системный cron на запуск
wp-cron.php. - Цена не меняется: Убедитесь, что метаполе
_original_regular_priceзаполнено. Возможно, товар создали до внедрения кода — сохраните товар заново. - Цена не возвращается к исходной: Функция должна всегда восстанавливать цену вне временного интервала, проверьте логику условий.
- Изменения цены не видны на фронте: Очистите кеш, если используете кеширование страниц и объектов.
Практические советы по производительности и безопасности
- Для магазинов с большим количеством товаров оптимизируйте выборку, используйте постраничную обработку.
- Не храните изменённую цену в постоянных метаполях, используйте transient API для временного кеширования, если нужно.
- Для безопасности не давайте возможности менять цену через GET-запросы, все изменения должны происходить только по крону.
- Проверяйте наличие плагинов кеширования и тестируйте совместимость.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы |
|---|---|---|
| Код с WP-Cron | Гибкость, нет плагинов, можно адаптировать под любые условия | Зависимость от cron, требует знаний PHP, может замедлять сайт при большом каталоге |
| Плагины динамического ценообразования | Простота настройки, поддержка, дополнительные функции | Платные, могут конфликтовать, меньше контроля |
| Ручное изменение через админку | Простота, без кода | Не автоматизируется, риск ошибок |