Как скрыть пустые категории WooCommerce в магазине без поломки меню и SEO

Ситуация типичная: в каталоге WooCommerce остаются категории без товаров, они продолжают показываться в меню, на витрине и в блоках фильтрации. Удалять такие категории часто нельзя — они нужны для будущих товаров, для структуры каталога или для SEO-архитектуры. Но и оставлять их видимыми тоже неудобно: пользователь кликает в пустой раздел и уходит.

Ниже — рабочий способ скрывать пустые категории только на фронтенде, без удаления терминов из базы и без вмешательства в админку. Подход подходит для тем и плагинов, которые используют стандартные функции WooCommerce для вывода категорий.

Когда проблема действительно в пустых категориях

Перед правкой кода стоит понять, где именно категория «всплывает». В WooCommerce одна и та же категория может отображаться в нескольких местах: в шапке, в виджете категорий, на странице магазина, в хлебных крошках, в блоках Gutenberg и в кастомных шаблонах темы. Если скрыть её только в одном месте, проблема останется в другом.

Что проверить в первую очередь

  • Категория действительно пустая: в ней нет опубликованных товаров и товаров в статусе, который учитывает витрина.
  • Она выводится стандартным списком категорий WooCommerce, а не кастомным запросом темы.
  • Меню сайта не построено вручную из ссылок на категории — такие ссылки кодом не убрать.
  • Плагин кеширования не показывает старую версию страницы после изменений.

Если категория пустая только временно, лучше скрывать её автоматически, а не чистить вручную. Это уменьшает количество ошибок при наполнении каталога.

Как скрыть пустые категории через фильтр WooCommerce

Самый безопасный вариант — использовать фильтр get_terms_args и ограничить его только запросами категорий товаров на фронтенде. Так вы не трогаете сами термины и не ломаете админку.

<?php
add_filter( 'get_terms_args', function( $args, $taxonomies ) {
    if ( is_admin() ) {
        return $args;
    }

    if ( ! in_array( 'product_cat', (array) $taxonomies, true ) ) {
        return $args;
    }

    // Не вмешиваемся в запросы, где пустые категории нужны явно.
    if ( isset( $args['hide_empty'] ) && false === $args['hide_empty'] ) {
        return $args;
    }

    $args['hide_empty'] = true;

    return $args;
}, 10, 2 );

Этот вариант работает там, где тема или плагин запрашивает категории через get_terms() или функции WooCommerce, которые опираются на стандартный механизм WordPress. Если у вас есть отдельные блоки, где пустые категории должны быть видны, для них можно явно передавать hide_empty => false и не зависеть от глобального фильтра.

Если нужно скрывать только на странице магазина

Иногда пустые категории нужны в меню, но не нужны в плитке на странице каталога. Тогда лучше не менять глобальный запрос, а фильтровать вывод в конкретном шаблоне. Например, если тема использует woocommerce_output_product_categories(), можно подменить список терминов перед рендером.

<?php
add_filter( 'woocommerce_product_subcategories_args', function( $args ) {
    if ( is_shop() || is_product_taxonomy() ) {
        $args['hide_empty'] = true;
    }

    return $args;
} );

Это уже более узкий сценарий: пустые категории скрываются только в каталоге, но остаются доступны в других частях сайта. Такой вариант удобен, если структура каталога важна для навигации, а на витрине нужны только заполненные разделы.

Сравнение подходов: код, плагин или ручная правка

ПодходГде подходитПлюсыМинусы
Фильтр get_terms_argsНужно скрыть пустые категории почти вездеГибко, без удаления данныхМожет затронуть кастомные запросы, если их не исключить
woocommerce_product_subcategories_argsТолько витрина и страницы каталогаМеньше побочных эффектовНе решает проблему в меню и виджетах
Ручная настройка менюКатегорий мало и структура меняется редкоПростоНе масштабируется, легко забыть обновить ссылки

Если у вас магазин с активным ассортиментом, код обычно надежнее ручной чистки. Если каталог небольшой и структура редко меняется, иногда достаточно правки меню и виджетов. Но как только категорий становится много, ручное сопровождение начинает давать сбои.

Проверка результата после внедрения

После добавления кода не ограничивайтесь визуальной проверкой главной страницы. Нужно пройтись по всем местам, где категории могут выводиться по-разному.

  1. Откройте страницу магазина в режиме инкогнито и проверьте список категорий.
  2. Перейдите в архивы категорий и убедитесь, что пустые разделы не показываются в блоках подкатегорий.
  3. Проверьте меню, если оно собирается автоматически из категорий.
  4. Очистите кеш плагина и серверный кеш, если он есть.
  5. В админке откройте Товары → Категории и убедитесь, что сами категории не удалились.

Дополнительно можно проверить запросы вручную через временный лог или через отладочный вывод в шаблоне. Если категория исчезла из витрины, но осталась в админке, решение работает правильно.

Частые ошибки и как их исправить

Категории пропали и из админки

Такое обычно происходит, если фильтр применили слишком широко и не ограничили его фронтендом. Проверьте условие is_admin(). Без него вы вмешиваетесь и в административные запросы.

Пустые категории всё ещё видны в меню

Меню WordPress не обязано строиться через get_terms(). Если ссылки добавлены вручную, фильтр их не уберёт. В этом случае нужно либо обновить структуру меню, либо генерировать его динамически из категорий.

После обновления страницы категории снова появились

Почти всегда виноват кеш. Сначала очистите кеш плагина, потом серверный кеш, потом CDN, если он используется. И только после этого проверяйте результат в приватном окне.

Сломались блоки с подборкой категорий

Значит, блок рассчитывал видеть пустые категории, а глобальный фильтр их скрыл. Для таких блоков лучше использовать локальный запрос с явным hide_empty => false или вынести логику в отдельный шаблон.

Что делать, если пустые категории нужны для SEO

Иногда категория пустая только сейчас, но её уже индексируют или на неё ведут внутренние ссылки. В таком случае не стоит удалять её или массово закрывать без проверки. Лучше оставить термин, но скрыть его из пользовательского интерфейса до появления товаров.

Если нужен более аккуратный контроль над дублями, хлебными крошками, архивами и служебными страницами, имеет смысл посмотреть в сторону инструментов, которые помогают чистить лишние элементы темы и SEO-обвязку. Например, Clearfy Pro может быть полезен, когда нужно убрать технический шум без переписывания шаблонов, но применять его стоит точечно и после проверки на тестовой копии сайта.

Мини-чек-лист перед публикацией правки

  • Код добавлен в дочернюю тему или в отдельный mu-plugin.
  • Проверено, что скрытие работает только на фронтенде.
  • Пустые категории остались доступны в админке.
  • Кеш очищен на всех уровнях.
  • Проверены меню, виджеты и блоки каталога.

Если задача стоит именно в том, чтобы не показывать пустые категории покупателю, а не удалять их из системы, этот подход закрывает проблему без лишних побочных эффектов. Главное — не делать глобальную правку вслепую и проверить все точки вывода категорий, а не только страницу магазина.

Как вывести остаток товара на странице категории WooCommerce без лишней нагрузки
09.08.2026
Как удалить параметры контроллера из URL в WordPress
16.12.2025
WooCommerce: автоматическое создание возвратов товаров по счетчику продаж
08.06.2026
Как отключить XML-RPC в WordPress и закрыть лишний канал атак
19.08.2026
Отложенный запуск задач в WordPress без Cron: практическое руководство
12.01.2026