Вопрос или проблема
Я пытаюсь перенаправить роли пользователей на конкретную страницу. Если их роль сотрудник и они пытаются получить доступ к странице администрирования пользователей, их следует перенаправить. Не уверен, правильно ли я это делаю, так как это не работает. Пожалуйста, помогите.
function mwd_redirect_if_on_page() {
$mwd_current_user = wp_get_current_user();
if ( user_can( $mwd_current_user, 'contributor') && is_page('wp-admin/users.php') ) {
return home_url('specific-page');
}
}
add_filter( 'login_redirect', 'mwd_redirect_if_on_page' );
Вы можете достигнуть своей цели таким образом:
// Блокировать доступ к /wp-admin
function mwd_redirect_if_on_page() {
if ( is_user_logged_in() && is_admin() && current_user_can( 'contributor' ) && (defined( 'DOING_AJAX' ) && !DOING_AJAX) ) ) {
wp_redirect( home_url('specific-page') );
exit;
}
}
add_action( 'init', 'mwd_redirect_if_on_page' );
Если вы внимательно посмотрите, я добавил проверку ajax. Таким образом, сотрудник не сможет получить доступ к wp-admin
, но тем не менее сможет выполнять другие ajax-запросы, если они есть.
Это is_page('wp-admin/users.php')
не сработает, потому что is_page()
предназначена только для записей типа page
, и функция использует основной вызов WP_Query
(который выполняется при загрузке страницы), что не происходит на странице users.php
.
Но вы можете использовать глобальную переменную $pagenow
, чтобы проверить, является ли текущая страница администрирования users.php
.
Вот пример с использованием admin_init
хука:
add_action( 'admin_init', 'wpse_385245_1' );
function wpse_385245_1() {
global $pagenow;
if ( 'users.php' === $pagenow &&
in_array( 'contributor', wp_get_current_user()->roles ) ) {
wp_redirect( home_url( 'specific-page' ) );
exit;
}
}
Или вы можете вместо этого использовать load-users.php
хук, который срабатывает при загрузке страницы users.php
, таким образом, вам больше не нужно будет проверять значение $pagenow
:
add_action( 'load-users.php', 'wpse_385245_2' );
function wpse_385245_2() {
if ( in_array( 'contributor', wp_get_current_user()->roles ) ) {
wp_redirect( home_url( 'specific-page' ) );
exit;
}
}
Тем не менее, этот хук срабатывает только после admin_init
и других хуков, поэтому, если вы не хотите “ждать” завершения этих дополнительных хуков, то просто используйте admin_init
.
Заметки:
-
$pagenow
— это глобальная переменная только для админской части. -
Я не использовал
current_user_can( 'contributor' )
, потому что документация гласит: “Хотя проверка по конкретным ролям вместо возможностей частично поддерживается, такая практика не рекомендуется, так как может привести к ненадежным результатам.“. Это также относится к функцииuser_can()
.
Ответ или решение
Перенаправление пользователей по ролям на определенную страницу в WordPress
Вам необходимо настроить перенаправление пользователей с ролью "конtributor" при попытке доступа к странице администрирования пользователей. Рассмотрим, как это можно корректно реализовать с помощью функционала WordPress.
Проблема
Вы использовали функцию is_page()
, чтобы проверять, является ли текущая страница именно страницей администрирования пользователей (wp-admin/users.php
). Однако эта функция предназначена для проверки страниц типа post
, а не для страниц админ-панели, что и стало причиной возникновения проблемы.
Решение
Чтобы корректно выполнить перенаправление пользователей с ролью "конtributor", нужно использовать глобальную переменную $pagenow
, которая позволяет вам узнать, на какой странице админ-панели сейчас находятся пользователи. Таким образом, будет удобно определить, когда необходимо произвести перенаправление.
Вот рекомендованный способ реализации:
add_action('admin_init', 'wpse_redirect_contributor_users');
function wpse_redirect_contributor_users() {
global $pagenow;
// Проверяем, что пользователь залогинен и является 'contributor'
if (is_user_logged_in() && in_array('contributor', wp_get_current_user()->roles)) {
// Проверяем, что мы на странице 'users.php'
if ($pagenow === 'users.php') {
// Перенаправляем пользователя на конкретную страницу
wp_redirect(home_url('specific-page'));
exit;
}
}
}
Объяснение кода
-
Хук
admin_init
: Этот хук вызывается на странице админки перед загрузкой содержимого, что подходит для проверки ролей пользователей. -
Глобальная переменная
$pagenow
: Позволяет определить, на каком конкретно административном экране пользователь находится. В вашем случае мы смотрим, равен ли онusers.php
. -
Проверка ролей: Вместо функции
current_user_can()
используетсяin_array()
для проверки роли "contributor". Это считается более надежным способом. -
Перенаправление: Если условия выполняются, выполняем перенаправление на нужную вам страницу с помощью
wp_redirect()
и завершаем выполнение скрипта с помощьюexit
, чтобы избежать дальнейшей обработки.
Дополнительные заметки
-
Безопасность Ajax: В случае, если у вас есть Ajax-запросы, можно добавить проверку на
DOING_AJAX
, чтобы избежать прерывания работы Ajax-скриптов. Это, конечно, зависит от вашей реализации, но может быть полезно. -
Избегайте проблем с доступом: Проверка, осуществляется ли перенаправление только для администраторов, гарантирует, что пользователи не получат неожиданного поведения.
Применяя это решение, вы сможете эффективно управлять доступом пользователей с различными ролями к страницам администрирования WordPress, улучшая безопасность и удобство работы с вашей платформой.