Проблема: почему нужно отключать неактивные варианты товаров в WooCommerce
В интернет-магазинах на WooCommerce нередко появляется ситуация, когда в товаре остаются варианты без остатков, которые не продаются, но продолжают отображаться в каталоге. Это негативно сказывается на удобстве пользователей и может привести к ошибкам при оформлении заказа.
Автоматическое отключение таких вариантов поможет упростить управление ассортиментом и улучшить UX без ручного администрирования.
Диагностика проблемы с неактивными вариантами
Для начала убедитесь, что у вас действительно есть варианты товаров с нулевым запасом, которые не отключены:
- Перейдите в админку WooCommerce → Товары → выберите переменный товар;
- Вкладка «Вариации» → проверьте поле «Запас» (Stock quantity);
- Если вариант с запасом 0 и статусом «В наличии», значит он активен и отображается покупателям.
Также проверьте настройки управления запасами в WooCommerce (WooCommerce → Настройки → Товары → Управление запасами). Если управление запасами отключено, скрипты не сработают.
Пошаговое решение: отключение вариантов с нулевым остатком через хук
Мы реализуем автоматическое отключение вариантов с нулевым остатком при сохранении товара или обновлении запасов с помощью хука woocommerce_update_product. Варианты с запасом 0 будут переводиться в статус "неактивные".
add_action('woocommerce_update_product', 'auto_disable_out_of_stock_variations', 10, 1);function auto_disable_out_of_stock_variations($product_id) { $product = wc_get_product($product_id); if (!$product || $product->get_type() !== 'variable') { return; } $variations = $product->get_children(); foreach ($variations as $variation_id) { $variation = wc_get_product($variation_id); if ($variation && $variation->managing_stock()) { $stock_qty = $variation->get_stock_quantity(); // Отключаем вариант, если запас 0 или меньше if ($stock_qty === 0 || $stock_qty < 0) { $variation->set_status('private'); // Скрываем вариант $variation->save(); } else { // Включаем обратно, если запас появился if ($variation->get_status() === 'private') { $variation->set_status('publish'); $variation->save(); } } } }}Код ставим в functions.php вашей дочерней темы или в кастомный плагин. Он проверяет каждый вариант и меняет статус, что влияет на отображение в каталоге.
Проверка результата после внедрения
- Обновите остатки товаров с вариантами, где запас 0;
- Откройте страницу товара на фронтенде и убедитесь, что варианты с нулевым запасом скрыты;
- Если запас появился, вариант должен автоматически снова стать видимым;
- В админке в списке вариаций статус должен меняться на "private" у неактивных вариантов.
Частые ошибки и как их исправить
- Управление запасами отключено: скрипт не работает, если в настройках WooCommerce отключено управление запасами;
- Кэширование: если используется агрессивное кэширование, изменения статусов могут не сразу отображаться. Очистите кэш;
- Неправильный статус: используйте статус
privateилиdraftдля скрытия варианта,publish— для отображения. Другие статусы могут не работать; - Отсутствие хуков: убедитесь, что хук
woocommerce_update_productвызывается при обновлении запасов или товара. Иногда нужно дополнительно триггерить обновление.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя, если планируете использовать код в админке, чтобы избежать неожиданного изменения статусов;
- Используйте transient или кэширование, если у вас тысячи товаров, чтобы не перегружать сервер при массовом обновлении;
- Не запускайте код на фронтенде — только в админке или при обновлении товара;
- Резервное копирование базы перед внедрением кода обязательно, чтобы быстро откатить в случае ошибок.
Альтернативные варианты реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин для управления запасами | Простота установки, готовый интерфейс | Может быть избыточным, нагрузка на сайт |
| Кастомный код (описанный выше) | Легкий, точечный, без лишних функций | Требует поддержки и тестирования при обновлениях WooCommerce |
| Скрипты для массового отключения через WP-CLI | Эффективно для больших баз, быстро | Требуются навыки работы с консолью, нет автоматизации |