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

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

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

Проверка:
1. В административной панели перейдите в раздел «Товары» и проверьте наличие товаров с нулевым запасом.
2. Откройте страницу товара на фронтенде и убедитесь, что он доступен для покупки, несмотря на отсутствие остатков.
3. Для вариаций проверьте, что каждая вариация с нулевым запасом не отключена.

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

1. Включите управление запасами на уровне WooCommerce

Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция «Включить управление запасами» активна.

2. Добавьте PHP-код для автоматического отключения товаров и вариаций

В functions.php вашей темы или в кастомном плагине добавьте следующий код. Он будет запускаться через WP-Cron каждый час и отключать товары и вариации с нулевым запасом.

function wpexperts_disable_out_of_stock_products() {
    // Получаем все товары с управлением запасами и количеством 0
    $args = array(
        'post_type' => array('product', 'product_variation'),
        'post_status' => 'publish',
        'meta_query' => array(
            array(
                'key' => '_manage_stock',
                'value' => 'yes',
            ),
            array(
                'key' => '_stock',
                'value' => 0,
                'compare' => '<=',
                'type' => 'NUMERIC'
            ),
        ),
        'posts_per_page' => -1
    );
    $query = new WP_Query($args);

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

            // Отключаем товар или вариацию
            wp_update_post(array(
                'ID' => $product_id,
                'post_status' => 'draft' // Можно использовать 'private' для скрытия
            ));
        }
        wp_reset_postdata();
    }
}

// Планируем задачу, если она не запланирована
if (!wp_next_scheduled('wpexperts_disable_out_of_stock_event')) {
    wp_schedule_event(time(), 'hourly', 'wpexperts_disable_out_of_stock_event');
}

// Хук для выполнения функции
add_action('wpexperts_disable_out_of_stock_event', 'wpexperts_disable_out_of_stock_products');

3. Проверка работы

  • В админке установите запас товара на 0 для простого товара и для вариации.
  • Дождитесь запуска cron (или вызовите вручную через WP-CLI: wp cron event run wpexperts_disable_out_of_stock_event).
  • Проверьте, что статус товара/вариации изменился на draft и они не отображаются на сайте.

Как избежать отключения товаров с запасом

Код проверяет только товары с _manage_stock = yes и _stock <= 0. Если вы используете товары без управления запасами, они не затронутся.

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

  • Товары не отключаются: проверьте, что cron работает. Запустите WP-Cron вручную или настройте системный cron.
  • Вариации не отключаются: убедитесь, что у вариаций включено управление запасами и установлено количество 0.
  • Товары исчезают с сайта, но не должны: возможно, у товара запас больше 0, или статус сменился на private. Используйте draft для отключения без удаления.
  • Проблемы с производительностью: если товаров много, разбейте запрос на части по дате или ID, чтобы избежать превышения лимитов памяти.

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

  • Не размещайте код в файле functions.php основной темы, используйте дочернюю тему или собственный плагин для сохранения изменений при обновлении.
  • Для больших магазинов настройте системный cron вместо WP-Cron для стабильности.
  • Добавьте логирование отключенных товаров для аудита:
function wpexperts_log_disabled_products($product_id) {
    error_log('Отключен товар с ID: ' . $product_id);
}

// В цикле вызовите после wp_update_post
wpexperts_log_disabled_products($product_id);

Сравнение способов отключения товаров при нулевом остатке

МетодПлюсыМинусыПрименимость
Плагин автоматического управления запасамиПростота установки, интерфейсДополнительная нагрузка, зависимость от стороннего кодаПодходит для небольших магазинов
Собственный PHP-скрипт с WP-CronТочный контроль, без лишних плагиновТребует базовых навыков программирования, настройка cronОптимально для разработчиков и крупных магазинов
Ручное отключениеПолный контрольТрудозатратно, риск ошибкиМаленький ассортимент
Запрет на удаление главной страницы в WordPress
14.04.2026
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
01.07.2026
WooCommerce: автоматическое возврат и снятие резервов товаров при отмене заказов
23.05.2026
Как автоматизировать запросы к внешним API в WordPress
31.01.2026
WooCommerce: автоматическое отключение товаров при нулевом остатке с поддержкой вариаций
19.07.2026