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

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

Интернет-магазин на WooCommerce может столкнуться с проблемой, когда товары с нулевым остатком продолжают отображаться в каталоге и доступны для заказа. Это приводит к негативному пользовательскому опыту и дополнительной нагрузке на службу поддержки. Для начала проверьте настройки управления запасами и поведение магазина при отсутствии товара.

  • Перейдите в WooCommerce → Настройки → Товары → Управление запасами. Убедитесь, что включена опция "Включить управление запасами".
  • Проверьте, что у конкретного товара или вариации выставлен остаток и установлено значение "Не разрешать заказы при отсутствии на складе" (Allow backorders = "Нет").
  • Обратите внимание на статус товара: опубликован или отключен вручную.

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

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

1. Добавляем функцию для отключения товаров

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

add_action('woocommerce_product_set_stock', 'auto_disable_out_of_stock_product', 10, 1); 
function auto_disable_out_of_stock_product($product) {
    if (!$product instanceof WC_Product) return;
    $stock_quantity = $product->get_stock_quantity();
    $status = $product->get_status();
    
    // Проверяем, что товар в наличии стал 0 или меньше
    if ($stock_quantity <= 0 && $status === 'publish') {
        $product->set_status('draft'); // Меняем статус на черновик, чтобы скрыть с сайта
        $product->save();
    } elseif ($stock_quantity > 0 && $status !== 'publish') {
        // Включаем товар обратно, если запас появился
        $product->set_status('publish');
        $product->save();
    }
}

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

Для вариативных товаров нужно проверить остатки всех вариаций. Если все вариации отсутствуют, отключить основной товар.

add_action('woocommerce_variation_set_stock', 'auto_disable_variable_product_based_on_variations', 10, 1);
function auto_disable_variable_product_based_on_variations($variation) {
    $parent_id = $variation->get_parent_id();
    $parent = wc_get_product($parent_id);
    if (!$parent || $parent->get_type() !== 'variable') return;

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

    foreach ($variations as $var_id) {
        $var_product = wc_get_product($var_id);
        if ($var_product->get_stock_quantity() > 0) {
            $all_out_of_stock = false;
            break;
        }
    }

    if ($all_out_of_stock && $parent->get_status() === 'publish') {
        $parent->set_status('draft');
        $parent->save();
    } elseif (!$all_out_of_stock && $parent->get_status() !== 'publish') {
        $parent->set_status('publish');
        $parent->save();
    }
}

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

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

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

  • Функция не срабатывает при обновлении остатков через сторонние API или импорты: хуки woocommerce_product_set_stock и woocommerce_variation_set_stock вызываются только при стандартном обновлении через WC. Для сторонних обновлений нужно запускать функцию вручную или через cron.
  • Товары остаются видимыми после смены статуса: возможно, в теме или плагинах включено кэширование. Очистите кэш и проверьте работу.
  • Проблемы с вариативными товарами: если вариации имеют настройки backorders, то остаток может быть отрицательным или не учитываться. Проверьте опции backorders на каждой вариации.

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

  • Добавляйте код в дочернюю тему или собственный плагин, чтобы не потерять изменения при обновлении.
  • Для больших магазинов с тысячами товаров используйте отложенную проверку через WP-Cron, чтобы не нагружать сервер при каждом обновлении.
  • Обязательно делайте резервные копии базы перед массовыми изменениями статусов.
  • Для сложных сценариев интегрируйте с плагинами управления запасами или ERP, проверяя совместимость с кастомными функциями.

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

СпособПлюсыМинусыПрименимость
Код на хуках woocommerce_product_set_stockАвтоматическое срабатывание при обновлении через админку, простой кодНе работает при массовых импортерах и API без триггеровМалые и средние магазины с ручным обновлением запасов
WP-Cron с периодической проверкой запасовПодходит для большого количества товаров, стабильная работаЗадержка обновления, требует дополнительного планирования задачКрупные магазины с автоматическим обновлением и сторонними системами
Плагины управления запасамиГотовые решения с дополнительным функционаломМогут быть платными, сложнее кастомизироватьМагазины, нуждающиеся в комплексном управлении запасами
⭐⭐⭐⭐⭐