Почему важно автоматически отключать товары с нулевым остатком
В интернет-магазинах на WooCommerce наличие товаров с нулевым остатком в каталоге приводит к негативному опыту пользователей: они видят доступный товар, но не могут его заказать. Это повышает количество обращений в поддержку и снижает конверсию. Автоматическое отключение таких товаров решает эту проблему без необходимости ручного контроля.
Диагностика проблемы: как понять, что товар с нулевым остатком доступен для покупки
Проверьте, отображается ли кнопка В корзину для товаров, у которых на складе 0. Иногда темы или плагины могут влиять на отображение статуса товара, поэтому важно проверить:
- Стандартное поведение WooCommerce: при включённом управлении запасами товары с 0 на складе должны быть автоматически помечены как «нет в наличии» и недоступны для покупки.
- Настройки в
WooCommerce > Настройки > Товары > Запасы, где должна быть активирована опция управления запасами и отключена возможность покупки товаров с нулевым остатком. - Отсутствие кастомного кода или плагинов, которые изменяют это поведение.
Проверка статуса товара через код
global $product;
if ( ! $product->is_in_stock() ) {
// Товар недоступен для заказа
}Если функция возвращает true при нулевом остатке, значит есть ошибка в логике.
Пошаговое решение: отключение товаров с нулевым остатком через код
Чтобы автоматизировать отключение товаров с 0 на складе, добавим в файл functions.php темы или в кастомный плагин следующий код.
1. Проверка и смена статуса товара при обновлении остатков
add_action( 'woocommerce_update_product', 'auto_disable_out_of_stock_products' );
function auto_disable_out_of_stock_products( $product_id ) {
$product = wc_get_product( $product_id );
if ( ! $product ) {
return;
}
if ( $product->managing_stock() ) {
$stock_quantity = $product->get_stock_quantity();
if ( $stock_quantity <= 0 ) {
// Отключаем товар
$product->set_catalog_visibility( 'hidden' );
$product->set_status( 'draft' ); // снимает с публикации
$product->save();
} else {
// Включаем товар обратно
if ( $product->get_status() === 'draft' ) {
$product->set_status( 'publish' );
$product->set_catalog_visibility( 'visible' );
$product->save();
}
}
}
}2. Автоматический запуск проверки для всех товаров (например, при кроне)
function auto_disable_all_out_of_stock() {
$args = [
'limit' => -1,
'status' => ['publish', 'draft'],
];
$products = wc_get_products( $args );
foreach ( $products as $product ) {
if ( $product->managing_stock() ) {
$stock_quantity = $product->get_stock_quantity();
if ( $stock_quantity <= 0 && $product->get_status() === 'publish' ) {
$product->set_status( 'draft' );
$product->set_catalog_visibility( 'hidden' );
$product->save();
} elseif ( $stock_quantity > 0 && $product->get_status() === 'draft' ) {
$product->set_status( 'publish' );
$product->set_catalog_visibility( 'visible' );
$product->save();
}
}
}
}
// Для запуска вручную
// auto_disable_all_out_of_stock();Для автоматизации можно подключить вызов этой функции в крон WordPress или системный cron.
Проверка результата после внедрения
Для проверки:
- Обновите остаток товара до 0 в админке WooCommerce.
- Проверьте, что товар сменил статус на
Черновик(draft) и не отображается в каталоге. - Попробуйте найти товар по URL — он должен быть недоступен.
- Восстановите остаток > 0, убедитесь, что товар возвращается в публикацию и виден в каталоге.
Также можно добавить логирование для контроля, например:
error_log( "Product {$product_id} status changed to {$product->get_status()}" );Частые ошибки и как их исправить
- Код не срабатывает при обновлении товара через импорт или массовое редактирование: хук
woocommerce_update_productсрабатывает не всегда; используйте WP_Cron для периодической проверки. - Товар виден несмотря на статус «черновик»: тема или кеш могут показывать устаревшую версию — очистите кеш сайта и браузера.
- Проблемы с видимостью товара после переключения статуса: убедитесь, что у товара выставлен параметр
catalog_visibilityвhidden, иначе он может отображаться в поиске. - Ошибка при попытке сохранить товар через код: проверьте, что пользователь или процесс имеет права на редактирование товара.
Практические советы по производительности и безопасности
- Не запускайте массовую проверку всех товаров слишком часто — это может замедлить сайт. Оптимально 1 раз в сутки через WP_Cron.
- Используйте транзиенты или кеширование для хранения результатов проверки, чтобы избежать повторных запросов.
- При использовании кода в
functions.php— сделайте резервную копию сайта и тестируйте на локальной копии. - Для безопасного управления статусами товаров используйте нативные функции WooCommerce, чтобы избежать конфликтов с другими плагинами.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Кастомный код в functions.php | Полный контроль, нет зависимости от плагинов | Требует навыков программирования, возможны ошибки при обновлениях | Если вы разработчик и хотите точечное решение |
| Плагины автоматического управления запасами | Простота установки, готовые функции | Могут влиять на производительность, конфликтовать с другими плагинами | Для быстрого внедрения без кода |
| Ручное управление статусами | Не требует кода | Трудозатратно, риск ошибок | Для небольших магазинов с малым количеством товаров |