Диагностика проблемы: зачем отключать неиспользуемые категории 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" и фильтрация | Добавление флага и исключение категорий из вывода | Безопасно, сохраняет данные | Нужно дописывать фильтры в шаблоны |