Come limitare l'accesso alla dashboard solo agli amministratori?

5 mar 2011, 17:15:29
Visualizzazioni: 27.7K
Voti: 20

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?

3
Commenti

Intendi dire che ci sono pagine utente "frontali" che non richiedono l'accesso a nulla situato su http://yourdomain.com/wp-admin?

curtismchale curtismchale
5 mar 2011 17:37:34

Sì esattamente. C'è qualcosa che non va in questo?

Robin I Knight Robin I Knight
5 mar 2011 17:42:54

No, stavo solo chiarendo.

curtismchale curtismchale
6 mar 2011 04:01:25
Tutte le risposte alla domanda 8
6
21

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.

27 dic 2012 12:17:19
Commenti

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 cybmeta
11 giu 2014 17:36:57

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

shea shea
12 giu 2014 01:26:00

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.

cybmeta cybmeta
12 giu 2014 11:02:44

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).

rkeet rkeet
20 ago 2014 14:57:33

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

RiotAct RiotAct
17 apr 2019 23:04:19

@RiotAct Sono abbastanza sicuro di aver incluso un controllo per AJAX nel secondo esempio, ma hai ragione, avrei dovuto usare il metodo più affidabile

shea shea
18 apr 2019 03:33:14
Mostra i restanti 1 commenti
1

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

5 mar 2011 22:13:18
Commenti

Questa non è una risposta completa - dovrebbe essere più di un suggerimento e un link

shea shea
8 gen 2013 06:37:41
1

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();
      }

 }
27 mar 2014 11:57:06
Commenti

Questa è la risposta corretta. Non entra in conflitto con le chiamate ajax.

RiotAct RiotAct
17 apr 2019 23:04:42
1

Prova il plugin Adminimize.
Puoi bloccare le cose in modo abbastanza efficace con quello.

Potresti anche provare a configurare l'accesso tramite file htaccess

5 mar 2011 19:38:56
Commenti

+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.

brasofilo brasofilo
20 ott 2012 08:02:45
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('Non sei autorizzato ad accedere a questa parte del sito'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
10 mag 2012 16:21:30
Commenti

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

fuxia fuxia
10 mag 2012 19:10:34

Inoltre, le capabilities possono essere assegnate ai ruoli, quindi se vuoi consentire l'accesso all'utente "administrator", dovresti controllare i ruoli, non le capabilities.

cybmeta cybmeta
11 giu 2014 17:47:11
1

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 );
27 dic 2012 08:55:36
Commenti

come ha detto @toscho 'administrator' non è una capacità, invece usa capacità amministrative come 'update_core'

Pierre Pierre
27 dic 2012 11:33:25
0

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;
}
}
11 giu 2014 17:07:17
1
-1

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

6 mar 2011 07:21:15
Commenti

Per favore fornisci più informazioni oltre a un link - rende una risposta più completa

shea shea
8 gen 2013 06:42:10