WooCommerce: автоматическое изменение стоимости товаров по расписанию с поддержкой вариаций

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

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

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

Общий подход и используемые хуки

Для реализации автоматического изменения цены по времени в WooCommerce можно использовать WP-Cron — встроенную систему планирования задач в WordPress. Скрипт будет запускаться по расписанию и обновлять цены товаров и их вариаций, учитывая заданные правила.

Основные шаги:

  • Создать пользовательское расписание для WP-Cron, если требуется нестандартный интервал;
  • Зарегистрировать событие cron, которое будет запускать функцию обновления цен;
  • В функции обновления пройти по необходимым товарам и вариациям, изменить цену и сохранить изменения;
  • Проверить результат и очистить кэш, если он используется.

Пример кода для создания расписания и обновления цен

<?php
// Добавляем новое расписание в WP-Cron
add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['every_6_hours'])) {
        $schedules['every_6_hours'] = [
            'interval' => 21600, // 6 часов в секундах
            'display' => __('Каждые 6 часов')
        ];
    }
    return $schedules;
});

// Регистрируем событие при активации темы или плагина
function wcm_schedule_price_update() {
    if (!wp_next_scheduled('wcm_update_prices_event')) {
        wp_schedule_event(time(), 'every_6_hours', 'wcm_update_prices_event');
    }
}
register_activation_hook(__FILE__, 'wcm_schedule_price_update');

// Отписываем событие при деактивации
function wcm_clear_schedule() {
    wp_clear_scheduled_hook('wcm_update_prices_event');
}
register_deactivation_hook(__FILE__, 'wcm_clear_schedule');

// Функция обновления цен
add_action('wcm_update_prices_event', function() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
    ];
    $products = get_posts($args);

    foreach ($products as $product_post) {
        $product = wc_get_product($product_post->ID);
        if (!$product) continue;

        // Пример логики: скидка 10% на все товары
        if ($product->is_type('variable')) {
            // Для вариаций
            $variations = $product->get_children();
            foreach ($variations as $variation_id) {
                $variation = wc_get_product($variation_id);
                if (!$variation) continue;
                $regular_price = $variation->get_regular_price();
                if ($regular_price) {
                    $new_price = round($regular_price * 0.9, 2);
                    $variation->set_sale_price($new_price);
                    $variation->save();
                }
            }
        } else {
            // Для простых товаров
            $regular_price = $product->get_regular_price();
            if ($regular_price) {
                $new_price = round($regular_price * 0.9, 2);
                $product->set_sale_price($new_price);
                $product->save();
            }
        }
    }
});
?>

Пошаговое внедрение решения в существующий магазин

  1. Добавьте приведённый код в файл functions.php вашей дочерней темы или создайте небольшой плагин.
  2. Активируйте плагин или тему, чтобы запустить регистрацию cron-задачи.
  3. Проверьте, что в базе появились записи о запланированных задачах (например, с помощью плагина WP Crontrol).
  4. При необходимости измените интервал расписания или логику расчёта цены.
  5. Убедитесь, что цены на сайте обновляются автоматически после срабатывания cron.

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

  • Установите плагин WP Crontrol для просмотра и управления cron-задачами (https://ru.wordpress.org/plugins/wp-crontrol/).
  • В разделе «Cron Events» найдите событие wcm_update_prices_event и запустите его вручную.
  • Проверьте в админке WooCommerce, что у товаров (особенно вариаций) появились новые цены со скидкой (sale_price).
  • Очистите кэш сайта и браузера, чтобы увидеть изменения на фронтенде.
  • Проверьте логи сервера на ошибки, если цены не меняются.

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

  • Задача cron не запускается: Проверьте, что WP-Cron не отключен в wp-config.php (константа DISABLE_WP_CRON не должна быть true). Если используется системный cron, убедитесь в правильности настроек.
  • Цены не обновляются: Убедитесь, что у товаров корректно заполнено поле regular_price. Функция set_sale_price меняет только цену со скидкой, а не основную.
  • Изменения не видны на сайте: Проверьте, не мешает ли кэширование (плагины кеша, серверный кэш). Очистите кэш.
  • Ошибки PHP при сохранении товара: Проверяйте логи ошибок. Возможно, конфликт с другими плагинами или темы.

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

  • Не запускайте обновление цен слишком часто, чтобы избежать нагрузки на базу данных.
  • Для крупных магазинов с тысячами товаров лучше реализовать постраничную обработку с сохранением прогресса в опциях.
  • Всегда делайте резервную копию базы перед изменениями массовых данных.
  • Используйте транзакции или проверяйте валидность данных перед сохранением, чтобы избежать повреждения данных.
  • Если вы используете кеширование (например, Object Cache или плагин кеширования), после обновления цен сбрасывайте соответствующий кеш.

Сравнение подходов к автоматическому изменению цены

МетодКодПлагинПлюсыМинусы
WP-Cron + пользовательский кодДа (как в примере)НетПолный контроль, бесплатно, легко адаптируемоТребует навыков, возможны ошибки при большом каталоге
Плагины динамического ценообразованияНетДа (например, WooCommerce Dynamic Pricing)Удобный интерфейс, много функцийПлатно, может быть тяжеловесным
Ручное обновление через админкуНетНетПростотаТрудозатратно, ошибки, не автоматично
Как установить ограничение на количество регистраций в WordPress
27.03.2026
Как добавить динамический контент в блоки Gutenberg в WordPress
04.03.2026
Как отключить автосохранение в WordPress
14.01.2026
WooCommerce: как автоматически обновлять цену товара по расписанию
25.04.2026
Как создать динамическую регистрацию пользователей в WordPress с проверкой и защитой
23.03.2026