Cum să restricționezi accesul la panoul de administrare doar pentru Administratori?
Cum putem restricționa accesul la zona de administrare WordPress pentru toți utilizatorii, cu excepția administratorilor?
Utilizatorii site-ului nostru au propriile pagini de profil care conțin toate funcțiile de care au nevoie.
Așadar, zona de administrare ar trebui să fie inaccesibilă tuturor, cu excepția administratorilor.
Cum putem face acest lucru?

Putem folosi acțiunea admin_init
și să verificăm dacă utilizatorul este administrator prin funcția current_user_can()
pentru a verifica dacă utilizatorul curent poate manage_options
, ceea ce poate face doar un administrator.
Acest cod, când este inserat în fișierul functions.php, va afișa un mesaj când un utilizator ne-administrator încearcă să acceseze panoul de administrare:
function wpse_11244_restrict_admin() {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'Nu ai permisiunea să accesezi această parte a site-ului' ) );
}
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );
Dacă preferați, puteți oferi o experiență mai bună utilizatorului prin redirecționarea acestuia către pagina principală:
function wpse_11244_restrict_admin() {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_redirect( home_url() );
exit;
}
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );
Dacă doriți să redirecționați utilizatorul către pagina sa de profil, înlocuiți home_url()
în codul de mai sus cu link-ul corespunzător.

Acest răspuns nu îndeplinește cerințele întrebării. În primul rând, restricționați accesul la zona de administrare unui utilizator cu capacitatea "manage_options", iar o capacitate poate fi atribuită mai multor roluri, nu doar administratorului. În plus, capacitatea "manage_options" poate fi eliminată de la administrator.

@cybmeta verificarea capacității manage_options
este metoda acceptată pentru a verifica un utilizator administrator. Chiar și Mark Jaquith confirmă acest lucru

Întrebarea se referea exact la verificarea rolului de administrator și cred că este important să-i oferim răspunsul exact și să explicăm când și de ce verificarea capacității poate fi mai bună. Spuneți că manage_options
este ceva ce doar "administratorii" pot face, iar asta nu este adevărat, manage_options
este o capacitate și poate fi eliminată din rolul de administrator sau atribuită altor roluri de utilizator. Important este să știm ce vrem să facem și să alegem cea mai bună abordare. Vedeți răspunsul meu, explic acest lucru.

Domnule, primești un +1! :) Am căutat asta de ore întregi! De asemenea, o mică îmbunătățire. Pentru site-uri unice, verificarea ta este suficientă. Pentru rețele de site-uri, ai putea să înlocuiești manage_options
cu manage_network
. Această ultimă opțiune ar dezactiva tabloul de bord și pentru "administratorii de site" obișnuiți, dar ar păstra accesul disponibil pentru Super Administratori (Administratorii de rețea).

Principala problemă cu acest răspuns este că intră în conflict cu apelurile ajax. @cybmeta are răspunsul corect mai jos.

Puteți scrie un plugin și să vă conectați la admin_init
.
Codex oferă de fapt un exemplu cu funcționalitatea pe care o căutați.
http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_control

Unele dintre răspunsurile oferite pot fi bune în majoritatea situațiilor, dar cred că niciunul nu garantează că face exact ceea ce se cere, deoarece niciunul nu verifică rolurile utilizatorilor, ci verifică capabilitățile, iar acestea pot fi atribuite și eliminate din roluri. Prin urmare, pentru a oferi un răspuns exact, trebuie verificate rolurile utilizatorilor, nu capabilitățile:
add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permite apelurile AJAX
return;
}
$user = wp_get_current_user();
if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
//Redirecționează către pagina principală dacă nu există utilizator sau dacă utilizatorul nu are rolul de "administrator" atribuit
wp_redirect( get_site_url( ) );
exit();
}
}
Dacă doriți să verificați dacă utilizatorul are capabilitatea "manage_options", puteți face acest lucru. De fapt, aceasta este cea mai bună opțiune în majoritatea cazurilor. Deși această capabilitate este asociată implicit utilizatorilor cu rol de administrator, ea poate fi eliminată din rolul de administrator sau poate fi atribuită altor roluri de utilizatori. De aceea, în majoritatea cazurilor, verificarea a ceea ce utilizatorul poate sau nu poate face este mai bună decât verificarea rolului utilizatorului. Prin urmare, în majoritatea cazurilor, verificarea capabilităților ar trebui să fie metoda aleasă, dar trebuie să aveți acest concept clar și să alegeți cea mai bună opțiune pentru situația și scopul dvs.:
add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permite apelurile AJAX
return;
}
if( ! current_user_can( "manage_options" ) ) {
//Redirecționează către pagina principală dacă utilizatorul nu are capabilitatea "manage_options"
wp_redirect( get_site_url( ) );
exit();
}
}

Încearcă pluginul Adminimize.
Poți să blochezi lucrurile destul de bine cu el.
De asemenea, poți încerca să configurezi accesul prin fișierul htaccess

+1 pentru Adminimize. Este un monstru de plugin. Îmbinat cu un plugin de gestionare a rolurilor personalizat, pur și simplu rulează perfect. (Dacă îmi permiteți o părere personală) :::: Ca o ultimă observație: vă rog să oferiți mai multe informații decât doar linkuri, astfel răspunsul devine mai complet.

'administrator'
nu este o capabilitate. Funcționează doar pentru a menține compatibilitatea cu versiunile anterioare. Verifică 'update_core'
sau alte capabilități de administrator.

Încearcă asta, niciodată nu arunca erori în fața unui utilizator final. Este împotriva unei bune experiențe de utilizare (UX). Acest cod îi redirecționează către pagina de Acasă.
add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}

Aș folosi WP Frontend și l-aș seta pentru toți utilizatorii, cu excepția administratorilor.
