Come limitare l'accesso alla dashboard solo agli amministratori?
Come possiamo limitare l'accesso all'area amministrativa di WordPress a tutti gli utenti tranne gli amministratori?
Gli utenti del nostro sito hanno le proprie pagine del profilo che forniscono tutte le funzioni di cui hanno bisogno.
Quindi l'amministrazione dovrebbe essere inaccessibile a tutti tranne che agli amministratori.
Come si può fare?
Possiamo agganciarci all'azione admin_init
e verificare se l'utente è un amministratore utilizzando la funzione current_user_can()
per controllare se l'utente corrente può manage_options
, cosa che solo un amministratore può fare.
Questo codice, quando incollato nel tuo file functions.php, mostrerà un messaggio quando un non-amministratore cerca di accedere alla dashboard:
function wpse_11244_restrict_admin() {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'Non sei autorizzato ad accedere a questa parte del sito' ) );
}
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );
Se preferisci, puoi offrire una migliore esperienza utente reindirizzando l'utente alla home page invece:
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 );
Se vuoi reindirizzare l'utente alla sua pagina profilo, sostituisci home_url()
nel codice sopra con il link appropriato.

Questa risposta non soddisfa i requisiti della domanda. Innanzitutto, stai disabilitando l'accesso all'area di amministrazione a un utente con la capacità "manage_options", e una capacità può essere assegnata a più ruoli, non solo all'amministratore. Inoltre, la capacità "manage_options" può essere rimossa dall'amministratore.

@cybmeta verificare la capacità manage_options
è il modo accettato per controllare un utente amministratore. Persino Mark Jaquith lo afferma

Il richiedente ha chiesto esattamente come verificare il ruolo di amministratore e penso sia importante fornirgli la risposta esatta e spiegare quando e perché verificare le capacità può essere meglio. Tu dici che manage_options
è qualcosa che solo gli "amministratori" possono fare e questo non è vero, manage_options
è una capacità e può essere rimossa dal ruolo di amministratore o assegnata ad altri ruoli utente. La cosa importante è sapere cosa vuoi fare e scegliere il modo migliore. Vedi la mia risposta, lo spiego in dettaglio.

Signore, lei si merita un +1! :) Ho cercato questa soluzione per ore! Inoltre un piccolo miglioramento. Per un sito singolo il vostro controllo è sufficiente. Per un multi-sito vorrete sostituire manage_options
con manage_network
. Quest'ultimo disabiliterebbe la dashboard anche per gli "amministratori del sito" predefiniti ma lascerebbe l'accesso disponibile per i Super Amministratori (amministratori di rete).

Il problema principale con questa risposta è che entra in conflitto con le chiamate ajax. @cybmeta ha la risposta corretta qui sotto.

Puoi scrivere un plugin e agganciarti a admin_init
.
Il codex fornisce effettivamente un esempio con la funzionalità che stai cercando.
http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_control

Alcune delle risposte fornite possono andare bene nella maggior parte delle situazioni, ma penso che nessuna di esse garantisca di fare esattamente ciò che viene chiesto perché nessuna controlla i ruoli utente, bensì controllano le capacità e le capacità possono essere assegnate e rimosse dai ruoli. Quindi, per dare una risposta esatta, bisogna verificare i ruoli utente, non le capacità:
add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permetti chiamate AJAX
return;
}
$user = wp_get_current_user();
if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
//Reindirizza alla pagina principale se non c'è un utente o se l'utente non ha il ruolo "amministratore"
wp_redirect( get_site_url( ) );
exit();
}
}
Se vuoi verificare che l'utente abbia la capacità "manage_options", puoi farlo. In effetti, è l'opzione migliore nella maggior parte dei casi. Sebbene questa capacità sia associata di default agli utenti amministratori, la capacità può essere rimossa dal ruolo admin o può essere assegnata ad altri ruoli utente. Ecco perché, nella maggior parte dei casi, verificare ciò che l'utente può o non può fare è meglio che controllare il ruolo utente. Quindi, nella maggior parte dei casi, verificare le capacità dovrebbe essere la scelta migliore, ma devi avere chiaro questo concetto e scegliere l'opzione migliore per la tua situazione e scopo:
add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permetti chiamate AJAX
return;
}
if( ! current_user_can( "manage_options" ) ) {
//Reindirizza alla pagina principale se l'utente non ha la capacità "manage_options"
wp_redirect( get_site_url( ) );
exit();
}
}

Prova il plugin Adminimize.
Puoi bloccare le cose in modo abbastanza efficace con quello.
Potresti anche provare a configurare l'accesso tramite file htaccess

+1 per Adminimize. È un plugin mostruoso. In abbinamento con qualche plugin personalizzato per la gestione dei ruoli, è semplicemente fantastico. (Se mi è consentita un'opinione personale) :::: Come ultima nota: per favore fornisci più informazioni oltre ai semplici link, rende la risposta più completa.

'administrator'
non è una capability. Funziona solo per mantenere la compatibilità con le versioni precedenti. Controlla 'update_core'
o altre admin capabilities.

Aggiungi queste righe al tuo file functions.php
function baw_no_admin_access()
{
// Blocca l'accesso al backend per tutti tranne gli amministratori
if( !current_user_can( 'administrator' ) ) {
wp_redirect( home_url() ); // Reindirizza alla homepage
die(); // Termina l'esecuzione
}
}
// Hook per eseguire la funzione all'inizializzazione dell'admin
add_action( 'admin_init', 'baw_no_admin_access', 1 );

Prova questo, non mostrare mai errori direttamente a un utente finale. È contrario a una buona UX. Questo codice li reindirizza alla Home.
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;
}
}

Utilizzerei WP Frontend e lo imposterei per tutti tranne che per gli amministratori.
