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

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

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

Чтобы понять, нужна ли автоматизация, проверьте следующие признаки:

  • Наличие множества товаров с вариациями, которые регулярно меняются;
  • Отсутствие актуальности остатков на складе в админке и на фронтенде;
  • Наличие неактивных или устаревших вариантов, доступных для покупки;
  • Ручное обновление товаров занимает более часа в день.

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

1. Создание WP-Cron задачи для регулярного обновления

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

add_action('wp', 'setup_daily_stock_update_cron');
function setup_daily_stock_update_cron() {
    if (!wp_next_scheduled('daily_stock_update_event')) {
        wp_schedule_event(time(), 'daily', 'daily_stock_update_event');
    }
}

add_action('daily_stock_update_event', 'update_stock_and_variations');

function update_stock_and_variations() {
    // Получаем все вариативные товары
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
        'tax_query' => [
            [
                'taxonomy' => 'product_type',
                'field' => 'slug',
                'terms' => 'variable',
            ],
        ],
    ];
    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        return;
    }

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

        // Получаем варианты
        $variations = $product->get_children();

        foreach ($variations as $variation_id) {
            $variation = wc_get_product($variation_id);
            $stock_quantity = $variation->get_stock_quantity();

            if ($stock_quantity === 0) {
                // Отключаем вариант
                $variation->set_status('private');
                $variation->save();
            } else {
                // Включаем вариант, если есть в наличии
                if ($variation->get_status() !== 'publish') {
                    $variation->set_status('publish');
                    $variation->save();
                }
            }
        }
    }
    wp_reset_postdata();
}

2. Очистка WP-Cron при деактивации плагина или темы

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

Как проверить работоспособность скрипта

  • В админке WooCommerce перейдите в «Товары» и проверьте статус вариантов товаров с нулевым остатком — они должны быть со статусом «личный» (private) и не отображаться на сайте.
  • Установите плагин WP Crontrol (https://ru.wordpress.org/plugins/wp-crontrol/) и убедитесь, что задача daily_stock_update_event запланирована и выполняется.
  • Включите логирование ошибок PHP и добавьте в функцию update_stock_and_variations вывод в лог, чтобы отследить запуск:
error_log('Update stock and variations run: ' . date('Y-m-d H:i:s'));

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

  • Задача WP-Cron не запускается автоматически. Причина — низкий трафик на сайте или отключенный WP-Cron. Решение — настроить системный cron на сервере, который вызывает wp-cron.php по расписанию.
  • Варианты не меняют статус. Проверьте, что у вас есть права на изменение постов и что WooCommerce обновлен. Убедитесь, что статус задается правильной строкой ('publish' или 'private').
  • Скрипт тормозит сайт при запуске. При большом количестве товаров используйте пакетную обработку (batch processing) или разбейте обновление на несколько вызовов с помощью Transients API.

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

  • Для ускорения работы функции используйте WP_Query с параметром 'fields' => 'ids' чтобы получать только ID товаров.
  • Ограничьте периодичность запуска задачи до одного раза в сутки, чтобы не нагружать сервер.
  • Используйте capability проверки, если функция вызывается вручную из админки.
  • Регулярно делайте бэкапы базы данных перед внедрением автоматизации.

Таблица сравнения методов автоматического обновления остатков

МетодПлюсыМинусыПример
WP-Cron + кастомный PHPГибко, бесплатно, без сторонних плагиновНагрузка при большом каталоге, требует навыков разработкиКод из статьи
Плагины автоматизации (например, WP All Import, Stock Sync)Простота настройки, готовые решенияПлатные, могут быть избыточнымиWP All Import Pro с аддоном Stock Sync
Вебхуки и внешние сервисыИнтеграция с ERP, автоматизация на стороне сервераСложность настройки, требует внешних ресурсовWebhook от склада в ERP
WooCommerce: как автоматически удалять неактивные варианты товаров
22.09.2026
WooCommerce: как автоматически удалять неактивные варианты товаров по расписанию
27.09.2026
WordPress: как избежать конфликтов между плагинами и быстро находить ошибки
03.10.2026
WooCommerce: как автоматически удалять неактивные варианты товаров по расписанию без плагинов
17.09.2026
Автоматическое отключение неактивных товаров в WooCommerce: практическое руководство
22.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »