Диагностика проблемы: почему фильтр категорий не учитывает иерархию
В WooCommerce при использовании стандартного виджета фильтра по категориям или плагинов для фильтрации часто возникает ситуация, когда фильтр не отображает или не учитывает подкатегории и вложенную иерархию категорий. В результате пользователи не могут корректно фильтровать товары по вложенным категориям, что снижает удобство и конверсию.
Основные симптомы:
- В фильтре категории отображаются только верхние уровни, без подкатегорий.
- При выборе родительской категории товары из дочерних категорий не показываются.
- Кастомные запросы WP_Query игнорируют иерархию категорий.
Почему так происходит
WooCommerce использует стандартную таксономию product_cat, которая поддерживает иерархии. Однако в запросах и виджетах по умолчанию часто не выставляется параметр include_children или он выставлен неверно. Также некоторые плагины фильтрации неправильно формируют запросы, игнорируя вложенность.
Кроме того, тема или кастомный код могут переопределять параметры запросов, мешая правильной работе фильтра.
Пошаговое решение: как исправить фильтр по иерархии категорий в WooCommerce
1. Проверяем стандартный виджет фильтра по категориям
Перейдите в Внешний вид > Виджеты и найдите виджет Фильтр по категориям товаров. Убедитесь, что в настройках включена опция «Показывать иерархию» (если такая есть). В стандартных версиях WooCommerce это не всегда реализовано, поэтому лучше использовать кастомизацию.
2. Добавляем поддержку иерархии в WP_Query для фильтрации
Если вы используете кастомный запрос для вывода товаров по категориям, необходимо убедиться, что параметр include_children выставлен в true. Пример корректного запроса:
$args = [
'post_type' => 'product',
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'parent-category-slug',
'include_children' => true, // обязательно
'operator' => 'IN',
],
],
];
$query = new WP_Query($args);3. Исправляем фильтр через хук pre_get_posts
Чтобы обеспечить корректную фильтрацию в стандартном каталоге и на страницах архива, добавьте следующий код в functions.php вашей темы или в плагин:
add_action('pre_get_posts', function( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_tax('product_cat') ) {
$tax_query = $query->get('tax_query');
if ( ! $tax_query ) {
$tax_query = [];
}
foreach ( $tax_query as &$tax ) {
if ( isset($tax['taxonomy']) && $tax['taxonomy'] === 'product_cat' ) {
$tax['include_children'] = true;
}
}
$query->set('tax_query', $tax_query);
}
});4. Использование плагина с поддержкой иерархии
Если стандартные инструменты не подходят, рассмотрите плагин Clearfy Pro — он расширяет фильтры WooCommerce и корректно обрабатывает иерархию категорий без дополнительного кода.
Проверка результата после внедрения
- Перейдите на страницу магазина или категорий.
- Воспользуйтесь фильтром по категориям, выбрав родительскую категорию.
- Убедитесь, что отображаются товары из всех дочерних категорий.
- Проверьте, что в списке фильтра отображаются вложенные категории с отступами.
Частые ошибки и их исправление
- Не работает фильтр после обновления темы или плагинов: возможно, переопределяется
pre_get_postsили другие запросы. Проверьте кастомный код и отключите конфликтующие плагины. - Параметр
include_childrenотсутствует: без него WP_Query не учитывает вложенные категории, добавьте его в таксономический запрос. - Кэширование мешает проверить изменения: очистите кэш сайта и браузера после внесения изменений.
- Виджет фильтра не поддерживает иерархию: замените его на другой или добавьте кастомный код для отображения дерева категорий.
Практические советы по оптимизации и безопасности
- При использовании кастомных запросов с
tax_queryвсегда проверяйте параметры, чтобы избежать избыточных запросов к базе и замедления. - Для больших магазинов с глубокой иерархией категорий рекомендуем использовать кеширование запросов с помощью Transients API или внешних кешей.
- Избегайте прямого изменения ядра WooCommerce — используйте хуки и фильтры.
- Проверяйте права доступа пользователей на страницы фильтрации, чтобы исключить утечку информации.
Сравнение способов реализации фильтра с поддержкой иерархии
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Стандартный виджет WooCommerce | Простота, нет кода | Не всегда поддерживает вложенность, ограниченная кастомизация | Виджет «Фильтр по категориям» |
Код с include_children и pre_get_posts |
Точный контроль, работает в любых условиях | Требует знаний PHP, можно ошибиться в коде | Пример из статьи |
| Плагин Clearfy Pro | Автоматизация, поддержка | Платный, зависит от стороннего разработчика | Clearfy Pro |