Як обмежити доступ до інформаційної панелі лише до адміністраторів?


19

Як ми обмежимо доступ до адміністративної зони WP всім користувачам, крім адміністраторів?
Користувачі на нашому сайті мають власні сторінки профілю, які виконують усі необхідні їм функції.

Таким чином, адміністратор має бути вимкнено для всіх, крім адміністраторів.

Як це зробити?


Ви маєте на увазі, що на сторінках користувачів, які не мають доступу, не потрібно отримувати доступ ні до чого, що знаходиться на yourdomain.com/wp-admin ?
curtismchale

Так саме. Чи з цим щось не так?
Робін І лицар

Нія просто уточнююча.
курсизм

Відповіді:


19

Ми можемо підключитись до admin_initдії та перевірити, чи є користувач адміністратором, скориставшись current_user_can()функцією, щоб перевірити, чи може поточний користувач manage_options, що може зробити лише адміністратор.

Цей код, вставлений у файл function.php, відображатиме повідомлення, коли не адміністратор намагається отримати доступ до інформаційної панелі:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Якщо ви хочете, ви можете забезпечити кращу роботу користувачів, переадресувавши його на головну сторінку замість цього:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() );
        exit;
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Якщо ви хочете перенаправити користувача на його сторінку профілю, замініть home_url()в коді вище посилання.


Ця відповідь не відповідає вимогам запитання. По-перше, ви вимикаєте доступ до адміністративної області для користувача з можливістю "management_options", а можливість може бути призначена для декількох ролей, не тільки для адміністратора. Крім того, у адміністратора може бути видалена можливість "управляти_опціями".
cybmeta

Перевірка @cybmeta на manage_optionsздатність - це прийнятий спосіб перевірки для користувача адміністратора. Навіть Марк Jaquith говорить так
Шей

Запитуючий запитав саме про те, щоб перевірити роль адміністратора, і я вважаю, що важливо дати йому точну відповідь і пояснити, коли і чому перевірка на здатність може бути кращою. Ви кажете, manage_optionsце лише те, що можуть робити лише "адміністратори", а це неправда, manage_optionsце здатність і може бути видалена з ролі адміністратора або призначена іншим ролям користувача. Важливо - знати, що ви хочете зробити, і вибрати найкращий шлях. Дивіться мою відповідь, я пояснюю це.
cybmeta

Ви, сер, отримайте +1! :) Шукали цього годинами! Також невелике поліпшення. Одного сайту вашого чека достатньо. Для мульти-сайту ви хотіли б замінити manage_optionsз manage_network. Останній відключить приладну панель також для "адміністраторів сайтів" за замовчуванням, але залишить доступ доступним для супер адміністраторів (мережеві адміністратори).
rkeet

Основне питання з цією відповіддю полягає в тому, що вона стикається з викликами ajax. @cybmeta має правильну відповідь нижче.
RiotAct


9

Деякі з наведених відповідей можуть бути прекрасними в більшості ситуацій, але я думаю, що жоден з них не гарантує виконання саме того, що задається, оскільки жодна з відповідей не перевіряє ролі користувачів, вони перевіряють можливості та можливості, можуть бути призначені та видалені з ролей форми. Отже, щоб дати точну відповідь, потрібно перевірити ролі користувача, а не можливості:

add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Якщо ви хочете перевірити, чи є у користувача можливість "керувати_операціями", ви можете. Насправді це найкращий варіант у більшості випадків. Хоча ця можливість за замовчуванням пов’язана з адміністраторами, вона може бути видалена з ролі адміністратора або ж вона може бути призначена іншим ролям користувача. Ось чому в більшості випадків перевірка того, що користувач може чи не може зробити, краще, ніж перевірка ролі користувача. Отже, у більшості випадків перевірка можливостей повинна бути обраним способом, але ви маєте зрозуміти цю концепцію та вибрати найкращий варіант для вашої ситуації та мети:

add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Це правильна відповідь. Це не стикається з дзвінками Ajax.
RiotAct

3

Спробуйте Adminimize плагін.
З цим можна досить добре зафіксувати речі.

Ви також можете спробувати налаштувати доступ через файл htaccess


1
+1 для адмінімізації. Ось звір плагіна. У поєднанні з плагіном спеціального менеджера ролей, він просто гойдається. (Якщо я виправдаю особисту думку) :::: Як остання примітка: будь ласка, дайте більше інформації, ніж лише посилання, це зробить відповідь більш повним.
brasofilo

2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);

4
'administrator'не є можливостями. Це працює просто для підтримки зворотної сумісності. Перевірте наявність 'update_core'чи інших можливостей адміністратора.
фуксія

Крім того, функції можуть бути призначені ролям, тому, якщо ви хочете дозволити доступ до "адміністратора" користувача, вам слід перевірити ролі, а не можливості.
cybmeta

0

Покладіть ці рядки у своє functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );

3
як @toscho сказав, що "адміністратор" - це не можливість, натомість використовуйте можливості адміністратора, такі як "update_core"
П'єр

0

Спробуйте це, ніколи не через помилки, з якими стикається кінцевий користувач. Проти хорошого UX. Цей код перенаправляє їх до головного.

    add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}

-1

Я б використав WP Frontend і встановив його для всіх, хто очікує адміністраторів.


Будь ласка, надайте більше інформації, а потім посилання - відповідь буде більш повною
she
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.