Почему автоматическое изменение цен после акции важно
В WooCommerce часто возникает задача корректировки цен товаров после завершения промо-акций. Ручное обновление цен неудобно и приводит к ошибкам, особенно при большом каталоге. Автоматизация позволяет избежать просроченных скидок и некорректных цен, улучшая пользовательский опыт и управляемость магазина.
Диагностика проблемы: когда цены не меняются автоматически
Если после окончания акции цены товаров не возвращаются к исходным, проверьте следующие моменты:
- Правильно ли установлены даты начала и окончания акции в настройках товара?
- Используются ли стандартные поля
sale_priceиsale_price_dates_toдля акций? - Нет ли конфликтов с плагинами кэширования или оптимизации?
- Обновляется ли цена товара динамически при запросах к базе?
Пошаговое решение: автоматическое обновление цен через WP-Cron
1. Создаем функцию для сброса акционных цен
function wc_reset_expired_sale_prices() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_sale_price_dates_to',
'value' => current_time('timestamp'),
'compare' => '<',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$product_id = get_the_ID();
// Удаляем акционную цену и даты
update_post_meta($product_id, '_sale_price', '');
update_post_meta($product_id, '_sale_price_dates_from', '');
update_post_meta($product_id, '_sale_price_dates_to', '');
// Принудительно очищаем кэш цены
wc_delete_product_transients($product_id);
}
wp_reset_postdata();
}
}2. Регистрируем Cron событие при активации темы или плагина
function wc_schedule_sale_price_reset() {
if (!wp_next_scheduled('wc_daily_sale_price_reset_event')) {
wp_schedule_event(time(), 'daily', 'wc_daily_sale_price_reset_event');
}
}
add_action('wp', 'wc_schedule_sale_price_reset');
add_action('wc_daily_sale_price_reset_event', 'wc_reset_expired_sale_prices');3. Очистка Cron при деактивации
function wc_clear_sale_price_reset_schedule() {
$timestamp = wp_next_scheduled('wc_daily_sale_price_reset_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_sale_price_reset_event');
}
}
register_deactivation_hook(__FILE__, 'wc_clear_sale_price_reset_schedule');Проверка результата после внедрения
- Проверьте, что у товаров с просроченной акцией поля
_sale_priceи даты очистились. - В админке WooCommerce цены должны отображаться без скидки.
- Используйте плагин WP Crontrol для просмотра и запуска Cron-событий вручную.
- Проверьте фронтенд магазина и убедитесь в корректном отображении цен.
Частые ошибки и как их исправить
- Крон не срабатывает: убедитесь, что на сервере разрешены WP-Cron, или настройте системный Cron для wp-cron.php.
- Цены не обновляются: проверьте, что у товаров правильно заполнены метаполя
_sale_price_dates_toи_sale_price. - Кэш мешает обновлению: очистите кэш сайта и браузера, особенно если используете сторонние плагины кэширования.
- Сброс цен приводит к потере данных: всегда делайте резервные копии базы перед массовыми изменениями.
Практические советы по безопасности и производительности
- Для магазинов с большим количеством товаров используйте пагинацию в запросах, чтобы избежать превышения лимита памяти:
$args = [
'post_type' => 'product',
'posts_per_page' => 100, // например
'paged' => $page_number,
'meta_query' => [
[...]
]
];- Используйте транзиенты для кеширования результатов запросов в функции сброса.
- Проверяйте права пользователя при ручном запуске Cron задач.
- Регулярно обновляйте WooCommerce и WordPress для безопасности.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы |
|---|---|---|
| WP-Cron (PHP код) | Гибкость, контроль, не требует сторонних плагинов | Зависит от посещаемости сайта, возможны задержки |
| Сторонние плагины автоматизации | Простота настройки, готовые решения | Нагрузка, возможность конфликтов, не всегда бесплатны |
| Системный Cron + WP-CLI | Максимальная надежность и скорость | Требует доступа к серверу и навыков работы с CLI |