Автоматическое изменение цен в WooCommerce по расписанию

Проблема: зачем нужно автоматическое изменение цен по расписанию

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

Диагностика: как понять, что цены не меняются автоматически

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

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

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

1. Проверяем и настраиваем WP-Cron

WP-Cron отвечает за выполнение запланированных задач. Убедитесь, что он работает. В wp-config.php не должно быть строки define('DISABLE_WP_CRON', true);.

Для проверки запланированных событий установите плагин WP Crontrol. В разделе "Cron Events" вы увидите список текущих событий.

2. Создаём функцию для изменения цены товара

Пример функции, которая меняет цену конкретного товара по ID:

function wpc_change_product_price($product_id, $new_price) {
    $product = wc_get_product($product_id);
    if (!$product) return false;

    $product->set_regular_price($new_price);
    // Если нужно, можно изменить и цену продажи:
    // $product->set_sale_price($new_sale_price);

    $product->save();
    return true;
}

3. Создаём функцию, которая будет запускаться по расписанию

function wpc_cron_update_prices() {
    // Пример: меняем цену товара с ID 123 на 999 рублей
    wpc_change_product_price(123, 999);

    // Можно добавить логику для нескольких товаров
    // Например, массив товаров и новых цен
    $prices = [
        124 => 799,
        125 => 499,
    ];

    foreach ($prices as $id => $price) {
        wpc_change_product_price($id, $price);
    }
}

4. Регистрируем событие в WP-Cron

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

if (!wp_next_scheduled('wpc_daily_price_update')) {
    // Запускаем задачу раз в сутки, можно изменить на нужный интервал
    wp_schedule_event(time(), 'daily', 'wpc_daily_price_update');
}

add_action('wpc_daily_price_update', 'wpc_cron_update_prices');

5. Настраиваем собственный интервал, если нужно

По умолчанию WP-Cron поддерживает интервалы 'hourly', 'twicedaily', 'daily'. Для других интервалов добавьте:

add_filter('cron_schedules', function($schedules) {
    $schedules['every_five_minutes'] = [
        'interval' => 300, // 5 минут в секундах
        'display' => __('Каждые 5 минут'),
    ];
    return $schedules;
});

И замените 'daily' в wp_schedule_event на 'every_five_minutes' для более частого обновления.

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

  • В разделе WP-Cron (с помощью WP Crontrol) проверьте, что событие wpc_daily_price_update запланировано.
  • Запустите событие вручную через WP Crontrol — проверьте, что цены изменились.
  • Проверьте страницу товара на фронтенде и в админке, что цена обновилась.
  • Если цены не меняются, проверьте логи ошибок PHP и включите отладку WordPress (define('WP_DEBUG', true);).

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

  • WP-Cron отключен или не срабатывает: Проверьте wp-config.php и настройте системный cron для вызова wp-cron.php (рекомендуется для стабильности).
  • Неправильный ID товара: Убедитесь, что передаёте корректный ID, полученный из админки WooCommerce.
  • Кеширование не обновляет цены на сайте: Очистите кеш плагинов (например, WP Super Cache, W3 Total Cache) и CDN (Cloudflare и др.).
  • Цены сбрасываются после обновления товара: Возможно, есть другие хуки или плагин, который перезаписывает цены. Проверьте конфликтующие плагины.

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

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

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

СпособПлюсыМинусыПример
WP-Cron с кастомным кодомГибкость, нет лишних плагиновЗависит от работы WP-Cron, требует навыковЭтот пример в статье
Плагины акций и скидокУдобно, готовые интерфейсыМожет замедлить сайт, ограниченная кастомизацияWooCommerce Dynamic Pricing
Внешние скрипты + WP CLIПодходит для больших каталоговНужен доступ к серверу и навыки работы с CLIСкрипты на PHP + cron сервера
Как удалить повторяющиеся товары в WooCommerce без плагинов
24.05.2026
Автоматическое удаление товаров из WooCommerce при нулевом остатке
25.04.2026
Оптимизация загрузки изображений в WordPress для повышения скорости сайта
11.12.2025
Как сделать уникальные URL для товаров в WooCommerce без дублирования
18.12.2025
Как использовать REST API в WordPress для каталогов товаров
12.01.2026