Диагностика проблемы: почему товары с нулевым остатком остаются активными
В стандартной установке WooCommerce товары с нулевым остатком могут оставаться опубликованными и доступны для просмотра на сайте, если не включена соответствующая настройка управления запасами. Это приводит к путанице у покупателей и дополнительной нагрузке на администраторов, которые вынуждены вручную убирать товары из каталога или менять их статус.
Основные причины проблемы:
- Настройка
Управление запасамиотключена в WooCommerce. - Товар не отмечен как «отслеживаемый по запасам» (manage stock).
- Нет автоматической логики для смены статуса товара при достижении нулевого остатка.
Пошаговое решение: отключение товаров при нулевом остатке через код
Для автоматического отключения товаров при достижении нулевого или отрицательного остатка без использования плагинов можно добавить следующий код в файл functions.php активной темы или в кастомный плагин:
add_action('woocommerce_product_set_stock', 'auto_disable_product_on_zero_stock', 10, 1);
function auto_disable_product_on_zero_stock($product) {
// Проверяем остаток
$stock_quantity = $product->get_stock_quantity();
// Проверяем, что управление запасами включено
if (!$product->managing_stock()) {
return;
}
// Если остаток 0 или меньше, меняем статус на черновик
if ($stock_quantity <= 0) {
if ($product->get_status() !== 'draft') {
$product->set_status('draft');
$product->save();
}
} else {
// Если товар снова в наличии, возвращаем статус опубликованного
if ($product->get_status() === 'draft') {
$product->set_status('publish');
$product->save();
}
}
}Этот хук срабатывает всякий раз, когда обновляется запас товара. При достижении нуля или отрицательного значения статус товара меняется на «черновик», и он перестает отображаться в каталоге. При пополнении запаса — возвращается в публикацию.
Как использовать код с вариациями и простыми товарами
Если у вас есть вариации товаров, нужно отдельно отслеживать каждую вариацию. Для этого можно использовать следующий код:
add_action('woocommerce_variation_set_stock', 'auto_disable_variation_on_zero_stock', 10, 1);
function auto_disable_variation_on_zero_stock($variation) {
$stock_quantity = $variation->get_stock_quantity();
if (!$variation->managing_stock()) {
return;
}
if ($stock_quantity <= 0) {
if ($variation->get_status() !== 'private') {
$variation->set_status('private'); // скрываем вариацию
$variation->save();
}
} else {
if ($variation->get_status() === 'private') {
$variation->set_status('publish');
$variation->save();
}
}
}Статус private у вариаций скрывает их из каталога без удаления.
Проверка результата после внедрения
- Обновите количество товара в WooCommerce на 0 и убедитесь, что он исчез из каталога.
- Пополните запас — товар должен снова появиться в списке.
- Для вариаций проделайте то же самое, проверяя отображение вариаций на странице товара.
- Проверьте в админке, что статус товара меняется автоматически.
Частые ошибки и как их исправить
- Код не срабатывает при обновлении запаса вручную через базу данных: Обновление должно проходить через стандартный интерфейс WooCommerce или API, чтобы сработал хук.
- Товар не меняет статус, потому что управление запасами отключено: Проверьте, что у товара включена опция
Управление запасамив настройках продукта. - Вариации не меняют статус: Используйте отдельный хук
woocommerce_variation_set_stockи соответствующий код. - Проблемы с кэшированием: Очистите кэш сайта и браузера после внедрения.
Практические советы по оптимизации и безопасности
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении темы.
- Регулярно проверяйте работу скрипта после больших обновлений WooCommerce.
- Если на сайте много товаров, убедитесь, что хук не вызывает замедления. Для масштабных каталогов лучше использовать WP CLI или CRON задачи для пакетной обработки.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код в functions.php | Бесплатно, полный контроль, быстро | Требует навыков PHP, возможны ошибки при обновлениях | Пример из статьи |
| Плагины управления запасами | Простота, готовое решение, поддержка | Дополнительная нагрузка, стоимость, могут конфликтовать | WooCommerce Stock Manager и аналоги |
| CRON-скрипты для пакетной обработки | Подходит для больших каталогов, оптимизация нагрузки | Сложнее в настройке, требует серверных знаний | WP CLI скрипт или кастомный CRON |