Rimuovere l'accesso a determinati menu di amministrazione
Sto cercando di rimuovere alcune funzionalità di amministrazione per un utente con il ruolo di contributor. Con rimuovere alcune funzionalità di amministrazione intendo impedire la visualizzazione di determinate voci del menu amministrativo, come commenti, strumenti, media ecc. Sono riuscito a rimuovere gli elementi desiderati dal menu di amministrazione usando questo codice:
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' ); //Dashboard
remove_menu_page( 'edit.php' ); //Articoli
remove_menu_page( 'upload.php' ); //Media
remove_menu_page( 'tools.php' ); //Strumenti
remove_menu_page( 'edit-comments.php' ); //Commenti
}
}
add_action( 'admin_menu', 'remove_menus' );
Funziona perfettamente. Il problema che sto affrontando è che posso semplicemente aggiungere manualmente la query string all'URL, ad esempio /wp-admin/edit.php e questo mi porterà alla schermata di modifica degli articoli. Qualcuno sa come limitare completamente l'accesso a queste pagine, oltre a nasconderle dal menu di amministrazione?

Alla fine ho capito e questo è il codice che ho utilizzato:
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( 'Stai cercando di fare il furbo?' );
}
}
}
add_action( 'current_screen', 'restrict_menus' );

So che questa domanda è già stata risposta ed è vecchia. Tuttavia, volevo fornire una soluzione alternativa. Ecco come l'ho implementata in un plugin che ho scritto tempo fa (ho modificato il mio codice per utilizzare le tue pagine).
Poiché vuoi limitare il ruolo del contributor, puoi utilizzare le capacità dei ruoli. I contributor non possono pubblicare post, quindi potresti fare quanto segue.
Parte 1: Rimuovere elementi dal menu di amministrazione
add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {
// non fare nulla se l'utente può pubblicare post
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// rimuovi questi elementi dal menu di amministrazione
remove_menu_page( 'edit.php' ); // Post
remove_menu_page( 'upload.php' ); // Media
remove_menu_page( 'tools.php' ); // Strumenti
remove_menu_page( 'edit-comments.php' ); // Commenti
}
Come hai detto però, questo non impedisce all'utente di inserire direttamente l'URL della pagina. Ecco come ho implementato la restrizione delle pagine:
Parte 2: Limitare l'accesso alle pagine di amministrazione
add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {
// non fare nulla se l'utente può pubblicare post
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// recupera l'ID della pagina corrente
$current_screen_id = get_current_screen()->id;
// determina quali schermate sono vietate
$restricted_screens = array(
'edit',
'upload',
'tools',
'edit-comments',
);
// Limita l'accesso alla pagina
foreach ( $restricted_screens as $restricted_screen ) {
// confronta l'ID della schermata corrente con ogni schermata vietata
if ( $current_screen_id === $restricted_screen ) {
wp_die( __( 'Non sei autorizzato ad accedere a questa pagina.', 'tcd' ) );
}
}
}
Per me, utilizzare le capacità dei ruoli e un array ha reso il tutto un po' più semplice da gestire. Comunque, spero che questo metodo sia utile.
Saluti.

Di solito utilizzo (e raccomando) il plugin Members. L'interfaccia utente è molto semplice da usare e hai il vantaggio aggiuntivo di memorizzare la logica dei ruoli/permessi nel database (piuttosto che nel codice), il che rende facili le modifiche "al volo".
Questo plugin ti permette persino di creare un ruolo personalizzato (magari vuoi inventarne uno chiamato "Editor di Foto" o "Approvatore di Commenti" ecc.) e limitare quali menu possono vedere e a cui possono accedere. Penso che faccia esattamente quello che desideri.

Potresti creare un ruolo personalizzato come suggerito da s_da_hum oppure rimuovere le capacità dal ruolo contributor aggiungendo questo codice al file functions.php del tuo child theme.
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 );
}
}
Fonte https://codex.wordpress.org/Function_Reference/add_role
