WooCommerce: как автоматически отключать товары без остатков на складе

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

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

Как понять, что товары не отключаются при нуле остатков?

  • На странице каталога видны товары с количеством 0 и возможностью добавить их в корзину.
  • В админке WooCommerce в списке товаров статус — "В наличии", а количество равно 0.
  • Клиенты жалуются на невозможность оформить заказ по товару, который отображается как доступный.

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

Самый надежный способ — добавить кастомный код, который при обновлении запаса товара проверяет остаток и меняет статус товара на "черновик" или "нет в наличии".

Шаг 1. Подключение функции на хук сохранения товара

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

    $stock_quantity = $product->get_stock_quantity();
    $manage_stock = $product->managing_stock();

    if ($manage_stock && $stock_quantity <= 0) {
        // Меняем статус на 'draft' — товар скрыт из каталога
        $post = [
            'ID' => $product_id,
            'post_status' => 'draft'
        ];
        wp_update_post($post);
    }
}

Эта функция автоматически переводит товар в статус "черновик", если количество на складе равно нулю или меньше.

Шаг 2. Добавление проверки для вариативных товаров

Для вариативных товаров нужно проверять остатки по всем вариантам:

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

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

    foreach ($variations as $variation_id) {
        $variation = wc_get_product($variation_id);
        if ($variation->managing_stock() && $variation->get_stock_quantity() > 0) {
            $out_of_stock = false;
            break;
        }
    }

    if ($out_of_stock) {
        wp_update_post(['ID' => $product_id, 'post_status' => 'draft']);
    }
}

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

  • Обновите остаток товара через админку WooCommerce — установите 0 или меньше.
  • Обновите страницу каталога — товар должен исчезнуть из списка.
  • Проверьте статус товара в админке — должен быть "черновик".
  • Для вариативных товаров проверьте, что товар отключается только если все варианты без остатков.

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

  • Товары не скрываются: убедитесь, что код подключен в functions.php активной темы или в плагине, и что хук woocommerce_update_product срабатывает.
  • Статус товара меняется, но он все равно виден на сайте: проверьте кэш сайта и плагинов кэширования, очистите его.
  • Вариативные товары отключаются при наличии хотя бы одного варианта в наличии: проблема в логике проверки — убедитесь, что проверка идет по всем вариантам и отключение происходит только когда все варианты без стоков.
  • Нарушается логика отображения товаров с "разрешенным" заказом при отсутствии стока: если включена опция "Разрешить заказы при отсутствии стока", код нужно адаптировать для учета этого параметра.

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

  • Добавляйте код в дочернюю тему или в отдельный плагин, чтобы изменения не пропали при обновлении.
  • Используйте wc_get_product() для корректной работы с данными WooCommerce.
  • Обрабатывайте только измененные товары, чтобы избежать лишних вызовов и нагрузок.
  • Очищайте кэш после изменения статуса товара, чтобы изменения отображались клиентам.
  • Тестируйте на тестовом стенде перед внедрением на боевой сайт.

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

МетодОписаниеПлюсыМинусы
Код на хуке woocommerce_update_productАвтоматическое изменение статуса товара при обновленииПолный контроль, без сторонних плагиновТребуется базовый PHP, может не работать с импортом
Плагин для управления запасамиИспользование готового решения с настройкамиПростота настройки, поддержкаДополнительная нагрузка, возможные конфликты
Ручное управлениеОтключение товаров вручнуюПростота для малого ассортиментаНе подходит для больших магазинов, риск ошибки
Как установить разные версии PHP для WordPress на одном сервере
12.03.2026
Как использовать REST API в WordPress для автоматизации задач
17.12.2025
WooCommerce: как автоматически удалять неактивные заказы
23.04.2026
Как добавить поле с вариантами в выводе продуктов WooCommerce для удобства выбора
13.12.2025
Как создать свой виджет в WordPress с примером кода
17.11.2025