WooCommerce: автоматическое изменение стоимости товаров по расписанию без плагинов

В чём суть задачи: зачем менять цены автоматически

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

В этой статье разберём, как реализовать автоматическое изменение стоимости товаров с помощью WP-Cron и стандартных функций WooCommerce без сторонних плагинов.

Диагностика проблемы: почему стандартный WooCommerce не подходит для расписаний

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

Решения через сторонние плагины часто увеличивают нагрузку на сайт и требуют дополнительного обслуживания. Автоматизация через WP-Cron и пользовательский код — более лёгкий и контролируемый вариант.

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

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

Для начала напишем функцию, которая будет менять цену товара по ID и новой цене.

function wpb_update_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(''); // очистить скидку, если была
    $product->save();
    return true;
}

2. Создаём функцию для массового обновления цен по условию

Например, снизим цены всех товаров из определённой категории на 10%.

function wpb_bulk_update_prices() {
    $args = [
        'status' => 'publish',
        'limit' => -1,
        'category' => ['sale-products'], // slug категории
    ];

    $products = wc_get_products($args);

    foreach ($products as $product) {
        $current_price = $product->get_regular_price();
        if ($current_price > 0) {
            $new_price = round($current_price * 0.9, 2); // скидка 10%
            wpb_update_product_price($product->get_id(), $new_price);
        }
    }
}

3. Регистрируем WP-Cron событие для периодического запуска

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

add_action('wp', function() {
    if (!wp_next_scheduled('wpb_daily_price_update')) {
        wp_schedule_event(strtotime('02:00:00'), 'daily', 'wpb_daily_price_update');
    }
});

add_action('wpb_daily_price_update', 'wpb_bulk_update_prices');

4. Добавляем возможности ручного запуска для отладки

Для проверки можно добавить вызов функции по URL с проверкой прав администратора.

add_action('admin_post_wpb_run_price_update', function() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die('Нет доступа');
    }
    wpb_bulk_update_prices();
    wp_redirect(admin_url());
    exit;
});

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

  • Проверьте, что в wp_options появилась запись с расписанием wpb_daily_price_update (через phpMyAdmin или WP CLI).
  • Запустите функцию вручную через URL https://ваш-сайт/wp-admin/admin-post.php?action=wpb_run_price_update под аккаунтом администратора и убедитесь, что цены обновились.
  • Проверьте в админке WooCommerce цены товаров из нужной категории — они должны быть снижены на 10%.
  • Убедитесь, что после запуска WP-Cron в 2 часа ночи цены обновятся автоматически (можно проверить логи или добавить временный лог в функцию).

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

  • WP-Cron не срабатывает: на некоторых хостингах WP-Cron отключён или срабатывает только при посещении сайта. Проверьте DISABLE_WP_CRON в wp-config.php. Для надёжной работы настройте системный cron на сервере или используйте плагин WP Crontrol.
  • Функция не обновляет цены: убедитесь, что ID продуктов правильные и товары опубликованы. Проверяйте ошибки в логах PHP.
  • Цена не отображается правильно в корзине: после обновления цены очистите кэш WooCommerce и браузера, обновите сессии покупателей.
  • Изменения перезаписываются вручную: если администратор меняет цены вручную, автоматизация перезапишет их при следующем запуске. Подумайте о логике приоритетов.

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

  • Ограничьте область действия массового обновления — например, только определённые категории или товары с определённым флагом.
  • Добавьте логирование выполнения для отслеживания ошибок и успешных обновлений.
  • При большом количестве товаров делайте обновление партиями (например, по 50 товаров за один запуск), чтобы избежать таймаутов.
  • Проверяйте права пользователя при ручном запуске, чтобы исключить несанкционированные изменения.
  • Используйте transient API для кеширования результатов, если нужно отображать информацию о скидках на фронтенде.

Таблица сравнения вариантов автоматизации изменения цен

Метод Преимущества Недостатки
Сторонние плагины (например, Dynamic Pricing) Готовые функции, удобный интерфейс, поддержка акций и условий Нагрузка на сайт, стоимость, ограниченная кастомизация
Код с WP-Cron (как в статье) Полный контроль, лёгкий вес, бесплатное решение Требует навыков разработки, риски при ошибках, ограниченный UI
Ручное обновление цен Простота, мгновенный контроль Большая вероятность ошибок, утомительно при большом ассортименте
Как использовать WPRemark для автоматического модерирования комментариев в WordPress
14.02.2026
Оптимизация загрузки WordPress плагинов: уменьшение времени отклика и повышение скорости сайта
03.11.2025
Как сделать динамические атрибуты для шорткодов в WordPress
15.01.2026
WooCommerce: как автоматически удалять неактивные варианты товара
27.06.2026
Как создать собственный тип записи (Custom Post Type) в WordPress с примером кода
16.04.2026