Удаление доступа к определенным меню администратора
Я пытаюсь удалить некоторые функции администратора для пользователя с ролью 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, и это перенаправит меня на экран редактирования записей. Кто-нибудь знает способ полностью ограничить доступ к этим страницам, а не только скрыть их из меню администратора?

В итоге я разобрался, и вот код, который я использовал:
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' );

Я знаю, что этот вопрос уже был отвечен, и он довольно старый. Однако я хотел предложить альтернативное решение. Вот как я реализовал это в одном из своих плагинов некоторое время назад (я изменил свой код, чтобы использовать ваши страницы).
Поскольку вы хотите ограничить роль 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' ) );
}
}
}
Для меня использование возможностей ролей и массива сделало работу немного проще. В любом случае, надеюсь, этот метод окажется полезным.
Удачи.

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

Вы можете создать пользовательскую роль, как предложил 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
