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

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

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
.

"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/

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
