Как создать иерархию кастомных типов постов с поддержкой REST API в WordPress

|

В современных проектах на WordPress часто возникает необходимость создавать не просто кастомные типы постов, но и выстраивать между ними иерархические связи. При этом всё чаще требуется обеспечить доступ к этим данным через REST API — для интеграции с фронтенд-приложениями или внешними сервисами. В этой статье я подробно расскажу, как сделать иерархию кастомных типов постов с поддержкой REST API, приведу примеры кода и полезные советы по организации данных.

Почему важно создавать иерархию кастомных типов постов

Иерархия позволяет структурировать контент, упрощая навигацию и управление. В отличие от стандартных записей (post), кастомные типы постов часто используются для нестандартных сущностей — например, проекты, услуги, товары, события и т.п. Если у вас, например, есть кастомный тип «проекты» и «задачи» внутри проектов, логично связать их иерархически.

Это дает несколько преимуществ:

Однако 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 и т.д.

Советы и рекомендации по работе с иерархией кастомных типов

При построении сложных иерархий обращайте внимание на производительность. Запросы с рекурсией могут быть затратны, особенно если много уровней вложенности. В таких случаях стоит:

Для упрощения управления в админке можно использовать плагины, например, Clearfy Pro, который позволяет расширять возможности типов постов и их иерархий без лишнего кода.

Вывод

Создать иерархию кастомных типов постов с поддержкой REST API в WordPress — задача вполне решаемая и полезная для современных проектов. В статье рассмотрены основные шаги — регистрация типа с иерархией, программное создание дочерних элементов, расширение REST API и пример вывода дерева на фронтенде. Используйте представленные подходы и код для своих сайтов, чтобы удобно структурировать и интегрировать контент.

WooCommerce: автоматическое установление родительской категории при импорте складских файлов CSV
19.05.2026
Как создать и использовать иерархию пользователей в WordPress для управления доступом
15.12.2025
Как создать иерархию пользователей с поддержкой REST API в WordPress
05.04.2026
Как создать иерархию пользовательских ролей в WordPress для управления доступом
25.12.2025
WooCommerce: автоматическое установление родительской категории при импорте товаров
14.05.2026
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙