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

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

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

Диагностика проблемы

Чтобы понять, что именно не работает или отсутствует, проверьте:

  • Наличие плагинов для автоматизации акций и скидок.
  • Стандартную функциональность смены цены акционного товара в карточке товара.
  • Наличие кастомных функций в теме или плагинах, которые могут конфликтовать с изменением цен.
  • Работу WP-Cron, если автоматизация предполагает расписание.

Пошаговое решение: автоматическое изменение цен по акции через WP-Cron и кастомный код

1. Создаём пользовательское поле для даты начала и окончания акции

В карточке товара добавим два пользовательских поля: sale_start_date и sale_end_date в формате YYYY-MM-DD. Это можно сделать вручную или через мета-боксы.

2. Добавляем код для изменения цены при наступлении даты

В файл functions.php вашей темы или в отдельный плагин добавьте следующий код:

function wpbit_apply_sale_prices() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            'relation' => 'AND',
            [
                'key' => 'sale_start_date',
                'compare' => 'EXISTS'
            ],
            [
                'key' => 'sale_end_date',
                'compare' => 'EXISTS'
            ]
        ]
    ];

    $today = current_time('Y-m-d');

    $query = new WP_Query($args);

    while ($query->have_posts()) {
        $query->the_post();
        $product_id = get_the_ID();
        $start = get_post_meta($product_id, 'sale_start_date', true);
        $end = get_post_meta($product_id, 'sale_end_date', true);
        $product = wc_get_product($product_id);

        if ($start <= $today && $end >= $today) {
            // Акция активна, устанавливаем цену со скидкой
            $regular_price = $product->get_regular_price();
            $sale_price = round($regular_price * 0.8, 2); // например, скидка 20%
            $product->set_sale_price($sale_price);
            $product->save();
        } else {
            // Акция не активна, сбрасываем цену
            $product->set_sale_price('');
            $product->save();
        }
    }
    wp_reset_postdata();
}

// Запускаем функцию через WP-Cron
if (!wp_next_scheduled('wpbit_daily_sale_price_update')) {
    wp_schedule_event(time(), 'daily', 'wpbit_daily_sale_price_update');
}

add_action('wpbit_daily_sale_price_update', 'wpbit_apply_sale_prices');

3. Проверяем работу WP-Cron

Убедитесь, что WP-Cron работает корректно. Для этого установите плагин WP Crontrol и проверьте наличие события wpbit_daily_sale_price_update. Запустите его вручную и посмотрите, обновились ли цены.

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

  • Перейдите на страницу товара в админке и убедитесь, что цена со скидкой установлена в пределах даты акции.
  • Проверьте фронтенд: цена товара должна отображаться с акцией.
  • Запустите WP-Cron вручную через WP Crontrol для проверки автоматического обновления.

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

  • WP-Cron не запускается: хостинг отключает WP-Cron. Решение — настроить системный cron для вызова wp-cron.php или использовать плагин, например, WP Crontrol для запуска вручную.
  • Поля даты не заполнены или в неправильном формате: убедитесь, что даты вводятся в формате YYYY-MM-DD. Используйте кастомные мета-боксы для контроля формата.
  • Цены не обновляются: проверьте, что у товаров есть регулярная цена, без неё скидка не применяется.
  • Конфликты с кэшированием: очистите кэш сайта и браузера, если изменения не видны.

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

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

Сравнение вариантов автоматизации изменения цен

МетодПлюсыМинусыКомпромисс
Плагины акций (например, WooCommerce Dynamic Pricing)Полный функционал, интерфейс, гибкостьПлатные, могут замедлять сайтПодходит для крупных магазинов
Кастомный код с WP-CronПолный контроль, бесплатныйНужно писать и поддерживать код, требует знанийИдеально для разработчиков и небольших магазинов
Ручное изменение ценПросто, без кодаТрудозатратно, ошибкиПодходит для очень малого каталога
Как автоматически изменять заголовки постов WordPress по шаблону
10.03.2026
Автоматическое добавление атрибутов alt к изображениям WordPress
27.01.2026
WooCommerce: как автоматически изменять статус заказа при создании
18.05.2026
Как установить автоматическое отображение отзывов в WordPress
03.04.2026
Как автоматически удалять неактивных пользователей WordPress
07.02.2026