Диагностика проблемы: почему товары не отключаются при нулевых остатках
Интернет-магазин на 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 с периодической проверкой запасов | Подходит для большого количества товаров, стабильная работа | Задержка обновления, требует дополнительного планирования задач | Крупные магазины с автоматическим обновлением и сторонними системами |
| Плагины управления запасами | Готовые решения с дополнительным функционалом | Могут быть платными, сложнее кастомизировать | Магазины, нуждающиеся в комплексном управлении запасами |