Как перенаправить не-администраторов на главную страницу при попытке доступа к mysite.com/wp-admin/?
Я хочу, чтобы все мои пользователи (включая участников и авторов), кроме администратора, перенаправлялись на главную страницу при попытке доступа к mysite.com/wp-admin/. Участники и авторы должны сохранить возможность добавлять и редактировать посты как обычно, остальные должны быть перенаправлены... Я уже удалил ссылку на админку... Также пробовал несколько плагинов, но наиболее близкий (Remove Dashboard Access) перенаправляет на главную страницу, но при этом запрещает участникам и авторам добавлять, редактировать и удалять посты. Спасибо!

Я использую этот код уже некоторое время, думаю он изначально был в плагине под названием wp block admin, но этот код работает. Вам просто нужно изменить требуемые права доступа, чтобы он делал то, что вам нужно. Посмотрите это.
// Требуемый уровень прав
$required_capability = 'edit_others_posts';
// Куда перенаправлять
$redirect_to = '';
function no_admin_init() {
// Нам нужны переменные конфигурации внутри функции
global $required_capability, $redirect_to;
// Это интерфейс админки?
if (
// Проверяем наличие /wp-admin/ в URL
stripos($_SERVER['REQUEST_URI'],'/wp-admin/') !== false
&&
// Разрешаем вызовы async-upload.php
stripos($_SERVER['REQUEST_URI'],'async-upload.php') == false
&&
// Разрешаем вызовы admin-ajax.php
stripos($_SERVER['REQUEST_URI'],'admin-ajax.php') == false
) {
// У текущего пользователя недостаточно прав?
if (!current_user_can($required_capability)) {
// Если не указано куда перенаправлять - на главную
if ($redirect_to == '') { $redirect_to = get_option('home'); }
// Делаем временное перенаправление (302)
wp_redirect($redirect_to,302);
}
}
}
// Добавляем действие с максимальным приоритетом
add_action('init','no_admin_init',0);

Одно важное дополнение: ВСЕГДА проверяйте, есть ли авторизованный пользователь, иначе вы можете заблокировать доступ к защищенным элементам на экране входа:
function redirect_non_admin_user(){
if ( is_user_logged_in() ) {
if ( !defined( 'DOING_AJAX' ) && !current_user_can('administrator') ){
wp_redirect( site_url() ); exit;
}
}
}
add_action( 'admin_init', 'redirect_non_admin_user' );
Большое спасибо за предоставленное решение :-)

Вот две вещи, которые вам нужно проверить:
- Находится ли пользователь в интерфейсе администратора
- Имеет ли он необходимые права
Поскольку мы используем хук template_redirect
, нам не нужно проверять страницы входа, регистрации или сброса пароля — перенаправление произойдет незаметно для пользователя.
Вот реализация этой идеи в виде небольшого (mu-)плагина.
<?php
/**
* Plugin Name: (#90535) Перенаправление пользователей без прав администратора на главную страницу.
* Description: Проверяет, находимся ли мы в админке и есть ли у пользователя права администратора 'manage_options'
* Version: 2013.03.12
* Author: Franz Josef Kaiser
*/
add_action( 'template_redirect', 'wpse90535_admin_denied' );
function wpse90535_admin_denied()
{
is_admin()
&& ! current_user_can( 'manage_options' )
and exit( wp_redirect( home_url(), 302 ) );
}

Не совсем уверен, что именно искал автор вопроса, но теперь мне интересно, когда is_admin()
возвращает true внутри хука template_redirect
? (Возможно, просто слишком раннее утро, чтобы это понять ;-)

К сожалению, ни один из вышеприведенных кодов не сработал для меня, так как они просто перенаправляли пользователей без прав администратора на главную страницу, даже если я хотел, чтобы авторы и участники могли добавлять/редактировать и удалять свои записи...
В итоге я удалил виджеты в админ-панели и частично решил свою проблему.
Я добавил это в functions.php
function disable_default_dashboard_widgets() {
remove_meta_box('dashboard_right_now', 'dashboard', 'core');
remove_meta_box('dashboard_recent_comments', 'dashboard', 'core');
remove_meta_box('dashboard_incoming_links', 'dashboard', 'core');
remove_meta_box('dashboard_plugins', 'dashboard', 'core');
remove_meta_box('dashboard_quick_press', 'dashboard', 'core');
remove_meta_box('dashboard_recent_drafts', 'dashboard', 'core');
remove_meta_box('dashboard_primary', 'dashboard', 'core');
remove_meta_box('dashboard_secondary', 'dashboard', 'core');
}
add_action('admin_menu', 'disable_default_dashboard_widgets');

Ох, кажется, мы оба неправильно поняли ваш вопрос... Возьмите наши ответы, измените их и попробуйте снова. Или сделайте ваш вопрос более ясным, указав: A) куда должно происходить перенаправление при входе/регистрации/смене пароля и B) на какую именно страницу пользователь должен получить доступ, а на какую — нет.

Я знаю, что это уже старый вопрос, но вы можете взглянуть.
function redirect_non_admin_user(){
if ( !defined( 'DOING_AJAX' ) && !current_user_can('administrator') ){
wp_redirect( site_url() ); exit;
}
}
add_action( 'admin_init', 'redirect_non_admin_user' );
Эта проверка очень ВАЖНА "!defined( 'DOING_AJAX' )" при использовании AJAX-запросов администратора на фронтенде.
