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

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

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

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

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

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

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

Вы можете написать плагин и подключиться к хуку admin_init
.
Кодекс, кстати, содержит пример с нужной вам функциональностью.
http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_control

Некоторые из приведенных ответов могут подходить для большинства ситуаций, но я считаю, что ни один из них не гарантирует точного выполнения поставленной задачи, так как они проверяют возможности пользователей (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();
}
}

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

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

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

Добавьте эти строки в ваш 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 );

Попробуйте это - никогда не показывайте ошибки конечному пользователю. Это противоречит хорошему 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;
}
}

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