Удаление доступа к определенным меню администратора

26 апр. 2014 г., 16:12:06
Просмотры: 22.5K
Голосов: 3

Я пытаюсь удалить некоторые функции администратора для пользователя с ролью contributor. Под удалением функций администратора я подразумеваю скрытие определенных пунктов меню администратора, таких как комментарии, инструменты, медиафайлы и т.д. Мне удалось удалить нужные элементы из меню администратора, используя этот код:

function remove_menus(){

$author = wp_get_current_user();
if(isset($author->roles[0])){ 
    $current_role = $author->roles[0];
}else{
    $current_role = 'no_role';
}

if($current_role == 'contributor'){  
  remove_menu_page( 'index.php' );                  //Консоль
  remove_menu_page( 'edit.php' );                   //Записи
  remove_menu_page( 'upload.php' );                 //Медиафайлы
  remove_menu_page( 'tools.php' );                  //Инструменты
  remove_menu_page( 'edit-comments.php' );          //Комментарии

}

}
add_action( 'admin_menu', 'remove_menus' );

Это работает отлично. Проблема, с которой я столкнулся, заключается в том, что я могу просто вручную добавить строку запроса в URL, например /wp-admin/edit.php, и это перенаправит меня на экран редактирования записей. Кто-нибудь знает способ полностью ограничить доступ к этим страницам, а не только скрыть их из меню администратора?

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

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

s_ha_dum s_ha_dum
26 апр. 2014 г. 18:09:06

Я хочу, чтобы пользователь мог редактировать свой профиль и управлять своими записями произвольного типа. Не думаю, что мне нужна пользовательская роль, так как роль участника уже делает то, что мне нужно. Мне просто нужно запретить доступ к определенным страницам в админке. Если я создам пользовательскую роль и дам им возможность управлять своими записями, разве не возникнет та же проблема?

RoseCoder RoseCoder
26 апр. 2014 г. 19:45:08

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

MOSD MOSD
1 февр. 2021 г. 17:26:42

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

Tom J Nowell Tom J Nowell
1 февр. 2021 г. 18:03:29
Все ответы на вопрос 4
1

В итоге я разобрался, и вот код, который я использовал:

function restrict_menus() {
    $author = wp_get_current_user();

    if( isset( $author->roles[0] ) ) { 
        $current_role = $author->roles[0];
    } else {
        $current_role = 'no_role';
    }

    if( 'contributor' == $current_role ) {  
        $screen = get_current_screen();
        $base   = $screen->id;

        if( 'edit-post' == $base || 'upload' == $base || 'tools' == $base || 'edit-comments' == $base ) {
            wp_die( 'Не жульничай, а?' );
        }
    }
}
add_action( 'current_screen', 'restrict_menus' );
26 апр. 2014 г. 20:55:21
Комментарии

это было очень полезно, спасибо, что поделились своим решением

Snowball Snowball
14 апр. 2016 г. 09:16:26
0

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

Поскольку вы хотите ограничить роль contributor, вы можете использовать возможности ролей. Участники (contributors) не могут публиковать записи, поэтому вы можете сделать следующее.

Часть 1: Удаление элементов из меню админки

add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {

    // ничего не делаем, если пользователь может публиковать записи
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // удаляем эти элементы из меню админки
    remove_menu_page( 'edit.php' );          // Записи
    remove_menu_page( 'upload.php' );        // Медиафайлы
    remove_menu_page( 'tools.php' );         // Инструменты
    remove_menu_page( 'edit-comments.php' ); // Комментарии

}

Однако, как вы правильно заметили, это не мешает пользователю ввести прямой URL страницы. Вот как я реализовал ограничение доступа к страницам:

Часть 2: Ограничение доступа к страницам админки

add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {

    // ничего не делаем, если пользователь может публиковать записи
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // получаем ID текущей страницы
    $current_screen_id = get_current_screen()->id;

    // определяем, какие экраны запрещены
    $restricted_screens = array(
        'edit',
        'upload',
        'tools',
        'edit-comments',
    );

    // Ограничиваем доступ к страницам
    foreach ( $restricted_screens as $restricted_screen ) {

        // сравниваем ID текущего экрана с каждым запрещенным
        if ( $current_screen_id === $restricted_screen ) {
            wp_die( __( 'Вам не разрешено доступ к этой странице.', 'tcd' ) );
        }

    }

}

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

Удачи.

16 мар. 2017 г. 00:21:47
0

Обычно я использую (и рекомендую) плагин Members. Его интерфейс очень прост в использовании, и у вас есть дополнительное преимущество хранения логики ролей и разрешений в базе данных (а не в коде), что позволяет легко вносить изменения "на лету".

Этот плагин даже позволяет создать пользовательскую роль (например, вы можете создать роль "Редактор фотографий" или "Модератор комментариев" и т.д.) и ограничить, какие меню они могут видеть и использовать. Думаю, это сделает именно то, что вам нужно.

26 апр. 2014 г. 18:14:20
0

Вы можете создать пользовательскую роль, как предложил s_da_hum, или удалить возможности у роли "Участник" (Contributor), добавив этот код в файл functions.php вашей дочерней темы.

add_action( 'init', 'wpsites_remove_contributor_capabilities' );

function wpsites_remove_contributor_capabilities() {

$contributor = get_role( 'contributor' );

$caps = array(
    'edit_posts',
    'delete_posts',
);

foreach ( $caps as $cap ) {

    $contributor->remove_cap( $cap );
    }
}

Источник https://codex.wordpress.org/Function_Reference/add_role

26 апр. 2014 г. 18:57:26