При работе с большим количеством категорий в WordPress часто возникает задача визуализировать их как дерево с указанием количества записей в каждой категории. Это удобно для пользователей и администраторов, чтобы быстро ориентироваться в структуре сайта и понимать насыщенность каждой ветки. В этой статье мы подробно разберем, как создать кастомное дерево категорий с подсчетом количества постов, используя нативные функции WordPress и минимальный кастомный код.
Зачем нужно дерево категорий с подсчетом постов?
Стандартные виджеты WordPress выводят категории списком, иногда с количеством постов в скобках. Однако при большом количестве категорий и вложенной структуре это становится неудобным. Дерево категорий визуально отражает иерархию и помогает лучше понять структуру контента. Наличие количества постов прямо в дереве показывает, насколько активна категория.
Преимущества такого подхода:
- Удобство навигации по категориям
- Информативность для посетителей
- Возможность кастомизации вывода (стили, иконки, ссылки)
Как получить дерево категорий с подсчетом постов: базовый подход
Для начала нам нужно получить все категории и их потомков, а также количество постов в каждой. WordPress предоставляет функцию get_categories() с параметром hierarchical, но она не выводит дерево в готовом виде, а возвращает плоский массив.
Пример получения категорий с подсчетом постов:
function wphierarchy_get_categories_with_count() {
$categories = get_categories(array(
'hide_empty' => false,
));
return $categories;
}
Эти категории имеют свойства term_id, parent, count и другие.
Построение иерархии категорий в дерево
Нужно превратить плоский массив категорий в дерево, где у каждой категории есть массив дочерних. Для этого используем вспомогательную функцию:
function wphierarchy_build_category_tree(array $categories, $parent_id = 0) {
$branch = array();
foreach ($categories as $category) {
if ($category->parent == $parent_id) {
$children = wphierarchy_build_category_tree($categories, $category->term_id);
if ($children) {
$category->children = $children;
} else {
$category->children = array();
}
$branch[] = $category;
}
}
return $branch;
}
Теперь у нас есть дерево категорий с вложенными полями children.
Вывод дерева категорий с количеством постов в HTML
Создадим функцию для рекурсивного вывода дерева в виде вложенного списка с указанием количества постов в каждой категории.
function wphierarchy_render_category_tree($categories) {
echo '<ul>';
foreach ($categories as $category) {
echo '<li>';
echo esc_html($category->name) . ' (' . intval($category->count) . ')';
if (!empty($category->children)) {
wphierarchy_render_category_tree($category->children);
}
echo '</li>';
}
echo '</ul>';
}
Эту функцию можно вызвать так:
$categories = wphierarchy_get_categories_with_count();
$tree = wphierarchy_build_category_tree($categories);
wphierarchy_render_category_tree($tree);
Расширение: добавляем ссылку на архив категории и стилизацию
Чтобы сделать дерево более полезным, добавим ссылки на архивы категорий и CSS классы для стилей.
function wphierarchy_render_category_tree_links($categories) {
echo '<ul class="wphierarchy-category-tree">';
foreach ($categories as $category) {
$link = get_category_link($category->term_id);
echo '<li class="wphierarchy-category-item">';
echo '<a href="' . esc_url($link) . '">' . esc_html($category->name) . '</a>';
echo ' <span class="wphierarchy-category-count">(' . intval($category->count) . ')</span>';
if (!empty($category->children)) {
wphierarchy_render_category_tree_links($category->children);
}
echo '</li>';
}
echo '</ul>';
}
Добавьте в CSS темы или кастомный CSS для классов .wphierarchy-category-tree, .wphierarchy-category-item и .wphierarchy-category-count для настраиваемого вида.
Оптимизация: кеширование результата
Если категорий много, рекурсивный запрос и построение дерева может замедлять сайт. Рекомендуется кешировать результат с помощью Transients API:
function wphierarchy_get_cached_category_tree() {
$cache_key = 'wphierarchy_category_tree';
$tree = get_transient($cache_key);
if (false === $tree) {
$categories = wphierarchy_get_categories_with_count();
$tree = wphierarchy_build_category_tree($categories);
set_transient($cache_key, $tree, HOUR_IN_SECONDS);
}
return $tree;
}
Это снижает нагрузку на базу данных, обновляя дерево не чаще раза в час.
Пример использования в шаблоне
В любом месте темы (например, sidebar.php) можно вывести дерево так:
$tree = wphierarchy_get_cached_category_tree();
wphierarchy_render_category_tree_links($tree);
Поддержка плагина Clearfy Pro для оптимизации
Если на сайте установлен плагин Clearfy Pro, то он может помочь отключить ненужные запросы и оптимизировать загрузку страниц с большими таксономиями, что дополнительно ускорит работу дерева категорий.
Также рекомендуем рассмотреть плагин WPRemark для создания отзывов с возможностью иерархии, если нужна связанная функциональность.
Заключение
Создание кастомного дерева категорий с подсчетом постов в WordPress — задача, которую можно решить минимальным кодом и стандартными функциями. Это улучшает навигацию и делает структуру сайта понятнее. Используйте кеширование для производительности и добавляйте стили для удобства пользователей.