В современных проектах на WordPress часто возникает необходимость создавать не просто кастомные типы постов, но и выстраивать между ними иерархические связи. При этом всё чаще требуется обеспечить доступ к этим данным через REST API — для интеграции с фронтенд-приложениями или внешними сервисами. В этой статье я подробно расскажу, как сделать иерархию кастомных типов постов с поддержкой REST API, приведу примеры кода и полезные советы по организации данных.
Почему важно создавать иерархию кастомных типов постов
Иерархия позволяет структурировать контент, упрощая навигацию и управление. В отличие от стандартных записей (post), кастомные типы постов часто используются для нестандартных сущностей — например, проекты, услуги, товары, события и т.п. Если у вас, например, есть кастомный тип «проекты» и «задачи» внутри проектов, логично связать их иерархически.
Это дает несколько преимуществ:
- Удобство в админке — дочерние элементы видны и доступны через родительский;
- Возможность создавать ЧПУ с вложенной структурой (например, site.ru/project/task);
- Проще строить запросы и фильтрацию по структуре;
- Легче отобразить дерево на фронтенде или в REST API.
Однако WordPress по умолчанию поддерживает иерархию только для типа post и страниц. Для кастомных типов нужно явно указать поддержку иерархии и доработать REST API.
Регистрация кастомного типа поста с иерархией
Для регистрации кастомного типа с иерархией используйте параметр hierarchical в функции register_post_type. Вот пример создания типа «project» с поддержкой иерархии:
function wphierarchy_register_project_cpt() {
$labels = array(
'name' => 'Проекты',
'singular_name' => 'Проект',
'menu_name' => 'Проекты',
'name_admin_bar' => 'Проект',
'add_new' => 'Добавить проект',
'add_new_item' => 'Добавить новый проект',
'new_item' => 'Новый проект',
'edit_item' => 'Редактировать проект',
'view_item' => 'Просмотреть проект',
'all_items' => 'Все проекты',
'search_items' => 'Искать проекты',
'parent_item_colon' => 'Родительский проект:',
'not_found' => 'Проекты не найдены.',
'not_found_in_trash' => 'В корзине проекты не найдены.'
);
$args = array(
'labels' => $labels,
'public' => true,
'hierarchical' => true, // Важный параметр для иерархии
'show_in_rest' => true, // Включаем REST API
'rest_base' => 'projects',
'supports' => array('title', 'editor', 'page-attributes'), // page-attributes для сортировки и иерархии
'rewrite' => array('slug' => 'project', 'with_front' => false),
'menu_position' => 20,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wphierarchy_project', $args);
}
add_action('init', 'wphierarchy_register_project_cpt');
Обратите внимание, что для иерархии важно включить 'hierarchical' => true и добавить поддержку page-attributes, иначе в админке не появится мета-блок для выбора родителя.
Создание иерархии дочерних постов
После регистрации типа вы можете создавать проекты и задавать у них родительские проекты. Это удобно делать через админку, но можно и программно:
$parent_id = 123; // ID родительского проекта
$new_project = array(
'post_title' => 'Дочерний проект',
'post_type' => 'wphierarchy_project',
'post_status' => 'publish',
'post_parent' => $parent_id
);
wp_insert_post($new_project);
Так вы создадите дочерний элемент, который автоматически войдёт в иерархию.
Поддержка иерархии в REST API WordPress
Включение show_in_rest в параметрах регистрация типа поста — это первый шаг для работы с REST API. Однако по умолчанию в стандартном ответе REST API не возвращается информация о родителе и дочерних постах. Чтобы получить полноценную иерархию через API, нужно добавить к REST ресурсам дополнительные поля.
Добавление родителя и дочерних элементов в REST API
Для этого используем фильтр register_rest_field. Пример для типа wphierarchy_project:
function wphierarchy_register_rest_fields() {
register_rest_field('wphierarchy_project', 'parent_project', array(
'get_callback' => function($post) {
return $post['parent'];
},
'schema' => array(
'description' => 'ID родительского проекта',
'type' => 'integer',
'context' => array('view', 'edit')
),
));
register_rest_field('wphierarchy_project', 'child_projects', array(
'get_callback' => 'wphierarchy_get_child_projects',
'schema' => null,
));
}
add_action('rest_api_init', 'wphierarchy_register_rest_fields');
function wphierarchy_get_child_projects($post) {
$args = array(
'post_type' => 'wphierarchy_project',
'post_status' => 'publish',
'post_parent' => $post['id'],
'numberposts' => -1
);
$children = get_posts($args);
if (empty($children)) {
return array();
}
$result = array();
foreach ($children as $child) {
$result[] = array(
'id' => $child->ID,
'title' => $child->post_title,
'link' => get_permalink($child->ID),
);
}
return $result;
}
Теперь, запрашивая по REST API /wp-json/wp/v2/projects, вы получите в каждом объекте поле parent_project с ID родителя и массив child_projects с дочерними элементами.
Вывод иерархии кастомных постов на фронтенде
Для вывода иерархической структуры на сайте можно использовать WP_Query с параметром post_parent и рекурсивно строить дерево.
Пример функции для получения дерева проектов
function wphierarchy_get_project_tree($parent_id = 0) {
$args = array(
'post_type' => 'wphierarchy_project',
'post_status' => 'publish',
'post_parent' => $parent_id,
'orderby' => 'menu_order',
'order' => 'ASC',
'numberposts' => -1
);
$projects = get_posts($args);
$tree = array();
foreach ($projects as $project) {
$children = wphierarchy_get_project_tree($project->ID);
$tree[] = array(
'ID' => $project->ID,
'title' => $project->post_title,
'link' => get_permalink($project->ID),
'children' => $children
);
}
return $tree;
}
Далее этот массив можно отобразить любым удобным способом — через рекурсивную функцию вывода в HTML, Vue, React и т.д.
Советы и рекомендации по работе с иерархией кастомных типов
При построении сложных иерархий обращайте внимание на производительность. Запросы с рекурсией могут быть затратны, особенно если много уровней вложенности. В таких случаях стоит:
- Кешировать результаты запросов;
- Ограничивать глубину вложенности на фронтенде;
- Использовать дополнительные таблицы или мета-поля для быстрого поиска родителя;
- Оптимизировать REST API, отдавая только необходимые поля.
Для упрощения управления в админке можно использовать плагины, например, Clearfy Pro, который позволяет расширять возможности типов постов и их иерархий без лишнего кода.
Вывод
Создать иерархию кастомных типов постов с поддержкой REST API в WordPress — задача вполне решаемая и полезная для современных проектов. В статье рассмотрены основные шаги — регистрация типа с иерархией, программное создание дочерних элементов, расширение REST API и пример вывода дерева на фронтенде. Используйте представленные подходы и код для своих сайтов, чтобы удобно структурировать и интегрировать контент.