WooCommerce: автоматическое изменение цен товаров по акциям с помощью кода

Диагностика задачи: зачем автоматизировать изменение цен по акциям

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

Как работает автоматическое изменение цен в WooCommerce

WooCommerce хранит базовую цену товара в метаполе _regular_price и цену со скидкой в _sale_price. Чтобы применить акцию, достаточно программно установить значение _sale_price и задать дату начала и окончания скидки (_sale_price_dates_from и _sale_price_dates_to).

Важно: просто менять отображаемую цену через фильтры недостаточно — нужно обновлять метаданные товара, чтобы скидка учитывалась корректно в корзине, при оплате и отчетах.

Пошаговое решение: как автоматически обновить цены товаров по акции с помощью кода

1. Подготовка функции для массового изменения цен

function wpsell_apply_sale_discount( $category_slug, $discount_percent, $date_from = null, $date_to = null ) {
    // Получаем товары указанной категории
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'tax_query'      => [
            [
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => $category_slug,
            ],
        ],
        'fields' => 'ids',
    ];
    $product_ids = get_posts( $args );

    foreach ( $product_ids as $product_id ) {
        $regular_price = get_post_meta( $product_id, '_regular_price', true );
        if ( ! $regular_price || $regular_price <= 0 ) {
            continue; // Пропускаем товары без базовой цены
        }

        // Вычисляем цену со скидкой
        $sale_price = round( $regular_price * (1 - $discount_percent / 100), 2 );

        // Обновляем метаданные
        update_post_meta( $product_id, '_sale_price', $sale_price );
        update_post_meta( $product_id, '_price', $sale_price ); // Текущая цена

        if ( $date_from ) {
            update_post_meta( $product_id, '_sale_price_dates_from', strtotime( $date_from ) );
        }
        if ( $date_to ) {
            update_post_meta( $product_id, '_sale_price_dates_to', strtotime( $date_to ) );
        }

        // Обязательно сбрасываем кеш
        wc_delete_product_transients( $product_id );
    }
}

2. Запуск функции с параметрами акции

Например, чтобы применить 20% скидку на все товары категории sale с сегодняшнего дня по 7 дней:

wpsell_apply_sale_discount('sale', 20, date('Y-m-d'), date('Y-m-d', strtotime('+7 days')));

3. Автоматизация запуска через WP-Cron

Чтобы запускать акцию автоматически, можно повесить вызов функции на cron-задачу. Пример регистрации и запуска:

if ( ! wp_next_scheduled( 'wpsell_run_sale_discount' ) ) {
    wp_schedule_event( time(), 'daily', 'wpsell_run_sale_discount' );
}

add_action( 'wpsell_run_sale_discount', function() {
    wpsell_apply_sale_discount('sale', 20, date('Y-m-d'), date('Y-m-d', strtotime('+7 days')));
});

Как проверить, что автоматическое изменение цен сработало

  • Откройте товар из целевой категории в админке и проверьте метаполя _sale_price и _price через редактор или с помощью плагина Advanced Custom Fields или WP All Import.
  • На фронтенде товара должна отображаться цена со скидкой и таймер акции (если тема поддерживает).
  • Добавьте товар в корзину — цена должна быть со скидкой.
  • Проверьте отчет WooCommerce по продажам — отображаемая цена должна быть снижена.

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

  • Не обновлена цена _price: если не обновить метаполе _price, WooCommerce может показывать старую цену. Важно обновлять и это поле.
  • Неправильный формат даты: даты для _sale_price_dates_from и _sale_price_dates_to должны быть timestamp (целые числа), а не строки. Используйте strtotime().
  • Отсутствие сброса кеша: после обновления цен нужно вызвать wc_delete_product_transients() для сброса кеша и корректного отображения.
  • Кэширование на уровне сервера: если используется внешний кэш (например, Redis, Varnish), возможно, придется его очистить вручную.
  • WP-Cron не срабатывает: убедитесь, что на сайте есть трафик или настроен системный cron запуск для wp-cron.php.

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

  • Не запускайте массовое обновление цен на страницах фронтенда или при каждом запросе — используйте ajax, WP-Cron или ручной запуск из админки.
  • При большом количестве товаров разбивайте обновления на пакеты, чтобы избежать таймаутов и перегрузок сервера.
  • Используйте транзиенты и кеширование для снижения нагрузки на базу, но очищайте их при изменении цен.
  • Ограничьте права на запуск функций изменения цен только администраторам.
  • Перед массовыми изменениями делайте резервные копии базы данных.

Таблица сравнения способов автоматической установки скидок

МетодПлагинКодКомпромисс
Установка скидок массовоПлагины типа "Bulk Discounts" или "Advanced Coupons"Кастомные функции и WP-CronПлагины проще, но могут нагружать сайт; код гибче, требует поддержки
Автоматический запускПлагины с расписанием или сторонние сервисыWP-Cron с кастомными хукамиПлагины удобны для непрофи; код — более надежен и настраиваем
Управление условиямиПлагины с интерфейсом условий и правилКастомные фильтры и условия внутри функцийПлагины дают визуальный контроль, код — требует знаний PHP
WooCommerce: как отключить автоматическое удаление товаров при обновлении
14.07.2026
Как добавить автозагрузку изображений в WooCommerce для ускорения сайта
30.03.2026
WooCommerce: как автоматически отправлять подтверждение о заказе после оплаты
08.07.2026
Автоматизация просмотра отзывов на WordPress: практические решения
26.03.2026
WooCommerce: как добавить собственную опцию выбора в корзине
17.06.2026

Совсем скоро здесь заработает сайт о вордпресс. И будет он связан с продажами, магазинами или чем-то таким.