В этой статье мы подробно разберем, как создать дерево категорий в WordPress с помощью собственного кода. Многие разработчики сталкиваются с задачей вывести категории в виде вложенного списка, отображающего иерархию. Стандартные виджеты и функции WordPress не всегда дают желаемый результат, особенно если нужно полностью контролировать внешний вид и логику.
Почему важно использовать дерево категорий в WordPress
Дерево категорий — это удобный способ показать структуру рубрик сайта, улучшить навигацию и SEO. Пользователи быстрее находят нужную тему, а поисковики лучше индексируют вложенные страницы. Особенно полезно такое дерево в больших блогах, интернет-магазинах и новостных порталах.
Стандартный вызов wp_list_categories() может вывести категории списком, но без гибкой кастомизации. Чтобы получить полный контроль, имеет смысл написать собственную функцию, которая рекурсивно пройдет по категориям и выведет их в нужном формате.
Использование функции wpcontent_get_category_tree для вывода дерева категорий
Создадим функцию wpcontent_get_category_tree(), которая будет принимать ID родительской категории и рекурсивно собирать дочерние категории в массив, а затем выводить их в виде вложенных списков.
function wpcontent_get_category_tree($parent = 0) {
$args = array(
'taxonomy' => 'category',
'parent' => $parent,
'hide_empty' => false,
'orderby' => 'name',
'order' => 'ASC'
);
$categories = get_terms($args);
if (!empty($categories) && !is_wp_error($categories)) {
echo '<ul>';
foreach ($categories as $category) {
echo '<li><a href="' . get_category_link($category->term_id) . '">' . esc_html($category->name) . '</a>';
wpcontent_get_category_tree($category->term_id); // рекурсия
echo '</li>';
}
echo '</ul>';
}
}Эта функция сначала получает все категории с заданным родителем, затем для каждой категории выводит ссылку и вызывает себя повторно, чтобы вывести дочерние категории.
Чтобы вывести дерево на сайте, достаточно вызвать функцию в нужном месте шаблона:
wpcontent_get_category_tree();Настройка внешнего вида и добавление классов CSS
Для удобства стилизации желательно добавить CSS-классы к элементам списка, например, помечать уровни вложенности или выделять активную категорию. Для этого можно расширить функцию:
function wpcontent_get_category_tree($parent = 0, $level = 0) {
$args = array(
'taxonomy' => 'category',
'parent' => $parent,
'hide_empty' => false,
'orderby' => 'name',
'order' => 'ASC'
);
$categories = get_terms($args);
if (!empty($categories) && !is_wp_error($categories)) {
echo '<ul class="category-level-' . $level . '">';
foreach ($categories as $category) {
$class = '';
if (is_category($category->term_id)) {
$class = ' current-category';
}
echo '<li class="category-item' . $class . '"><a href="' . get_category_link($category->term_id) . '">' . esc_html($category->name) . '</a>';
wpcontent_get_category_tree($category->term_id, $level + 1);
echo '</li>';
}
echo '</ul>';
}
}Теперь вы можете в CSS оформить .category-level-0, .category-level-1 и так далее, а также выделить активную категорию через класс current-category. Это дает гибкость в дизайне.
Пример использования плагина Category Tree Widget для автоматизации
Если хотите готовое решение без кода, обратите внимание на плагин Category Tree Widget. Он автоматически создает виджет с древовидной структурой категорий, поддерживает настройки отображения и фильтрации.
Для установки:
- Перейдите в админ-панель WordPress → Плагины → Добавить новый
- В поиске введите "Category Tree Widget"
- Установите и активируйте плагин
После этого вы сможете добавить виджет в боковую панель и настроить его параметры: уровни вложенности, сортировку, показывать/скрывать пустые категории и т.д.
Как улучшить производительность при большом количестве категорий
При большом числе категорий рекурсивный вывод может замедлять сайт. Чтобы оптимизировать, можно использовать кэширование результата.
Пример добавления кэша с использованием Transients API WordPress:
function wpcontent_get_category_tree_cached($parent = 0, $level = 0) {
$cache_key = 'wpcontent_category_tree_' . $parent . '_' . $level;
$tree = get_transient($cache_key);
if ($tree !== false) {
echo $tree;
return;
}
ob_start();
wpcontent_get_category_tree($parent, $level);
$tree = ob_get_clean();
set_transient($cache_key, $tree, 12 * HOUR_IN_SECONDS);
echo $tree;
}Теперь можно вместо прямого вызова использовать wpcontent_get_category_tree_cached(), чтобы выдавать закэшированную версию, что уменьшит нагрузку на базу данных.
Выводы по созданию дерева категорий в WordPress
Создание дерева категорий с помощью собственного кода позволяет гибко управлять выводом и дизайном. Рекурсивный подход с функцией wpcontent_get_category_tree() — универсальный инструмент для решения задачи. Для быстрого результата подойдет плагин Category Tree Widget. А для высоконагруженных проектов важно использовать кэширование.
Таким образом, вы обеспечите удобную навигацию для пользователей и оптимизируете структуру сайта под SEO.