Диагностика задачи: зачем нужна иерархия категорий в шаблоне WooCommerce
В стандартных темах WooCommerce список категорий товаров часто выводится без учёта вложенности: все категории идут подряд, без визуального отражения родительских и дочерних связей. Это неудобно для пользователей и ухудшает навигацию по каталогу. Задача — вывести категории в шаблоне с учётом иерархии, чтобы подкатегории отображались вложенными, а ссылки вели на соответствующие архивные страницы.
Пошаговое решение: вывод иерархического списка категорий в шаблоне
1. Получение массива категорий с учётом иерархии
Используем функцию get_terms() с параметром 'parent' => 0 для получения только верхних категорий, а затем рекурсивно выводим дочерние категории.
function wphierarchy_display_product_categories( $parent = 0 ) {
$args = [
'taxonomy' => 'product_cat',
'hide_empty' => false,
'parent' => $parent,
'orderby' => 'name',
'order' => 'ASC',
];
$categories = get_terms( $args );
if ( ! empty( $categories ) && ! is_wp_error( $categories ) ) {
echo '<ul>';
foreach ( $categories as $category ) {
$category_link = get_term_link( $category );
echo '<li><a href="' . esc_url( $category_link ) . '">' . esc_html( $category->name ) . '</a>';
// Рекурсивный вызов для дочерних категорий
wphierarchy_display_product_categories( $category->term_id );
echo '</li>';
}
echo '</ul>';
}
}2. Вызов функции в нужном месте шаблона
Например, в файле archive-product.php или в сайдбаре темы вставьте:
<?php wphierarchy_display_product_categories(); ?>Проверка результата после внедрения
- Перейдите на страницу архива товаров или на страницу, где вы вставили вызов функции.
- Убедитесь, что категории отображаются в виде вложенного списка <ul><li> с правильными ссылками.
- Проверьте, что подкатегории отображаются внутри родителей, а не просто в один уровень.
- Проверьте, что категории без товаров тоже отображаются (если необходимо), благодаря
'hide_empty' => false.
Частые ошибки и причины
- Ничего не отображается: проверьте, что таксономия
product_catдействительно существует и что в базе есть категории товаров. Возможно, вы вызываете функцию вне контекста WooCommerce. - Ошибка в ссылках: если
get_term_link()возвращает ошибку, проверьте корректность объекта категории и наличие пермалинков. - Циклические вызовы: если иерархия категорий построена с ошибками и есть циклы, рекурсия может привести к бесконечному выводу. Проверьте структуру категорий в админке.
- Отсутствие стилей: браузер показывает вложенный список без отступов — добавьте CSS для
ul ul { margin-left: 20px; }.
Практические советы по безопасности и производительности
- Кэширование: при большом количестве категорий используйте объектный кэш WordPress или transient API, чтобы не выполнять запросы при каждом загрузке страницы.
- Санитизация вывода: всегда используйте
esc_html()для текста иesc_url()для ссылок, чтобы избежать XSS-уязвимостей. - Ограничение глубины вложенности: при необходимости добавьте параметр максимальной глубины в рекурсивную функцию, чтобы избежать слишком глубоких списков.
Сравнение способов вывода иерархии категорий
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Рекурсивный PHP-код (как в статье) | Гибкий, полностью кастомизируемый, без плагинов | Требует навыков PHP, может быть медленнее без кэша | Функция wphierarchy_display_product_categories() |
| Плагин WooCommerce Category Accordion | Простая установка, готовый UI, AJAX-подгрузка | Меньше контроля, нагрузка плагина | Плагин из репозитория WordPress |
| Хук WooCommerce + шаблонные части | Интеграция в существующий шаблон, использование хуков | Требует знаний WooCommerce API, может быть сложен новичкам | Добавление кода в functions.php с хуками |