Eliminar la capacidad de acceder a ciertos menús de administración
Estoy tratando de eliminar algunas de las características de administración para un usuario con el rol de colaborador. Con eliminar algunas características de administración me refiero a impedirles ver ciertos elementos del menú de administración, como comentarios, herramientas, medios, etc. He logrado eliminar los elementos que quiero del menú de administración usando este código:
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' ); //Panel de control
remove_menu_page( 'edit.php' ); //Entradas
remove_menu_page( 'upload.php' ); //Medios
remove_menu_page( 'tools.php' ); //Herramientas
remove_menu_page( 'edit-comments.php' ); //Comentarios
}
}
add_action( 'admin_menu', 'remove_menus' );
Funciona perfectamente. El problema al que me enfrento es que puedo simplemente agregar manualmente la cadena de consulta a la URL, por ejemplo /wp-admin/edit.php y eso me llevará a la pantalla de edición de entradas. ¿Alguien sabe una manera de restringir el acceso a estas páginas por completo, además de ocultarlas del menú de administración?

Al final lo resolví y este es el código que utilicé:
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( '¿Intentando hacer trampa?' );
}
}
}
add_action( 'current_screen', 'restrict_menus' );

Sé que esta pregunta ya ha sido respondida y es antigua. Sin embargo, quería proporcionar una solución alternativa. Así es como lo hice en un plugin que escribí hace un tiempo (he modificado mi código para usar tus páginas).
Como quieres restringir el rol de colaborador, puedes usar capacidades de roles. Los colaboradores no pueden publicar entradas, por lo que podrías hacer lo siguiente.
Parte 1: Eliminar elementos del menú de administración
add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {
// no hacer nada si el usuario puede publicar entradas
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// eliminar estos elementos del menú de administración
remove_menu_page( 'edit.php' ); // Entradas
remove_menu_page( 'upload.php' ); // Medios
remove_menu_page( 'tools.php' ); // Herramientas
remove_menu_page( 'edit-comments.php' ); // Comentarios
}
Como dijiste, esto no restringe al usuario de ingresar directamente la URL de la página. Así es como escribí mi restricción de página:
Parte 2: Restringir el acceso a páginas de administración
add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {
// no hacer nada si el usuario puede publicar entradas
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// recuperar el ID de la página actual
$current_screen_id = get_current_screen()->id;
// determinar qué pantallas están prohibidas
$restricted_screens = array(
'edit',
'upload',
'tools',
'edit-comments',
);
// Restringir acceso a la página
foreach ( $restricted_screens as $restricted_screen ) {
// comparar el ID de la pantalla actual contra cada pantalla restringida
if ( $current_screen_id === $restricted_screen ) {
wp_die( __( 'No tienes permiso para acceder a esta página.', 'tcd' ) );
}
}
}
Para mí, usar capacidades de roles y un array hizo que fuera un poco más fácil trabajar. De todos modos, espero que este método sea útil.
Saludos.

Normalmente uso (y recomiendo) el plugin Members. Su interfaz de usuario es muy fácil de usar, y tienes la ventaja adicional de almacenar la lógica de roles/permisos en la base de datos (en lugar de en el código), lo que facilita realizar cambios "sobre la marcha".
Este plugin incluso te permite crear un rol personalizado (quizás quieras inventar uno llamado "Editor de Fotos" o "Aprobador de Comentarios", etc.) y limitar qué menús pueden ver y acceder. Creo que esto hará exactamente lo que necesitas.

Podrías crear un rol personalizado como sugiere s_da_hum o eliminar capacidades del rol de colaborador añadiendo este código al archivo functions.php de tu tema hijo.
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 );
}
}
Fuente https://codex.wordpress.org/Function_Reference/add_role
