Как ограничить доступ к панели мониторинга только для администраторов?

19

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

Таким образом, администратор должен быть закрыт для всех, кроме администраторов.

Как это сделать?

Робин я рыцарь
источник
Вы имеете в виду, что есть пользовательские страницы, которые не требуют доступа к чему-либо по адресу yourdomain.com/wp-admin ?
curtismchale
Да, точно. Что-то не так с этим?
Робин, я рыцарь
Нету только разъяснения.
Curtismchale

Ответы:

19

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

Этот код при вставке в ваш файл functions.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()приведенный выше код ссылкой.

карите
источник
Этот ответ не соответствует требованиям вопроса. Во-первых, вы отключаете доступ к административной области для пользователя с возможностью «manage_options», и возможность может быть назначена нескольким ролям, а не только администратору. Кроме того, возможность manage_options может быть удалена от администратора.
cybmeta
Проверка @cybmeta на manage_optionsвозможность является приемлемым способом проверки для администратора. Даже Марк Jaquith говорит так
Шей
Спрашивающий спросил точно для проверки роли администратора, и я думаю, что важно дать ему точный ответ и объяснить, когда и почему проверка на возможности может быть лучше. Вы говорите manage_options, что делать могут только «администраторы», и это неправда, manage_optionsэто возможность, которую можно удалить из роли администратора или назначить другим ролям пользователя. Важно знать, что вы хотите сделать, и выбрать лучший путь. Смотри мой ответ, я объясняю это.
cybmeta
Вы, сэр, получите +1! :) Искал это часами! Также небольшое улучшение. Для одного сайта вашего чека достаточно. Для мульти-сайта вы хотели бы заменить manage_optionsс manage_network. Последний будет отключать панель мониторинга также для «администраторов сайта» по умолчанию, но оставит доступ доступным для супер администраторов (сетевых администраторов).
Ракет
Основная проблема с этим ответом заключается в том, что он конфликтует с вызовами 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();
      }

 }

Если вы хотите проверить, что пользователь имеет возможность «manage_options», вы можете. На самом деле, это лучший вариант в большинстве случаев. Хотя эта возможность по умолчанию связана с пользователями-администраторами, ее можно удалить из роли администратора или назначить другим ролям пользователей. Вот почему в большинстве случаев проверка того, что пользователь может или не может сделать, лучше проверки роли пользователя. Таким образом, в большинстве случаев проверка возможностей должна быть выбрана способом, но вы должны прояснить эту концепцию и выбрать лучший вариант для вашей ситуации и цели:

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

 }
cybmeta
источник
Это правильный ответ. Это не конфликтует с вызовами ajax.
RiotAct
3

Попробуйте подключить плагин Администрирование .
Вы можете запереть вещи довольно хорошо с этим.

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

goofydg1
источник
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);
Gabi
источник
4
'administrator'это не возможность. Это работает только для поддержания обратной совместимости. Проверьте наличие 'update_core'других возможностей администратора.
fuxia
Кроме того, функции могут быть назначены ролям, поэтому, если вы хотите разрешить доступ «администратору», вам следует проверять роли, а не возможности.
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»
Pierre
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 и установить его для всех, кроме администраторов.

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