Вопрос или проблема
Мне нужно предотвратить доступ некоторых пользователей к странице редактирования профиля (user-edit.php
) других пользователей. Сценарий касается разных сотрудников HR, которые могут видеть/редактировать данные некоторых работников, но не всех.
Я попробовал использовать хуки edit_user_profile
и show_user_profile
с использованием wp_die
для предотвращения доступа. Но это работает после отображения информации пользователя и только удаляет кнопку обновления пользователя со страницы.
Я проверил другие хуки, содержащие ключевое слово “профиль”, но безуспешно.
Существует ли хук для этой цели?
Одно из решений, которое приходит на ум — использовать хук init
, проверить, находимся ли мы на странице редактирования профиля, и применить там логику, но это кажется мне немного “грязным” решением.
Я реализовал свое “грязное” решение следующим образом. Если есть лучшее или более чистое решение, не стесняйтесь предложить его:
function stop_access_profile()
{
global $pagenow;
if ($pagenow != 'user-edit.php') {
return;
}
$user_id = get_current_user_id();
$profile_id = intval($_GET['user_id']);
// Некоторая реализация логики для определения, может ли текущий пользователь видеть текущий профиль
// Опущено, так как это не имеет значения
if (!$can_see_profile) {
$profile = get_user_name($profile_id);
wp_die("Вам не разрешено просматривать или редактировать профиль {$profile}.");
}
}
add_action('admin_init', 'stop_access_profile');
Ответ или решение
Для предотвращения ситуации, когда определенные пользователи могут редактировать профили других пользователей в WordPress, необходимо тщательно продумать и реализовать политику доступа на основе ролей и способностей (capabilities). В WordPress предусмотрена гибкая система управления ролями, что позволяет задавать различные уровни доступа к административным страницам и функционалу.
Теория (Theory):
Основная задача, с которой вы столкнулись, заключается в ограничении доступа к странице редактирования профиля пользователя (user-edit.php
) для определенной категории пользователей. В WordPress доступ к административным действиям регулируется через роли и способности. Роли объединяют несколько способностей, которые позволяют выполнять те или иные действия. Например, роль "Редактор" может редактировать посты, но не имеет право изменять настройки сайта.
Каждый пользователь на сайте может иметь одну или несколько ролей, и каждая роль присваивается определенному уровню полномочий через способности. Если пользователь авторизован в WordPress админ-панели, у него есть связанные с его ролью способности, которые определяют, какие страницы он может видеть и что он может делать.
Пример (Example):
Рассмотрим следующий сценарий: у вас есть ролевая модель, в которой HR-менеджеры могут изменять информацию только о тех сотрудниках, которые закреплены за ними. Например, HR может быть привязан к определенной группе сотрудников, и только с ними он может взаимодействовать на уровне редактирования профилей.
Ваш текущий подход, который основан на использовании действия admin_init
и глобальной проверки условия показывает верный путь, но требует доработки, чтобы не только предотвращать доступ, но и централизованно управлять проверками.
Применение (Application):
-
Создание пользовательской способности:
Для начала необходимо создать пользовательскую способность, например,edit_specific_user_profile
, и присвоить ее роли, под которую подпадают ваши HR-менеджеры. Это можно сделать с помощью плагинов для управления ролями или вручную через программное добавление способностей в functions.php.add_action('init', function() { $role = get_role('hr_manager'); // Предположим, у вас уже есть эта роль $role->add_cap('edit_specific_user_profile', true); });
-
Реализация проверки способностей:
После того как способность добавлена, вы можете реализовать проверку уровня доступа на основе этой способности в функцииstop_access_profile
.function stop_access_profile() { global $pagenow; if ($pagenow != 'user-edit.php') { return; } $current_user_id = get_current_user_id(); $profile_id = intval($_GET['user_id']); // Логика определения принадлежности $can_see_profile = current_user_can('edit_specific_user_profile') && is_user_allowed($current_user_id, $profile_id); if (!$can_see_profile) { $profile = get_user_name($profile_id); wp_die("У вас нет доступа к просмотру или редактированию профиля {$profile}."); } } add_action('admin_init', 'stop_access_profile'); function is_user_allowed($current_user_id, $profile_id) { // Ваша логика проверки принадлежности сотрудника HR-менеджеру return true; // Примерное возвращаемое значение }
-
Оптимизация опыта пользователя:
Чтобы предотвратить неоднозначности и повышенное внимание в админ-панели, желательно скрыть или заменить ссылки на редактирование профилей, которые пользователь не может видеть или изменять. Это можно сделать при помощи фильтрации вывода меню или ссылок.add_action('admin_menu', 'remove_unnecessary_user_edit_links'); function remove_unnecessary_user_edit_links() { global $menu; // Если требуется, здесь можно модифицировать элементы меню для пользователей }
Этот подход более структурирован и поддерживаем, так как всего через одну единственную capability
вы можете настроить различные уровни доступа. Кроме того, такая система легко масштабируется для дальнейших расширений доступа.