В WordPress стандартная иерархия реализована только для страниц (post type 'page'), которые поддерживают атрибут post_parent. Для других типов записей, особенно пользовательских (custom post types), иерархия по умолчанию либо отсутствует, либо работает ограниченно. В этой статье разберём, как создать полноценную иерархию для разных типов постов, включая кастомные, с примерами кода и рекомендациями по плагинам.
Почему стандартная иерархия ограничена только страницами
В WordPress у стандартного типа поста page есть встроенное свойство hierarchical, которое при значении true позволяет задавать родительские и дочерние страницы через поле post_parent. Для постов post и многих пользовательских типов постов по умолчанию это свойство равно false, из-за чего иерархия не реализуется.
Для пользовательских типов постов, при регистрации которых в функции register_post_type указать hierarchical => true, появляется возможность создавать иерархию, но при этом интерфейс в админке и функционал шаблонов нужно адаптировать.
Если же тип поста не иерархический, то, чтобы реализовать иерархию, придётся использовать кастомные поля, таксономии или внешние связи.
Как зарегистрировать пользовательский тип поста с поддержкой иерархии
Пример регистрации пользовательского типа поста product с поддержкой иерархии:
function wphierarchy_register_hierarchical_cpt() {
$args = array(
'label' => 'Продукты',
'public' => true,
'hierarchical' => true, // Включаем иерархию
'supports' => array('title', 'editor', 'page-attributes'), // page-attributes для сортировки и родителя
'show_in_rest' => true,
);
register_post_type('product', $args);
}
add_action('init', 'wphierarchy_register_hierarchical_cpt');Обратите внимание, что для работы иерархии в админке нужно добавить поддержку page-attributes. Это позволит выбирать родительский элемент и устанавливать порядок.
После регистрации такого типа поста в админке появится возможность создавать вложенные продукты, формируя иерархию.
Вывод иерархии разных типов постов с помощью WP_Query и рекурсии
Чтобы вывести иерархию записей, можно использовать рекурсивную функцию, которая будет получать все записи с указанным родителем и выводить их с отступами.
Пример функции вывода иерархии для типа product:
function wphierarchy_get_post_hierarchy($post_type = 'product', $parent = 0, $level = 0) {
$args = array(
'post_type' => $post_type,
'post_parent' => $parent,
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
'post_status' => 'publish',
);
$posts = get_posts($args);
if ($posts) {
echo '<ul>';
foreach ($posts as $post) {
echo '<li>' . esc_html($post->post_title);
wphierarchy_get_post_hierarchy($post_type, $post->ID, $level + 1);
echo '</li>';
}
echo '</ul>';
}
}Вызов wphierarchy_get_post_hierarchy('product'); выведет всю иерархию продуктов древовидным списком.
Реализация иерархии для неиерархических типов постов через таксономии
Если тип поста не поддерживает иерархию, например, post, можно использовать иерархическую таксономию — например, категорию или кастомную таксономию с включённым параметром hierarchical => true.
Пример регистрации иерархической таксономии для типа поста news:
function wphierarchy_register_hierarchical_taxonomy() {
$args = array(
'hierarchical' => true,
'label' => 'Категории новостей',
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'news-category'),
);
register_taxonomy('news_category', 'news', $args);
}
add_action('init', 'wphierarchy_register_hierarchical_taxonomy');Таксономия с иерархией позволяет создавать древовидные категории и использовать их для фильтрации и вывода записей по категориям.
Использование плагина Clearfy Pro для расширенного управления иерархией
Плагин Clearfy Pro предлагает много инструментов для оптимизации и настройки WordPress, включая возможность управлять иерархией таксономий и записей. Например, он позволяет быстро отключать ненужные стандартные таксономии и создавать собственные с поддержкой иерархии без лишних усилий.
Если вы хотите гибко настроить структуру сайта с разными типами контента и связями между ними, Clearfy Pro существенно облегчит задачи.
Практические советы по работе с иерархией записей
- Всегда проверяйте, что у типа поста установлен параметр
hierarchicalвtrue, если нужна поддержка иерархии. - Добавляйте поддержку
page-attributes, чтобы появилась возможность задавать порядок и родителя в админке. - Для вывода иерархии используйте рекурсивные функции, чтобы обойти ограничения стандартного WP_Query и получить вложенные записи.
- Если иерархия невозможна для типа поста, используйте иерархические таксономии — это стандартный и удобный подход.
- Для сложных проектов с множеством типов постов и сложной структурой рассмотрите плагины, например, Clearfy Pro, для ускорения разработки.
Пример применения в шаблоне
Чтобы вывести иерархию продуктов в шаблоне темы, просто вызовите функцию:
<?php wphierarchy_get_post_hierarchy('product'); ?>Вы получите вложенный список с заголовками всех продуктов и их дочерних элементов, что удобно для построения навигации или каталога.