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

Проблема: необходимость автоматического обновления цен после завершения акции

В WooCommerce часто возникают ситуации, когда после окончания акции требуется автоматически скорректировать цены товаров, например, вернуть их к обычному значению или обновить согласно новым условиям. Ручное изменение цен неудобно и приводит к ошибкам, особенно при большом каталоге. В этой статье рассмотрим, как настроить автоматическое изменение цен с помощью кода без использования сторонних плагинов.

Диагностика задачи

Основные вопросы, которые нужно решить:

  • Как определить дату окончания акции для товаров?
  • Как автоматически обновить цену после даты окончания акции?
  • Как избежать конфликтов с другими плагинами и кешами?

В WooCommerce акция обычно задаётся через поля sale_price и даты sale_price_dates_from и sale_price_dates_to. По окончании даты акции цена должна обновиться на обычную (regular_price).

Пошаговое решение

1. Создаем функцию для проверки и обновления цен

Добавим в functions.php или в свой плагин код, который по расписанию проверит товары и обновит цены:

function wc_update_prices_after_sale() {
    // Получаем текущую дату в формате timestamp
    $now = current_time('timestamp');

    // Запрос товаров, у которых акция закончилась
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_sale_price_dates_to',
                'value' => $now,
                'compare' => '<=',
                'type' => 'NUMERIC',
            ],
            [
                'key' => '_sale_price_dates_to',
                'compare' => 'EXISTS',
            ]
        ],
        'fields' => 'ids',
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        $product = wc_get_product($product_id);
        if (!$product) continue;

        // Сбрасываем цену продажи
        $product->set_sale_price('');
        $product->set_date_on_sale_to('');
        $product->save();

        // Обновляем метаданные для синхронизации
        update_post_meta($product_id, '_sale_price', '');
        update_post_meta($product_id, '_sale_price_dates_to', '');
    }
}

2. Автоматизация через wp_cron

Добавим событие, чтобы функция запускалась ежедневно:

function wc_schedule_price_update_event() {
    if (!wp_next_scheduled('wc_update_prices_cron_hook')) {
        wp_schedule_event(time(), 'daily', 'wc_update_prices_cron_hook');
    }
}
add_action('wp', 'wc_schedule_price_update_event');

add_action('wc_update_prices_cron_hook', 'wc_update_prices_after_sale');

3. Ручной запуск для теста

Для проверки можно временно вызвать функцию вручную:

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['run_price_update'])) {
        wc_update_prices_after_sale();
        echo 'Цены обновлены';
        exit;
    }
});

После теста удалите или закомментируйте этот код.

Проверка результата после внедрения

  • Проверьте в админке WooCommerce, что у товаров с прошедшей датой акции поле "Акционная цена" очищено.
  • На фронтенде убедитесь, что отображается обычная цена.
  • Проверьте логи сервера или включите WP_DEBUG для выявления ошибок.
  • Для запуска wp_cron вручную используйте плагин WP Crontrol или вызовите URL с параметром ?run_price_update=1 в админке.

Частые ошибки и как их исправить

  • Функция не запускается по расписанию: проверьте, включен ли wp_cron на сайте (опция DISABLE_WP_CRON не должна быть true). Если сайт мало посещаем, используйте системный cron на сервере.
  • Цены не обновляются: убедитесь, что у товара правильно заполнено поле _sale_price_dates_to в формате timestamp.
  • Конфликты с кешированием: после обновления цен очистите кеши (объектный, плагинов, CDN).
  • Ошибки прав доступа: запуск функции требует прав администратора, проверяйте capability в ручном запуске.

Практические советы по безопасности и производительности

  • Используйте wp_schedule_event с интервалом не реже суток, чтобы не перегружать сервер.
  • Добавьте логирование изменений в отдельный файл для аудита.
  • При большом количестве товаров разбивайте обновление на партии, чтобы избежать превышения лимита памяти или времени выполнения.
  • Регулярно очищайте устаревшие метаданные, связанные с акциями.

Сравнение вариантов автоматического обновления цен в WooCommerce

МетодПлюсыМинусыПример
Код через wp_cronПолный контроль, нет плагинов, гибкостьТребует знаний PHP, настройка cronКак в статье
Плагины акции и скидокПростая настройка, UI, поддержкаНагрузка, возможные конфликтыWooCommerce Dynamic Pricing
Ручное обновлениеПростотаТрудозатратно, риск ошибокЧерез админку
Как создать владельческий плагин для автоматизации задач в WordPress
31.03.2026
Как установить ограничения на подробное отображение пользователей в WordPress
29.01.2026
Как создать динамический фильтр товаров в WooCommerce без плагинов
09.01.2026
Как удалить неиспользуемые шорткоды в WordPress для оптимизации сайта
14.02.2026
Как создать автоматический раздел постов в WordPress по дате и категории
08.03.2026