Автоматическое отключение неиспользуемых категорий WooCommerce

Диагностика проблемы: зачем отключать неиспользуемые категории WooCommerce

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

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

Как определить неиспользуемые категории WooCommerce

Для начала нужно получить список категорий, в которых нет активных товаров. Под «активными» понимаются товары со статусом publish.

function get_unused_woocommerce_categories() {
    $args = array(
        'taxonomy'   => 'product_cat',
        'hide_empty' => true,
        'fields'     => 'ids',
    );
    // Получаем ID категорий с товарами
    $used_cats = get_terms($args);

    $all_args = array(
        'taxonomy'   => 'product_cat',
        'hide_empty' => false,
        'fields'     => 'ids',
    );
    // Получаем ID всех категорий
    $all_cats = get_terms($all_args);

    // Категории без товаров
    $unused_cats = array_diff($all_cats, $used_cats);

    return $unused_cats;
}

Функция возвращает массив ID категорий, в которых нет опубликованных товаров.

Пошаговое решение: автоматическое отключение неиспользуемых категорий

«Отключение» категории в WooCommerce можно реализовать через установку категории в статус «черновик» (для таксономий это не работает напрямую), либо через добавление мета-поля, по которому категория не будет отображаться на сайте и в меню. Второй вариант более безопасен.

Пример кода, который проставляет мета-поле _disabled для неиспользуемых категорий:

function disable_unused_product_categories() {
    $unused_cats = get_unused_woocommerce_categories();

    foreach ($unused_cats as $cat_id) {
        update_term_meta($cat_id, '_disabled', 'yes');
    }
}

// Запуск через WP-CLI или хук (только вручную)
// disable_unused_product_categories();

Чтобы категории с мета-полем _disabled = yes не отображались на сайте, нужно добавить фильтр в запрос категорий:

add_action('pre_get_posts', function($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    if ($query->is_tax('product_cat')) {
        $tax_query = $query->get('tax_query');

        $tax_query[] = array(
            'taxonomy' => 'product_cat',
            'field'    => 'term_id',
            'terms'    => get_terms(array(
                'taxonomy'   => 'product_cat',
                'meta_key'   => '_disabled',
                'meta_value' => 'yes',
                'fields'     => 'ids',
            )),
            'operator' => 'NOT IN',
        );

        $query->set('tax_query', $tax_query);
    }
});

Условие для исключения из меню

Чтобы скрыть такие категории из меню WooCommerce, добавьте фильтр:

add_filter('wp_get_nav_menu_items', function($items) {
    foreach ($items as $key => $item) {
        if ('product_cat' === $item->object) {
            $disabled = get_term_meta($item->object_id, '_disabled', true);
            if ('yes' === $disabled) {
                unset($items[$key]);
            }
        }
    }
    return $items;
});

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

  • В админке вызовите get_unused_woocommerce_categories() — убедитесь, что возвращаются именно неактивные категории.
  • Запустите функцию disable_unused_product_categories() один раз.
  • Проверьте, что категории с мета-полем _disabled= yes не показываются в каталоге и меню.
  • Выполните поиск категории на сайте — она должна отсутствовать.

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

  • Ошибка: Категории не скрываются на фронтенде.
    Причина: Фильтр pre_get_posts не добавлен или добавлен неправильно.
    Решение: Проверьте, что фильтр подключен и условие is_tax('product_cat') корректно срабатывает.
  • Ошибка: Функция disable_unused_product_categories() срабатывает при каждом запросе, замедляя сайт.
    Причина: Функция вызывается в хуках с частым выполнением.
    Решение: Запускайте функцию вручную через WP-CLI или один раз через админку, затем отключайте вызов.
  • Ошибка: Отключённые категории остаются в сайдбаре или виджетах.
    Причина: Виджеты не учитывают кастомное мета-поле.
    Решение: Добавить проверку мета-поля в шаблоны виджетов или использовать фильтры вывода.

Практические советы по безопасности и производительности

  • Не используйте тяжелые запросы при каждом загрузке страницы. Отключение категорий выполняйте отдельным скриптом или cron-задачей.
  • Кэшируйте результат функции get_unused_woocommerce_categories() через Transients API, чтобы не перегружать базу.
  • При добавлении мета-поля _disabled используйте уникальные префиксы, чтобы избежать конфликтов с другими плагинами.
  • Регулярно проверяйте и удаляйте категории, которые не используются длительное время, чтобы база оставалась чистой.

Сравнение вариантов реализации отключения категорий WooCommerce

МетодОписаниеПлюсыМинусы
Удаление категорийПолное удаление неиспользуемых категорий через интерфейс или кодЧистота базы, нет лишних данныхПотеря истории, может повредить SEO
Статус черновик (неприменимо)Для товаров работает, для таксономий — нетУдобно для товаровНельзя для категорий
Добавление мета-поля "_disabled" и фильтрацияДобавление флага и исключение категорий из выводаБезопасно, сохраняет данныеНужно дописывать фильтры в шаблоны
Диагностика и решение проблем с неработающим AJAX в WooCommerce
04.06.2026
Как изменить favicon в WordPress: практические решения с кодом и плагинами
27.03.2026
Как создать фильтры по таксономиям в WordPress с примерами кода
06.02.2026
Как удалить редиректы в WordPress и избежать петель перенаправлений
22.04.2026
Запрет доступа к административной панели WordPress по IP: как ограничить доступ безопасно
21.11.2025