В WordPress из коробки есть стандартная система ролей и прав доступа, но она довольно ограничена, если вам нужна более сложная иерархия пользователей с множеством уровней и гибким управлением разрешениями. В этой статье подробно разберём, как можно создать иерархию пользователей в WordPress, расширить стандартные возможности и на практике решить задачу разграничения доступа по уровням.
Почему стандартной системы ролей WordPress недостаточно
Стандартные роли (администратор, редактор, автор, подписчик и т.д.) покрывают базовые задачи, но часто в проектах требуется:
- Создать несколько уровней менеджеров с разными правами.
- Разграничить доступ к контенту или функционалу не по ролям, а по иерархии.
- Добавить кастомные роли с наследованием прав.
- Привязать пользователей к определённым подразделениям или структурам.
Для реализации таких требований нужно либо использовать плагины, либо писать собственный код, который расширит возможности WordPress.
Создание иерархии пользователей с помощью плагина WP User Frontend Pro
Один из удобных способов — использовать плагин WP User Frontend Pro, который позволяет создавать кастомные роли и управлять правами доступа на уровне фронтенда. Плагин поддерживает создание форм пользовательского профиля и назначение ролей динамически.
Пример настройки:
- Установите и активируйте WP User Frontend Pro.
- Создайте новые роли в меню «Пользователи» → «Роли».
- Настройте права для каждой роли, включая возможность создавать, редактировать и просматривать записи.
- Используйте условия для отображения контента в зависимости от роли.
Так вы получите гибкую систему, где каждый пользователь видит и может редактировать только те данные, которые ему разрешены.
Создание иерархии пользователей через кастомные метаполя и код
Если вы хотите более тонко контролировать иерархию, можно добавить кастомное метаполе для пользователя, которое будет хранить ID родительского пользователя. Таким образом формируется древовидная структура.
Пример добавления поля «Руководитель» в профиль пользователя:
function wphierarchy_add_user_hierarchy_field($user) {
$parent_id = get_user_meta($user->ID, 'wphierarchy_parent_user', true);
?>
<h3>Иерархия пользователей</h3>
<table class="form-table">
<tr>
<th><label for="wphierarchy_parent_user">Руководитель (ID)</label></th>
<td>
<input type="number" name="wphierarchy_parent_user" id="wphierarchy_parent_user" value="<?php echo esc_attr($parent_id); ?>" class="regular-text" />
<p class="description">Введите ID пользователя, который является руководителем данного пользователя.</p>
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wphierarchy_add_user_hierarchy_field');
add_action('edit_user_profile', 'wphierarchy_add_user_hierarchy_field');
function wphierarchy_save_user_hierarchy_field($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['wphierarchy_parent_user'])) {
update_user_meta($user_id, 'wphierarchy_parent_user', intval($_POST['wphierarchy_parent_user']));
}
}
add_action('personal_options_update', 'wphierarchy_save_user_hierarchy_field');
add_action('edit_user_profile_update', 'wphierarchy_save_user_hierarchy_field');Теперь вы можете в профиле пользователя указать ID его руководителя, формируя иерархическую структуру.
Функция получения подчинённых пользователя
Для работы с иерархией полезно уметь получать всех подчинённых пользователя — прямых и косвенных. Ниже пример функции для получения всех подчинённых по рекурсии:
function wphierarchy_get_subordinates($user_id) {
$subordinates = [];
$args = [
'meta_key' => 'wphierarchy_parent_user',
'meta_value' => $user_id,
'fields' => 'ID',
'number' => -1
];
$direct_subs = get_users($args);
foreach ($direct_subs as $sub_id) {
$subordinates[] = $sub_id;
$subordinates = array_merge($subordinates, wphierarchy_get_subordinates($sub_id));
}
return $subordinates;
}Эта функция возвращает массив ID всех пользователей, у которых в поле «Руководитель» указан текущий пользователь, включая всех на нижних уровнях.
Пример использования иерархии для ограничения доступа к контенту
Допустим, у вас есть каталог с записями, и вы хотите, чтобы пользователь видел только записи, созданные им и его подчинёнными.
Можно использовать следующий код, который фильтрует запросы на фронтенде и в админке:
function wphierarchy_restrict_posts_by_user_hierarchy($query) {
if (is_admin() && !$query->is_main_query()) {
return;
}
if (!is_user_logged_in()) {
return;
}
$current_user_id = get_current_user_id();
$allowed_users = wphierarchy_get_subordinates($current_user_id);
$allowed_users[] = $current_user_id;
$query->set('author', $allowed_users);
}
add_action('pre_get_posts', 'wphierarchy_restrict_posts_by_user_hierarchy');Такой подход позволит автоматически показывать пользователю только его записи и записи подчинённых, что удобно для организации внутреннего портала с многоуровневым доступом.
Интеграция с плагином Clearfy Pro для оптимизации и безопасности
Если вы используете Clearfy Pro, его инструменты помогут оптимизировать работу сайта с кастомными ролями и метаполями, обеспечив безопасность и ускорение загрузки. Например, можно отключить ненужные роли, заблокировать доступ к REST API для определённых пользователей и др.
Советы по безопасности и производительности
- Всегда проверяйте права пользователя при сохранении и отображении кастомных полей.
- Для больших сайтов используйте кэширование результатов функции получения подчинённых, чтобы не создавать лишние запросы к базе.
- Регулярно проверяйте, что роли и права не конфликтуют с другими плагинами.
Выводы и рекомендации
Создание иерархии пользователей в WordPress — задача, требующая как понимания внутренней модели ролей WordPress, так и навыков PHP-программирования. Использование кастомных метаполей для хранения родительских связей и рекурсивных функций для получения подчинённых — универсальный и расширяемый метод.
Для проектов, где нужна тонкая настройка ролей и прав, рекомендуем комбинировать программные решения и мощные плагины, такие как WP User Frontend Pro и Clearfy Pro. Это позволит добиться максимальной гибкости и безопасности.