Проблема: как автоматически скрывать товары без наличия и возвращать их в продажу
В стандартном WooCommerce отсутствует встроенный механизм для автоматического отключения товаров, если их количество на складе достигло нуля, и автоматического включения при появлении остатков. В результате пользователи могут видеть товары, которых нет в наличии, что ухудшает пользовательский опыт и снижает конверсию.
Задача состоит в том, чтобы при достижении остатка товара 0 или меньше он автоматически становился «выключенным» (статус товара draft или private), а при появлении остатков — снова становился опубликованным.
Диагностика проблемы
Для проверки, работает ли автоматическое скрытие, необходимо:
- Проверить настройки WooCommerce: в разделе
Настройки → Товары → Запасывключена ли опцияВключить управление запасами, и как настроены параметрыРазрешить продажи при отсутствии товараиОтображать отсутствующие товары. - Проверить, что при уменьшении остатка товара до 0 он не скрывается автоматически.
- Проверить, что при увеличении остатка товара с 0 товар не появляется автоматически.
Если пункты 2 или 3 не выполняются, значит нужна кастомизация.
Пошаговое решение: автоматическое изменение статуса товара по наличию
Реализуем эту логику через хук woocommerce_product_set_stock, который срабатывает при обновлении остатков товара. В функции будем менять статус публикации товара в зависимости от наличия.
add_action('woocommerce_product_set_stock', 'auto_toggle_product_visibility_by_stock', 10, 1);
function auto_toggle_product_visibility_by_stock($product) {
if (!$product instanceof WC_Product) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$post_status = $product->get_status();
// Если запас 0 или меньше и товар опубликован, меняем на черновик
if ($stock_quantity <= 0 && $post_status === 'publish') {
$product->set_status('draft');
$product->save();
}
// Если запас больше 0 и товар в статусе draft, публикуем
if ($stock_quantity > 0 && $post_status === 'draft') {
$product->set_status('publish');
$product->save();
}
}Этот код автоматически переключает статус товара между publish и draft в зависимости от наличия.
Поддержка вариативных товаров
Для вариативных товаров нужно учитывать, что главный товар может быть опубликован, а вариации иметь разные остатки. В этом случае можно применять логику к каждой вариации:
add_action('woocommerce_variation_set_stock', 'auto_toggle_variation_visibility_by_stock', 10, 1);
function auto_toggle_variation_visibility_by_stock($variation) {
if (!$variation instanceof WC_Product_Variation) {
return;
}
$stock_quantity = $variation->get_stock_quantity();
$post_status = $variation->get_status();
if ($stock_quantity <= 0 && $post_status === 'publish') {
$variation->set_status('draft');
$variation->save();
}
if ($stock_quantity > 0 && $post_status === 'draft') {
$variation->set_status('publish');
$variation->save();
}
}Проверка результата после внедрения
- Обновите остаток товара вручную через админку — установите 0 и сохраните. Товар должен автоматически сменить статус на «черновик» и исчезнуть из каталога.
- Установите остаток больше 0 — товар должен стать опубликованным и появиться в каталоге.
- Для вариаций повторите то же: измените остаток вариации и проверьте, отражается ли это на видимости.
- Проверьте фронтенд сайта в режиме гостя и кэш браузера, чтобы убедиться, что изменения видны пользователям.
Частые ошибки и их исправление
- Статусы не меняются: возможно, функции не подключены или кеширование блокирует обновление. Проверьте, что код добавлен в файл
functions.phpдочерней темы или в отдельный плагин, а также очистите кеш сайта и браузера. - Изменения статуса вызывают проблемы с SEO: переключение между
publishиdraftвлияет на индексацию. Чтобы избежать потери трафика, можно вместоdraftиспользовать статусprivateили скрывать товары через мета-поля и фильтры. - Вариации не обновляются: убедитесь, что добавлена отдельная функция на хук
woocommerce_variation_set_stock, так как вариации — отдельные посты. - Конфликты с другими плагинами: некоторые плагины управления запасами или кэширования могут блокировать сохранение или обновление статусов. Временно отключите их для диагностики.
Практические советы для производительности и безопасности
- Добавьте проверку nonce и прав доступа, если будете расширять функционал для административных интерфейсов.
- Ограничьте частоту срабатывания функции, если у вас большой каталог, чтобы избежать нагрузки на сервер. Например, используйте WP-Cron для пакетной обработки.
- Для SEO лучше использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpelementor.ru&utm_medium=article&utm_campaign=woocommerce-kak-otklyuchit-tovar-pri-otsutstvii-nalichiya-i-razreshit-avtomaticheskoe-vosstanovlenie), который позволяет управлять статусами и индексированием без потери позиций.
Сравнение вариантов реализации автоматического скрытия товаров по наличию
| Подход | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Код на хуках WooCommerce | Использование хуков woocommerce_product_set_stock и woocommerce_variation_set_stock для смены статуса товара | Полный контроль, не требует сторонних плагинов, гибкость | Нужны знания PHP, возможны ошибки при обновлениях, требует тестирования |
| Плагины управления запасами | Готовые решения, которые могут скрывать товары при отсутствии | Простота установки, дополнительные функции управления запасами | Могут быть платными, конфликтовать с другими плагинами, не всегда гибкие |
| Скрытие через CSS/JS | Просто скрыть товар визуально на фронтенде | Простота реализации | Товар остается в базе и доступен по прямой ссылке, плохой UX |