Диагностика задачи: зачем и когда нужна автоматическая смена цен после акции
Часто в интернет-магазинах на WooCommerce возникает задача: после окончания акции вернуть цены товаров к обычным без ручного вмешательства. Если этого не сделать, на сайте могут остаться неверные цены, что приводит к потерям или недовольству клиентов. Автоматизация этого процесса решает проблему системно и экономит время.
Как определить, что цены не меняются после акции
- Проверка даты окончания акции в свойствах товара;
- Сравнение текущей цены на фронтенде с базовой ценой в админке;
- Отсутствие скриптов или плагинов, которые откатывают цену;
- Отслеживание cron-задач на сайте (если они есть) и их результатов.
Пошаговое решение: автоматическое изменение цен товаров после окончания акции
1. Используем WP-Cron для периодической проверки акций
Создадим задачу, которая будет запускаться ежедневно и проверять дату окончания акций, чтобы сбрасывать цены.
add_action('init', function() {
if (!wp_next_scheduled('reset_sale_prices_daily')) {
wp_schedule_event(strtotime('00:00:00'), 'daily', 'reset_sale_prices_daily');
}
});
add_action('reset_sale_prices_daily', 'reset_expired_sale_prices');2. Функция сброса цен у товаров, у которых закончилась акция
function reset_expired_sale_prices() {
$today = date('Y-m-d H:i:s');
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_sale_price_dates_to',
'value' => strtotime($today),
'compare' => '<',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$product_id = get_the_ID();
$product = wc_get_product($product_id);
// Удаляем цену распродажи и даты
$product->set_sale_price('');
$product->set_date_on_sale_to('');
$product->save();
}
wp_reset_postdata();
}
}Проверка результата после внедрения
- Убедитесь, что в базе данных у товаров с прошедшей датой акции поля
_sale_priceи_sale_price_dates_toочищаются. - Проверьте на фронтенде, что цены товаров после даты окончания акции показываются обычные, без скидок.
- Для теста можно вручную изменить дату окончания акции в прошлом и запустить cron вручную через WP-CLI:
wp cron event run reset_sale_prices_daily.
Частые ошибки и как их исправить
- Неправильный формат даты в meta_query: WooCommerce хранит дату окончания акции в UNIX timestamp, а не строкой даты. Проверьте, что в запросе используется
type => 'NUMERIC'и сравнение с timestamp. - Задача wp_cron не запускается: Убедитесь, что на сайте есть трафик или настроен системный cron, иначе задачи не будут выполняться.
- Кэширование мешает обновлению цен: Очистите кэш сайта и браузера, если цена не обновляется.
- Ошибки в правах пользователя: Для запуска cron и сохранения продукта скрипт должен работать с правами администратора.
Практические советы по безопасности и производительности
- WP-Cron зависит от посещаемости сайта — для надежности используйте системный cron, особенно на больших магазинах.
- Ограничьте выборку товаров в запросе, если товаров очень много, например, обрабатывайте по партиям с помощью параметра
posts_per_page. - Добавьте логирование событий сброса цен для аудита и быстрого обнаружения проблем.
- Не храните лишний функционал в функции сброса цен, чтобы не замедлять выполнение cron.
Сравнение способов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное снятие акций | Администратор вручную убирает цены акции | Просто | Трудозатратно, ошибки, забывчивость |
| Плагины для автоматизации | Готовые решения с настройками | Удобно, функционально | Зависимость от стороннего кода, нагрузка |
| Собственный WP-Cron скрипт | Автоматический сброс цен через cron | Контроль, легковесность, кастомизация | Требует навыков, настройка cron |