Диагностика задачи: зачем нужно автоматическое изменение цен
В интернет-магазинах на WooCommerce часто возникает необходимость временно менять цены товаров — устраивать акции, скидки на выходные или ночные скидки. Ручное изменение цен неудобно и подвержено ошибкам, особенно если товаров много. Автоматизация процесса решает эту проблему, но WooCommerce из коробки не поддерживает расписание изменений цен без плагинов.
Способы реализации автоматического изменения цены
1. Использование плагинов для динамического ценообразования
Существуют плагины, например, Clearfy Pro и другие динамические цены, которые позволяют настроить расписание скидок и автоматом менять цены без кода. Но у них есть ограничения и стоимость лицензии.
2. Кастомное решение через wp-cron и прямое обновление цен
Если нужен точечный контроль и отсутствие сторонних зависимостей, можно написать собственный скрипт, который будет менять мета-данные цен товаров по расписанию с помощью системного cron или wp-cron WordPress.
Пошаговое решение: автоматическое изменение цены с помощью wp-cron
Шаг 1. Создаем функцию для изменения цены
function wps_update_product_price_schedule() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_regular_price',
'compare' => 'EXISTS',
],
],
];
$products = new WP_Query($args);
if ($products->have_posts()) {
while ($products->have_posts()) {
$products->the_post();
$product_id = get_the_ID();
$regular_price = get_post_meta($product_id, '_regular_price', true);
// Пример: скидка 10% в период с 20:00 до 23:59
$hour = (int) current_time('H');
if ($hour >= 20 && $hour <= 23) {
$new_price = round($regular_price * 0.9, 2);
} else {
$new_price = $regular_price;
}
update_post_meta($product_id, '_price', $new_price);
update_post_meta($product_id, '_sale_price', ($new_price < $regular_price) ? $new_price : '');
}
wp_reset_postdata();
}
}Шаг 2. Регистрируем wp-cron событие
function wps_register_price_update_cron() {
if (! wp_next_scheduled('wps_price_update_event')) {
wp_schedule_event(time(), 'hourly', 'wps_price_update_event');
}
}
add_action('wp', 'wps_register_price_update_cron');
add_action('wps_price_update_event', 'wps_update_product_price_schedule');Шаг 3. Очистка cron при деактивации
function wps_clear_price_update_cron() {
$timestamp = wp_next_scheduled('wps_price_update_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wps_price_update_event');
}
}
register_deactivation_hook(__FILE__, 'wps_clear_price_update_cron');Проверка результата после внедрения
- Убедитесь, что в базе данных у товаров меняется мета _price и _sale_price в зависимости от времени суток.
- Проверьте на фронте, что цена товара изменяется в соответствии с расписанием (например, обновите страницу в 21:00).
- Включите WP_DEBUG и логируйте изменения, добавив в функцию
error_log()с id товаров и новыми ценами.
Частые ошибки и как исправить
- Цены не меняются: Проверьте, что wp-cron работает (проверьте событие через плагин WP Crontrol).
- Цены сбрасываются на 0: Убедитесь, что у товаров заполнен мета _regular_price.
- Расписание не срабатывает вовремя: wp-cron запускается при посещении сайта, для точного расписания настройте системный cron на вызов
wp-cron.php.
Практические советы по производительности и безопасности
- Если товаров много, используйте постраничный запрос с
'posts_per_page' => 50и сохраняйте прогресс в transient, чтобы не нагружать сервер. - Не меняйте цены часто — достаточно один раз в час или в день.
- Всегда проверяйте, что новые цены не больше регулярных, чтобы избежать ошибок в отображении.
- Для безопасности используйте nonce и права доступа, если делаете интерфейс управления скидками.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагины (Clearfy, Dynamic Pricing) | Простая настройка, готовый функционал, поддержка | Стоимость, ограниченная кастомизация, нагрузка |
| Кастомный код с wp-cron | Полный контроль, бесплатное решение, гибкость | Требуется разработка, возможны ошибки, нагрузка при большом каталоге |
| Использование системного cron с WP-CLI | Точный запуск, высокая производительность | Сложность настройки, требует доступа к серверу |