WooCommerce: как автоматически изменять цены товаров после акции

Диагностика задачи: зачем и когда нужна автоматическая смена цен после акции

Часто в интернет-магазинах на 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
Как создать динамические виджеты на PHP
18.11.2025
Запрет доступа по IP в WordPress через .htaccess: решение задачи защиты
27.12.2025
Как удалить пустые термины в WordPress
21.03.2026
Как удалить неиспользуемые шорткоды в WordPress без плагинов
07.04.2026
Как отключить или временно деактивировать плагин в WordPress без удаления
30.12.2025