Verifica se un utente è amministratore tramite ID utente

27 ago 2016, 14:40:39
Visualizzazioni: 20.1K
Voti: 10

Qualche idea su come verificare se un utente (tramite ID utente) è amministratore? Non mi riferisco all'utente attualmente connesso.

2
Commenti

user_can( $user_id, "manage_options" ) o in_array( "administrator", get_userdata( $user_id ) ). is_admin() ti dice se sei nella schermata di amministrazione (dashboard ecc.)

Ismail Ismail
27 ago 2016 15:02:26

@SamuelElh come risposta per favore. :)

Rarst Rarst
27 ago 2016 15:43:44
Tutte le risposte alla domanda 3
0
21

Hai formulato il tuo intento come voler verificare se l'utente ha il ruolo di amministratore. È considerato più appropriato verificare la capacità, rilevante per l'azione specifica.

Nella pratica questo si esprime solitamente come current_user_can( 'manage_options' ) per l'utente corrente. Per un utente arbitrario sarebbe user_can( $user_id, 'manage_options' ).

Naturalmente questa è una capacità che rappresenta la configurazione generale del sito. A seconda del tuo scopo potresti volerne usare una diversa, consulta l'elenco nella documentazione su ruoli e capacità.

27 ago 2016 15:49:19
2

Aggiungo solo alla risposta di @Rarst.

Tecnicamente puoi fornire il nome del ruolo a quelle funzioni, quindi current_user_can( 'administrator' ) o user_can( $user_id, 'administrator' ) funzionerebbero anche, ma è sconsigliato.

Sebbene il controllo sui ruoli specifici al posto di una capability sia in parte supportato, questa pratica è sconsigliata in quanto può produrre risultati inaffidabili.

Nota: Restituirà sempre true se l'utente corrente è un super admin, a meno che non sia specificamente negato.

Potresti controllare il ruolo senza fare affidamento su quelle funzioni (poiché sono inaffidabili), ma come ha detto @Rarst, è più corretto controllare le capabilities invece del ruolo.

Uno dei principali vantaggi nell'usare le capabilities invece dei ruoli è il seguente.

Prendi ad esempio il caso in cui hai più di un amministratore sul tuo sito. Diciamo che vuoi che il tuo cliente sia admin, e anche tu sei admin del sito.

Ora ha senso che il tuo cliente abbia privilegi da amministratore sul suo sito, ma potresti non volere che abbia la possibilità di installare plugin sul sito. Quello sarebbe il tuo lavoro come webmaster.

Quindi se controlli i ruoli, sei bloccato nel disabilitare/abilitare funzionalità a tutti all'interno di quel ruolo.

Ora se usi le capabilities, avresti una granularità maggiore nel concedere/restringere agli utenti azioni specifiche.

Tornando al mio scenario, se vuoi dare al tuo cliente privilegi da amministratore ma non la possibilità di installare plugin, sarebbe semplice come

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  // la capability richiesta e l'ID del nostro utente cliente
  if ( 'install_plugins' == $args[0] && $args[1] == 2 ) 
    $allcaps[ $cap[0] ] = false;
  
  return $allcaps;
}

potremmo fornire un array di diverse capabilities che vorremmo restringere, ad esempio update_core, manage_options, install_plugins, install_themes, ecc.

La nostra funzione sarebbe comunque abbastanza semplice

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  $restricted_cap = array( 
    'update_core',
    'manage_options',
    'install_plugins',
    'install_themes',
     // ecc.
  );

  foreach( $restricted_cap as $r_cap ){

    // la capability richiesta e l'ID del nostro utente cliente
    if ( $r_cap == $args[0] && $args[1] == 2 ) 
      $allcaps[ $cap[0] ] = false;

  } 
  
  return $allcaps;
}

Quindi come puoi vedere, questo è abbastanza efficace, non richiede un ruolo speciale, non aggiunge una query extra al database, viene eseguito a runtime ed è facilmente scalabile e mantenibile.

Se la tua logica dipende da un ruolo, beh, buona fortuna a targettizzare utenti specifici, scenari o altro senza strapparti i capelli o creare una miriade di ruoli solo per tenere il passo con tutti i possibili casi d'uso.

Consulta il codex per maggiori informazioni sul filtro user_has_cap.

31 ago 2016 07:38:33
Commenti

"Sebbene il controllo basato su ruoli specifici invece che su una capability sia parzialmente supportato, questa pratica è sconsigliata in quanto potrebbe produrre risultati inaffidabili." -> https://developer.wordpress.org/reference/functions/current_user_can/

cybmeta cybmeta
31 ago 2016 07:53:08

Ottimo rilevamento, ho aggiornato la mia risposta per includere la citazione

bynicolas bynicolas
31 ago 2016 08:02:31
0

Puoi utilizzare get_userdata() o get_user_by() passando l'ID utente per ottenere l'oggetto utente. Da questo puoi ottenere il ruolo.

$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
   $user->roles // questo contiene il ruolo, qui puoi verificare qualsiasi ruolo ti serva
}

Puoi consultare questa risposta per maggiori informazioni

27 ago 2016 14:57:05