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

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

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

Подготовка: проверяем возможности и ограничения

Перед началом убедитесь, что на вашем хостинге настроен WP-Cron или системный cron, который запускает wp-cron.php регулярно — иначе задачи по расписанию не сработают.

  • Проверьте периодичность запуска WP-Cron через файл wp-config.php или хостинг.
  • Проверьте, что у вас есть доступ к функциям WordPress для обновления метаданных товаров.

Пошаговое решение: как создать задачу для изменения цен

1. Добавляем пользовательское расписание в WP-Cron

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

2. Регистрируем событие, если оно ещё не зарегистрировано

if (!wp_next_scheduled('custom_update_product_prices')) {
    wp_schedule_event(time(), 'every_five_minutes', 'custom_update_product_prices');
}

3. Реализуем функцию изменения цен товаров

add_action('custom_update_product_prices', function() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
    ];
    $query = new WP_Query($args);

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

    while ($query->have_posts()) {
        $query->the_post();
        $product_id = get_the_ID();
        $product = wc_get_product($product_id);

        // Пример: если сегодня 1 июля 2024, ставим скидку 10%
        if ($today === '2024-07-01') {
            $regular_price = (float) $product->get_regular_price();
            $new_price = $regular_price * 0.9; // скидка 10%
            $product->set_price($new_price);
            $product->save();
        }

        // Добавьте другие условия для других дат или правил
    }
    wp_reset_postdata();
});

4. Очищаем расписание при деактивации темы или плагина

function custom_deactivate_schedule() {
    $timestamp = wp_next_scheduled('custom_update_product_prices');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'custom_update_product_prices');
    }
}
register_deactivation_hook(__FILE__, 'custom_deactivate_schedule');

Проверка результата: как убедиться, что цены обновляются

  • Проверьте список задач WP-Cron через плагин WP Crontrol или аналогичный.
  • Временно добавьте в функцию логирование для отладки:
    error_log('Обновление цены для товара ID: ' . $product_id);
    и смотрите логи сервера.
  • Измените дату сервера или вручную вызовите событие через do_action('custom_update_product_prices'); в консоли WP-CLI или временно в коде.
  • Проверьте в админке WooCommerce, что цены товаров изменились.

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

  • WP-Cron не запускается: убедитесь, что DISABLE_WP_CRON в wp-config.php не выставлен в true, либо настройте системный cron на вызов wp-cron.php.
  • Цены не меняются: проверьте, что функция изменения цены вызывается — добавьте логирование. Убедитесь, что у товаров есть регулярные цены и они корректно считываются.
  • Изменения не видны на сайте: кеширование страниц или объектов может мешать — очистите кеш, отключите кеширование на время теста.
  • WP_Query загружает слишком много товаров: при очень большом каталоге используйте пагинацию или WP CLI для пакетной обработки.

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

  • Оптимизируйте запросы: добавляйте параметры 'fields' => 'ids' в WP_Query, если нужны только ID.
  • Пакетная обработка: при большом количестве товаров обрабатывайте их партиями, чтобы избежать таймаутов.
  • Права доступа: выполнение кода в WP-Cron — безопасно, но избегайте вывода данных в публичной части без проверки прав.
  • Кэширование: после изменения цен сбрасывайте кеши WooCommerce и CDN, чтобы пользователи видели актуальные цены.

Сравнение вариантов реализации

МетодПлюсыМинусыПример использования
Код через WP-Cron (как в статье) Без плагинов, гибкий, полный контроль Требует навыков разработки, возможны проблемы с WP-Cron Изменение цен по расписанию, кастомная логика
Плагин автоматизации цен (например, WooCommerce Dynamic Pricing) Простота настройки, готовый функционал Может нагрузить сайт, ограниченная кастомизация Быстрый запуск акций без кода
Использование системного cron + WP-CLI Надёжность, подходит для больших магазинов Требует доступа к серверу, сложнее в настройке Пакетное обновление цен с максимальной производительностью
Как добавить автоматическое обновление плагинов в WordPress без ручного вмешательства
04.03.2026
Автоматическое удаление старых записей в WordPress через WP-Cron
08.03.2026
Автозаполнение форм в WordPress с помощью JavaScript и AJAX
26.12.2025
WooCommerce: как найти и исправить дублирующиеся артикулы (SKU) в продуктах
04.05.2026
Как использовать хуки в WordPress для расширения функциональности
30.11.2025