Eliminarea posibilității de a accesa anumite meniuri din admin
Încerc să elimin unele dintre funcțiile administrative pentru un utilizator cu rolul de contributor. Mai exact, vreau să-i restricționez accesul la anumite elemente din meniul administrativ, precum comentarii, unelte, media etc. Am reușit să elimin elementele dorite din meniul admin folosind acest cod:
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' ); //Panou de control
remove_menu_page( 'edit.php' ); //Articole
remove_menu_page( 'upload.php' ); //Media
remove_menu_page( 'tools.php' ); //Unelte
remove_menu_page( 'edit-comments.php' ); //Comentarii
}
}
add_action( 'admin_menu', 'remove_menus' );
Funcționează perfect. Problema pe care o întâmpin este că pot adăuga manual șirul de interogare în URL, de exemplu /wp-admin/edit.php și asta mă va duce la ecranul de editare a articolelor. Știe cineva o modalitate de a restricționa complet accesul la aceste pagini, pe lângă ascunderea lor din meniul administrativ?

Am rezolvat în final și iată codul pe care l-am folosit:
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( 'Încerci să faci mișelii?' );
}
}
}
add_action( 'current_screen', 'restrict_menus' );

Știu că această întrebare a fost deja răspunsă și este veche. Totuși, am dorit să ofer o soluție alternativă. Iată cum am făcut acest lucru într-un plugin pe care l-am scris acum ceva timp (am modificat codul meu pentru a folosi paginile tale).
Deoarece dorești să restrângeți rolul de contributor, poți folosi capabilitățile rolului. Contributorii nu pot publica articole, așa că ai putea face următoarele.
Partea 1: Eliminarea elementelor din meniul Admin
add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {
// nu face nimic dacă utilizatorul poate publica articole
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// elimină aceste elemente din meniul admin
remove_menu_page( 'edit.php' ); // Articole
remove_menu_page( 'upload.php' ); // Media
remove_menu_page( 'tools.php' ); // Unelte
remove_menu_page( 'edit-comments.php' ); // Comentarii
}
Totuși, după cum ai menționat, acest lucru nu împiedică utilizatorul să introducă direct URL-ul paginii. Iată cum am implementat restricția de acces la pagini:
Partea 2: Restricționarea accesului la paginile Admin
add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {
// nu face nimic dacă utilizatorul poate publica articole
if ( current_user_can( 'publish_posts' ) ) {
return;
}
// preia ID-ul paginii curente
$current_screen_id = get_current_screen()->id;
// determină care ecrane sunt restricționate
$restricted_screens = array(
'edit',
'upload',
'tools',
'edit-comments',
);
// Restricționează accesul la pagină
foreach ( $restricted_screens as $restricted_screen ) {
// compară ID-ul ecranului curent cu fiecare ecran restricționat
if ( $current_screen_id === $restricted_screen ) {
wp_die( __( 'Nu aveți permisiunea de a accesa această pagină.', 'tcd' ) );
}
}
}
Pentru mine, folosirea capabilităților rolului și a unui array a făcut lucrul mai ușor. Oricum, sper că această metodă este utilă.
Noroc.

De obicei folosesc (și recomand) pluginul Members. Interfața este foarte ușor de utilizat și ai avantajul suplimentar de a-ți stoca logica de roluri/permisiuni în baza de date (în loc de cod), ceea ce face schimbările "pe loc" mai ușor de realizat.
Acest plugin îți permite chiar să creezi un rol personalizat (poate vrei să inventezi unul numit "Editor Foto" sau "Aprobator Comentarii" etc.) și să limitezi ce meniuri pot vedea și accesa. Cred că acest plugin va face exact ceea ce dorești.

Puteți crea un rol personalizat așa cum sugerează s_da_hum sau elimina capabilitățile din rolul de contributor prin adăugarea acestui cod în fișierul functions.php al temei child.
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 );
}
}
Sursa https://codex.wordpress.org/Function_Reference/add_role
