Как перенаправить не-администраторов на главную страницу при попытке доступа к mysite.com/wp-admin/?

12 мар. 2013 г., 16:45:36
Просмотры: 16.5K
Голосов: 3

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

0
Все ответы на вопрос 5
1

Я использую этот код уже некоторое время, думаю он изначально был в плагине под названием 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);
12 мар. 2013 г. 22:57:57
Комментарии

Это не тот способ, которым это должно быть сделано, но +1 за рассмотрение файла admin-ajax.php.

kaiser kaiser
13 мар. 2013 г. 13:00:13
1

Одно важное дополнение: ВСЕГДА проверяйте, есть ли авторизованный пользователь, иначе вы можете заблокировать доступ к защищенным элементам на экране входа:

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' );

Большое спасибо за предоставленное решение :-)

11 мар. 2016 г. 19:01:43
Комментарии

Идеальный ответ!

WhiteHorse WhiteHorse
5 дек. 2018 г. 15:33:16
3

Вот две вещи, которые вам нужно проверить:

  • Находится ли пользователь в интерфейсе администратора
  • Имеет ли он необходимые права

Поскольку мы используем хук 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 ) );
}
12 мар. 2013 г. 23:33:28
Комментарии

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

birgire birgire
9 мая 2017 г. 11:56:07

@birgire Понятия не имею... этому ответу уже 4 года :)

kaiser kaiser
9 мая 2017 г. 15:10:00

хе-хе, я обычно не помню, что ел на ужин 2 дня назад, так что полностью понимаю ;-)

birgire birgire
9 мая 2017 г. 15:16:38
1

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

В итоге я удалил виджеты в админ-панели и частично решил свою проблему.

Я добавил это в 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');
13 мар. 2013 г. 12:47:59
Комментарии

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

kaiser kaiser
13 мар. 2013 г. 13:02:15
0

Я знаю, что это уже старый вопрос, но вы можете взглянуть.

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-запросов администратора на фронтенде.

10 мар. 2015 г. 08:17:54