Проблема: почему товары с нулевым остатком продолжают отображаться в магазине
В стандартной конфигурации WooCommerce товар с нулевым остатком не блокируется полностью — он может оставаться доступным для просмотра или даже покупки (если не включено управление запасами). Это приводит к неудобству для пользователей и потерям для магазина. Решение — автоматическое отключение товаров, когда их остаток достигает нуля.
Диагностика проблемы
- Проверьте, включено ли управление запасами в WooCommerce:
WooCommerce > Настройки > Товары > Управление запасами. - Убедитесь, что конкретные товары настроены на управление запасами и имеют корректные значения остатков.
- Посмотрите, не влияют ли сторонние плагины или кастомный код на отображение товаров с нулевым остатком.
- Проверьте, не установлен ли флаг
Продажи при отсутствии на складев настройках товара.
Пошаговое решение: автоматическое отключение товаров при нулевом остатке
1. Включаем управление запасами для магазина и товаров
В WooCommerce включите управление запасами глобально и для каждого товара:
WooCommerce > Настройки > Товары > Управление запасами - поставить галочку
При редактировании товара - во вкладке "Запасы" включить "Управлять запасами?" и заполнить поле "Количество на складе".2. Добавляем код для автоматического переключения статуса товара
Через хук woocommerce_reduce_order_stock или при изменении остатка товара можно автоматически менять статус публикации:
add_action('woocommerce_reduce_order_stock', 'auto_disable_product_if_out_of_stock', 10, 1);
function auto_disable_product_if_out_of_stock( $product ) {
if ( ! is_a( $product, 'WC_Product' ) ) {
$product = wc_get_product( $product );
}
if ( $product->get_stock_quantity() <= 0 ) {
$product->set_catalog_visibility('hidden'); // скрыть из каталога
$product->set_status('draft'); // сделать черновиком
$product->save();
}
}Этот код срабатывает при списании товара со склада после заказа и меняет статус товара на черновик, тем самым отключая его из публичного каталога.
3. Обработка товаров с изменением остатков вручную
Чтобы синхронизировать статус при ручном изменении запасов, добавьте:
add_action('save_post_product', 'check_stock_and_update_status', 20, 3);
function check_stock_and_update_status($post_ID, $post, $update) {
if ( wp_is_post_revision( $post_ID ) ) return;
$product = wc_get_product( $post_ID );
if ( ! $product->managing_stock() ) return;
$stock = $product->get_stock_quantity();
if ( $stock <= 0 && $post->post_status !== 'draft' ) {
$post->post_status = 'draft';
wp_update_post( $post );
} elseif ( $stock > 0 && $post->post_status === 'draft' ) {
$post->post_status = 'publish';
wp_update_post( $post );
}
}Проверка результата после внедрения
- Создайте тестовый товар с управлением запасами и установите количество 1.
- Оформите заказ на этот товар, чтобы остаток стал 0.
- Проверьте, что товар автоматически стал черновиком и пропал из каталога.
- Измените остаток вручную на значение больше 0 — товар должен автоматически опубликоваться.
Частые ошибки и как их исправить
- Товар не меняет статус после заказа: проверьте, что в коде нет ошибок, и что хук
woocommerce_reduce_order_stockсрабатывает. Кэширование может мешать — очистите кэш сайта и браузера. - Товар продолжает отображаться несмотря на статус черновика: убедитесь, что тема и плагины корректно обрабатывают статус
draft. Иногда стоит вместо изменения статуса использоватьset_catalog_visibility('hidden'). - Ручное изменение остатков не обновляет статус: проверьте, что функция на
save_post_productдобавлена в functions.php и работает без ошибок. - Срабатывание кода с ошибками PHP: всегда проверяйте логи ошибок, используйте отладчик или WP_DEBUG.
Практические советы по безопасности и производительности
- Добавляйте проверку прав пользователя в функции, которые меняют статусы (например, проверяйте
current_user_can('edit_product', $post_ID)), чтобы избежать нежелательных изменений. - Кэшируйте результаты, если используете подобный функционал на сайте с большим количеством товаров.
- Тестируйте код на staging-среде перед внедрением в продакшен.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование плагина управления запасами | Готовые решения с настройками | Простота, поддержка | Зависимость от стороннего кода, нагрузка |
| Кастомный код с хуками | Точная настройка поведения | Легковесность, контроль | Требует навыков разработки |
| Изменение статуса товара вручную | Без кода, через админку | Простота | Ручной труд, ошибки |