Диагностика проблемы: почему товары с нулевым запасом остаются активными
В стандартной установке WooCommerce товары и их варианты с нулевым запасом не всегда автоматически скрываются или отключаются. Это приводит к тому, что пользователи видят и могут добавить в корзину товары, которых фактически нет в наличии. Особенно важно для магазинов с большим ассортиментом и частыми изменениями остатков.
Проверить, есть ли такая проблема, просто:
- Откройте страницу товара с нулевым запасом.
- Попробуйте добавить товар или вариацию в корзину.
- Если это возможно — значит, автоматическое отключение не настроено.
Как автоматически отключать товары и варианты при отсутствии запаса
1. Отключение товаров с нулевым запасом через код
Добавьте в functions.php вашей активной темы или в кастомный плагин следующий код. Он проверяет наличие и при нулевом остатке меняет статус товара на «черновик», скрывая его с фронтенда.
add_action('woocommerce_product_set_stock_status', 'auto_disable_out_of_stock_products', 10, 3);
function auto_disable_out_of_stock_products($product_id, $stock_status, $product) {
if ($stock_status === 'outofstock') {
// Меняем статус товара на черновик
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
} else {
// Если товар снова в наличии, возвращаем статус 'publish'
$post = get_post($product_id);
if ($post->post_status === 'draft') {
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'publish'
));
}
}
}Этот подход гарантирует, что товары полностью исчезают из каталога при отсутствии запаса. Но стоит помнить, что это меняет статус поста и может повлиять на SEO.
2. Отключение вариантов товара с нулевым запасом
Варианты — отдельные элементы внутри товара, их нужно отключать иначе. Добавьте следующий фильтр, который исключит вариации с нулевым запасом из доступных для выбора:
add_filter('woocommerce_variation_is_active', 'disable_out_of_stock_variations', 10, 2);
function disable_out_of_stock_variations($is_active, $variation) {
if (!$variation->is_in_stock()) {
return false; // Отключаем вариант если нет на складе
}
return $is_active;
}Этот код скрывает варианты без запаса из списка выбора на странице товара, но не меняет статус варианта в базе.
Пошаговая инструкция по внедрению
- Создайте резервную копию сайта и базы данных.
- Откройте файл
functions.phpвашей темы или создайте кастомный плагин для пользовательских функций. - Вставьте код для автоматического отключения товаров с нулевым запасом.
- Вставьте фильтр для отключения вариантов без запаса.
- Очистите кэш сайта и браузера.
- Проверьте работу на продуктах с разным запасом.
Как проверить, что решение работает
- Создайте тестовый товар с запасом 1 и проверьте, что он отображается и доступен для покупки.
- Уменьшите запас товара до 0 через админку или вручную.
- Обновите страницу товара на фронтенде: товар должен исчезнуть (если статус черновик) или вариант должен стать недоступным.
- Попытайтесь добавить товар или вариант с нулевым запасом в корзину — опция должна быть недоступна.
Частые ошибки и как их исправлять
- Код не работает после добавления в functions.php — возможно, тема кеширует файлы или есть синтаксическая ошибка. Проверьте логи PHP и деактивируйте кэширование.
- Товар не меняет статус на «черновик» — проверьте, что функция
wp_update_postвызывается с правильным ID и что нет конфликтов с плагинами. - Варианты с нулевым запасом отображаются — убедитесь, что фильтр подключен корректно и что вариации обновлены с правильным статусом запаса.
- SEO-проблемы из-за изменения статуса товара — в этом случае можно вместо смены статуса использовать фильтр для скрытия товара из каталогов, например
pre_get_posts.
Практические советы по безопасности и производительности
- Добавляйте проверку nonce или capability, если планируете расширять функционал для админки.
- Избегайте тяжелых запросов в хуках, вызываемых часто, чтобы не замедлять сайт.
- Кэшируйте результаты проверки запаса, если используете в большом количестве.
- Тестируйте изменения на staging-сайте, чтобы избежать простоев в работе магазина.
Сравнение вариантов отключения товаров с нулевым запасом
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Изменение статуса поста (на draft) | Меняет статус товара на «черновик» при отсутствии запаса | Полностью скрывает товар, исключает из поиска и каталога | Влияет на SEO, может сбивать аналитику |
| Фильтр вариаций (woocommerce_variation_is_active) | Отключает варианты без запаса, скрывая их из выбора | Простой, не меняет статус товара | Товар видим, но варианты скрыты — может запутать клиентов |
| Фильтр pre_get_posts с исключением outofstock | Скрывает товары из каталога без изменения статуса | SEO сохраняется, товар не удаляется | Товар доступен по прямой ссылке, возможен дублированный контент |