Перенаправление роли пользователя на конкретной странице

Вопрос или проблема

Я пытаюсь перенаправить роли пользователей на конкретную страницу. Если их роль сотрудник и они пытаются получить доступ к странице администрирования пользователей, их следует перенаправить. Не уверен, правильно ли я это делаю, так как это не работает. Пожалуйста, помогите.

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;
        }
    }
}

Объяснение кода

  1. Хук admin_init: Этот хук вызывается на странице админки перед загрузкой содержимого, что подходит для проверки ролей пользователей.

  2. Глобальная переменная $pagenow: Позволяет определить, на каком конкретно административном экране пользователь находится. В вашем случае мы смотрим, равен ли он users.php.

  3. Проверка ролей: Вместо функции current_user_can() используется in_array() для проверки роли "contributor". Это считается более надежным способом.

  4. Перенаправление: Если условия выполняются, выполняем перенаправление на нужную вам страницу с помощью wp_redirect() и завершаем выполнение скрипта с помощью exit, чтобы избежать дальнейшей обработки.

Дополнительные заметки

  • Безопасность Ajax: В случае, если у вас есть Ajax-запросы, можно добавить проверку на DOING_AJAX, чтобы избежать прерывания работы Ajax-скриптов. Это, конечно, зависит от вашей реализации, но может быть полезно.

  • Избегайте проблем с доступом: Проверка, осуществляется ли перенаправление только для администраторов, гарантирует, что пользователи не получат неожиданного поведения.

Применяя это решение, вы сможете эффективно управлять доступом пользователей с различными ролями к страницам администрирования WordPress, улучшая безопасность и удобство работы с вашей платформой.

Оцените материал
Добавить комментарий

Капча загружается...