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

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

На крупных магазинах WooCommerce часто возникает ситуация, когда товары или их варианты остаются доступны для покупки при нулевом или отрицательном запасе. Это ведет к отменам заказов, разочарованию клиентов и дополнительной нагрузке на поддержку. Проблему можно диагностировать по следующим признакам:

  • В карточках товара отображается статус «В наличии», хотя склад пуст.
  • Варианты товара с нулевым запасом можно добавить в корзину.
  • Заказы приходят на товары, которых фактически нет в наличии.

Для проверки актуального состояния запасов зайдите в админку WooCommerce → Товары → выберите товар и проверьте запасы во вкладке «Запасы».

Пошаговое решение: отключение товаров и вариантов при отсутствии запаса

WooCommerce по умолчанию позволяет скрывать товары с нулевым запасом, но это не всегда хватает, особенно для вариативных товаров. Ниже приведён пример кода, который автоматически меняет статус товара или варианта на «черновик» при достижении нулевого или отрицательного запаса. Это не позволит товару показываться на сайте и в каталоге.

1. Добавляем хук на обновление запаса

add_action('woocommerce_update_product', 'auto_disable_out_of_stock_products', 10, 1);
function auto_disable_out_of_stock_products($product_id) {
    $product = wc_get_product($product_id);
    if (!$product) return;

    // Проверяем запас
    $stock_quantity = $product->get_stock_quantity();

    // Если запас нулевой или меньше
    if ($stock_quantity === null || $stock_quantity <= 0) {
        // Меняем статус на черновик
        $product->set_status('draft');
        $product->save();
    } else {
        // Возвращаем статус публикации, если запас появился
        if ($product->get_status() === 'draft') {
            $product->set_status('publish');
            $product->save();
        }
    }
}

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

2. Обработка вариативных товаров

add_action('woocommerce_update_product', 'auto_disable_variable_product_based_on_variations', 20, 1);
function auto_disable_variable_product_based_on_variations($product_id) {
    $product = wc_get_product($product_id);
    if (!$product || $product->get_type() !== 'variable') return;

    $variations = $product->get_children();
    $all_out_of_stock = true;

    foreach ($variations as $variation_id) {
        $variation = wc_get_product($variation_id);
        if ($variation && $variation->is_in_stock()) {
            $all_out_of_stock = false;
            break;
        }
    }

    if ($all_out_of_stock) {
        $product->set_status('draft');
    } else {
        $product->set_status('publish');
    }
    $product->save();
}

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

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

  • Обновите запас товара до нуля или отрицательного значения в админке WooCommerce.
  • Обновите запись товара вручную (сохраните без изменений) или подождите, пока сработает хук.
  • Проверьте статус товара — он должен измениться на «Черновик» и исчезнуть из каталога и поиска.
  • Для вариативных товаров проверьте, что если все варианты недоступны, товар скрывается.
  • Верните запас в положительное число и убедитесь, что товар снова становится опубликованным.

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

  • Код не срабатывает при массовом обновлении запасов. Хуки вызываются для отдельных продуктов. При массовом обновлении запасов используйте WP-CLI или создайте отдельный скрипт.
  • Вариативные товары остаются опубликованными, хотя все варианты отсутствуют. Проверьте, что срабатывает функция проверки статуса варианта. Возможно, стоит добавить дополнительный хук на обновление вариаций.
  • Изменение статуса товара ломает SEO. При массовом отключении убедитесь, что на месте товара настроены редиректы или страницы-заглушки.
  • Запасы обновляются сторонними плагинами без вызова хуков. В этом случае нужно или доработать интеграцию плагина, или запускать периодическую проверку запасов через WP-Cron.

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

  • Не используйте слишком «тяжёлые» операции в хук woocommerce_update_product, чтобы не замедлять сохранение товара.
  • Для больших магазинов лучше запускать проверку статусов товаров через WP-Cron раз в час, а не при каждом обновлении.
  • Резервное копирование перед массовым изменением статусов поможет быстро восстановиться в случае ошибок.
  • Если используете WPShop Clearfy Pro, можно дополнительно настроить автоматическую чистку и оптимизацию базы данных после массовых изменений.

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

МетодПлюсыМинусыПрименимость
Хук woocommerce_update_productАвтоматическое срабатывание, простой кодНе всегда срабатывает при массовом обновлении, нагрузка на сохранениеМалые и средние магазины
WP-Cron периодическая проверкаУменьшает нагрузку, охватывает изменения от любых плагиновЗадержка в обновлении статусов (до периода выполнения)Крупные магазины, сложные интеграции
Плагины управления запасамиГотовые решения с расширенным функционаломЗависимость от сторонних решений, возможные конфликтыПри отсутствии ресурсов на разработку
Автоматическое удаление неактивных клиентов в WooCommerce
07.06.2026
Как исключить товары и варианты WooCommerce из корзины и оформления заказа по атрибуту
31.05.2026
Как удалить неиспользуемые таксономии и термины в WordPress
02.01.2026
Как использовать хуки в WordPress для решения конкретных задач
09.01.2026
Как создать автоматические задачи в WordPress с помощью WPReg_cron
27.11.2025