Создание дерева категорий с подсчетом постов в WordPress

|

При работе с большим количеством категорий в 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 — задача, которую можно решить минимальным кодом и стандартными функциями. Это улучшает навигацию и делает структуру сайта понятнее. Используйте кеширование для производительности и добавляйте стили для удобства пользователей.

Как создать иерархию кастомных пользовательских метаполей в WordPress
01.04.2026
Как создать динамическую иерархию постов в WordPress: практическое руководство
19.12.2025
Как создать иерархию отзывов с поддержкой рейтингов в WordPress
20.02.2026
WooCommerce: как правильно настроить иерархию категорий и проблемы с производительностью
17.04.2026
WooCommerce: решение сложностей с иерархией товаров и автоматическим присвоением категорий
30.04.2026
×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙