В современных проектах на WordPress часто возникает необходимость создавать и управлять иерархической структурой пользователей — например, для отделов компании, уровней менеджмента или команд. В этой статье мы рассмотрим, как создать динамическую иерархию пользователей в WordPress с поддержкой REST API, чтобы можно было эффективно получать, обновлять и отображать данные на фронтенде через AJAX или SPA-приложения.
Почему нужна динамическая иерархия пользователей в WordPress
Стандартный WordPress не предоставляет встроенных средств для создания иерархии между пользователями. Однако во многих бизнес-процессах важно знать, кто чей руководитель, кто подчинённый, чтобы реализовать разграничение доступа, формировать отчёты и строить коммуникационные цепочки.
Динамическая иерархия позволяет:
- Автоматически строить дерево пользователей с привязкой к ролям и метаданным.
- Использовать REST API для гибкого взаимодействия с данными без перезагрузки страниц.
- Обеспечить масштабируемость и удобство управления через интерфейсы и программно.
Рассмотрим поэтапно, как это реализовать.
Создание пользовательского метаполя для связи "руководитель-подчинённый"
Для хранения иерархии добавим пользовательское метаполе, в котором будет храниться 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 для расширенного контроля доступа и оптимизации.