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

5 мар. 2011 г., 17:15:29
Просмотры: 27.7K
Голосов: 20

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

Поэтому административная панель должна быть недоступна для всех, кроме администраторов.

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

3
Комментарии

Ты имеешь в виду, что есть "публичные" пользовательские страницы, для доступа к которым не требуется заходить в админку по адресу http://yourdomain.com/wp-admin?

curtismchale curtismchale
5 мар. 2011 г. 17:37:34

Да, именно так. Разве с этим есть какие-то проблемы?

Robin I Knight Robin I Knight
5 мар. 2011 г. 17:42:54

Нет, просто уточняю.

curtismchale curtismchale
6 мар. 2011 г. 04:01:25
Все ответы на вопрос 8
6
21

Мы можем подключиться к действию 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( __( 'У вас нет доступа к этой части сайта' ) );
    }
}

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() в коде выше на нужную ссылку.

27 дек. 2012 г. 12:17:19
Комментарии

Этот ответ не соответствует требованиям вопроса. Во-первых, вы ограничиваете доступ к админке пользователю с возможностью "manage_options", а эта возможность может быть назначена нескольким ролям, не только администратору. Кроме того, возможность "manage_options" можно удалить у роли администратора.

cybmeta cybmeta
11 июн. 2014 г. 17:36:57

@cybmeta проверка возможности manage_options является общепринятым способом проверки пользователя на администратора. Даже Mark Jaquith так говорит

shea shea
12 июн. 2014 г. 01:26:00

Автор вопроса явно спрашивал про проверку роли администратора, и я считаю важным дать точный ответ и объяснить, когда и почему проверка возможности может быть лучше. Вы говорите, что manage_options — это то, что могут делать только "администраторы", но это не так. manage_options — это возможность, которую можно удалить у роли администратора или назначить другим ролям. Главное — понимать, что вы хотите сделать, и выбрать лучший способ. Смотрите мой ответ, я объясняю это.

cybmeta cybmeta
12 июн. 2014 г. 11:02:44

Сэр, вы заслуживаете +1! :) Искал это часами! Также небольшое улучшение. Для одиночного сайта вашей проверки достаточно. Для мультисайта лучше заменить manage_options на manage_network. Последнее отключит дашборд для обычных "администраторов сайта", но оставит доступ для Супер Администраторов (администраторов сети).

rkeet rkeet
20 авг. 2014 г. 14:57:33

Основная проблема этого ответа в том, что он конфликтует с ajax-запросами. У @cybmeta ниже приведен правильный ответ.

RiotAct RiotAct
17 апр. 2019 г. 23:04:19

@RiotAct Я почти уверен, что включил проверку на AJAX во втором примере, но вы правы - мне следовало использовать более надежный метод

shea shea
18 апр. 2019 г. 03:33:14
Показать остальные 1 комментариев
1

Вы можете написать плагин и подключиться к хуку admin_init.

Кодекс, кстати, содержит пример с нужной вам функциональностью.

http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_control

5 мар. 2011 г. 22:13:18
Комментарии

Это неполный ответ — он должен содержать больше, чем просто подсказку и ссылку

shea shea
8 янв. 2013 г. 06:37:41
1

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

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

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Разрешить AJAX-запросы
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Перенаправить на главную страницу, если пользователь не существует или у него нет роли "administrator"
           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 ) {
            //Разрешить AJAX-запросы
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Перенаправить на главную страницу, если у пользователя нет возможности "manage_options"
           wp_redirect( get_site_url( ) );
           exit();
      }

 }
27 мар. 2014 г. 11:57:06
Комментарии

Это правильный ответ. Он не конфликтует с ajax-запросами.

RiotAct RiotAct
17 апр. 2019 г. 23:04:42
1

Попробуйте плагин Adminimize.
С его помощью можно довольно хорошо ограничить доступ.

Также можно настроить доступ через файл htaccess

5 мар. 2011 г. 19:38:56
Комментарии

+1 за Adminimize. Это мощный плагин. В сочетании с каким-нибудь плагином для управления ролями он просто потрясающий. (Если позволите личное мнение) :::: В качестве последнего замечания: пожалуйста, предоставляйте больше информации, чем просто ссылки, это делает ответ более полным.

brasofilo brasofilo
20 окт. 2012 г. 08:02:45
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('Вам не разрешено получать доступ к этой части сайта'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
10 мая 2012 г. 16:21:30
Комментарии

'administrator' не является capability. Это работает только для поддержания обратной совместимости. Проверяйте 'update_core' или другие административные capabilities.

fuxia fuxia
10 мая 2012 г. 19:10:34

Также, capabilities могут быть назначены ролям, поэтому если вы хотите разрешить доступ пользователю "administrator", вам следует проверять роли, а не capabilities.

cybmeta cybmeta
11 июн. 2014 г. 17:47:11
1

Добавьте эти строки в ваш 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 );
27 дек. 2012 г. 08:55:36
Комментарии

как сказал @toscho, 'administrator' — это не capability, вместо этого используйте административные capabilities, такие как 'update_core'

Pierre Pierre
27 дек. 2012 г. 11:33:25
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;
}
}
11 июн. 2014 г. 17:07:17
1
-1

Я бы использовал WP Frontend и настроил его для всех, кроме администраторов.

6 мар. 2011 г. 07:21:15
Комментарии

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

shea shea
8 янв. 2013 г. 06:42:10