Динамическая иерархия пользователей WordPress с поддержкой REST API

|

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

Почему нужна динамическая иерархия пользователей в WordPress

Стандартный WordPress не предоставляет встроенных средств для создания иерархии между пользователями. Однако во многих бизнес-процессах важно знать, кто чей руководитель, кто подчинённый, чтобы реализовать разграничение доступа, формировать отчёты и строить коммуникационные цепочки.

Динамическая иерархия позволяет:

Рассмотрим поэтапно, как это реализовать.

Создание пользовательского метаполя для связи "руководитель-подчинённый"

Для хранения иерархии добавим пользовательское метаполе, в котором будет храниться ID руководителя для каждого пользователя. Это позволит строить дерево и запрашивать подчинённых.

Добавим поле в профиль пользователя через хук show_user_profile и edit_user_profile:

function wphierarchy_add_manager_field( $user ) {
    $manager_id = get_user_meta( $user->ID, 'wphierarchy_manager_id', true );
    ?>
    <h3>Информация об иерархии</h3>
    <table class="form-table">
        <tr>
            <th><label for="wphierarchy_manager_id">Руководитель (ID пользователя)</label></th>
            <td>
                <input type="number" name="wphierarchy_manager_id" id="wphierarchy_manager_id" value="<?php echo esc_attr( $manager_id ); ?>" class="regular-text" />
                <p class="description">Введите ID пользователя, который является руководителем.</p>
            </td>
        </tr>
    </table>
    <?php
}
add_action( 'show_user_profile', 'wphierarchy_add_manager_field' );
add_action( 'edit_user_profile', 'wphierarchy_add_manager_field' );

Сохраним значение при обновлении профиля:

function wphierarchy_save_manager_field( $user_id ) {
    if ( !current_user_can( 'edit_user', $user_id ) ) {
        return false;
    }
    if ( isset( $_POST['wphierarchy_manager_id'] ) ) {
        update_user_meta( $user_id, 'wphierarchy_manager_id', intval( $_POST['wphierarchy_manager_id'] ) );
    }
}
add_action( 'personal_options_update', 'wphierarchy_save_manager_field' );
add_action( 'edit_user_profile_update', 'wphierarchy_save_manager_field' );

Создание REST API эндпоинтов для иерархии пользователей

Теперь сделаем REST API маршруты для получения иерархии, а также для обновления руководителя.

Регистрация маршрутов REST API

function wphierarchy_register_rest_routes() {
    register_rest_route( 'wphierarchy/v1', '/users-hierarchy', array(
        'methods' => 'GET',
        'callback' => 'wphierarchy_get_users_hierarchy',
        'permission_callback' => function() { return current_user_can( 'list_users' ); },
    ) );

    register_rest_route( 'wphierarchy/v1', '/user/(?P<id>\d+)/manager', array(
        'methods' => 'POST',
        'callback' => 'wphierarchy_set_user_manager',
        'permission_callback' => function() { return current_user_can( 'edit_users' ); },
        'args' => array(
            'id' => array(
                'required' => true,
                'validate_callback' => 'is_numeric',
            ),
        ),
    ) );
}
add_action( 'rest_api_init', 'wphierarchy_register_rest_routes' );

Обработка запроса получения иерархии

Функция собирает пользователей и строит дерево по полю wphierarchy_manager_id.

function wphierarchy_get_users_hierarchy( WP_REST_Request $request ) {
    $args = array(
        'fields' => array('ID', 'display_name'),
        'number' => -1,
    );
    $users = get_users( $args );
    $by_id = array();
    foreach ( $users as $user ) {
        $by_id[$user->ID] = array(
            'id' => $user->ID,
            'name' => $user->display_name,
            'children' => array(),
            'manager' => intval( get_user_meta( $user->ID, 'wphierarchy_manager_id', true ) ),
        );
    }

    // Строим дерево
    $tree = array();
    foreach ( $by_id as $id => &$user ) {
        if ( $user['manager'] && isset( $by_id[$user['manager']] ) ) {
            $by_id[$user['manager']]['children'][] = &$user;
        } else {
            $tree[] = &$user;
        }
    }

    return $tree;
}

Обработка установки руководителя пользователя

function wphierarchy_set_user_manager( WP_REST_Request $request ) {
    $user_id = intval( $request['id'] );
    $params = $request->get_json_params();
    $manager_id = isset( $params['manager_id'] ) ? intval( $params['manager_id'] ) : 0;

    if ( $manager_id !== 0 && !get_user_by( 'ID', $manager_id ) ) {
        return new WP_Error( 'invalid_manager', 'Руководитель не найден', array( 'status' => 400 ) );
    }

    update_user_meta( $user_id, 'wphierarchy_manager_id', $manager_id );

    return array( 'success' => true );
}

Вывод иерархии на фронтенде через AJAX

Для удобства отображения используем JavaScript и AJAX-запрос к REST API, чтобы динамически построить дерево иерархии.

Пример простого вывода с рекурсивной функцией:

function wphierarchy_render_tree(users) {
    let html = '<ul>';
    users.forEach(user => {
        html += `<li>${user.name}`;
        if (user.children.length > 0) {
            html += wphierarchy_render_tree(user.children);
        }
        html += '</li>';
    });
    html += '</ul>';
    return html;
}

fetch('/wp-json/wphierarchy/v1/users-hierarchy')
    .then(response => response.json())
    .then(data => {
        document.getElementById('wphierarchy-container').innerHTML = wphierarchy_render_tree(data);
    });

В админке можно добавить подобный вывод для удобного контроля иерархии.

Советы по улучшению и безопасности

1. Проверяйте права доступа в REST API, чтобы предотвратить утечку данных.

2. Добавьте валидацию входных данных при сохранении метаполя.

3. Для оптимизации запросов используйте кэширование дерева пользователей.

4. При большом количестве пользователей можно реализовать пагинацию или подгрузку по уровням.

5. Можно интегрировать с плагинами управления ролями и доступом, например, Clearfy Pro, чтобы расширить возможности по разграничению.

Заключение

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

Если хотите расширить функционал, посмотрите плагины на WPShop.ru, например, Clearfy Pro для расширенного контроля доступа и оптимизации.

Создаем динамическую иерархию страниц в WordPress с помощью кода и плагинов
12.12.2025
Создать пирамиду категорий в WordPress с помощью кода
21.01.2026
Автоматическое создание иерархии контента в WordPress с помощью WPRemark
01.03.2026
Как сделать иерархию записей с поддержкой разных типов постов в WordPress
05.02.2026
Как создать иерархию категорий с переходами в WordPress
29.12.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее