Come ottenere una lista dei ruoli attualmente disponibili su un sito WordPress?
Durante lo sviluppo di plugin WordPress, spesso è necessario configurare opzioni che determinano quali ruoli nel sito hanno accesso a determinate funzionalità o contenuti. Per fare questo, uno sviluppatore di plugin deve recuperare la lista dei ruoli esistenti sul sito da utilizzare nell'opzione. Poiché è possibile creare ruoli personalizzati, non possiamo assumere che i ruoli predefiniti siano gli unici disponibili.
Qual è il modo migliore per recuperare questa lista?

I ruoli sono memorizzati nella variabile globale $wp_roles
.
La funzione ideale è get_editable_roles()
da /wp-admin/includes/user.php
function get_editable_roles() {
global $wp_roles;
$all_roles = $wp_roles->roles;
$editable_roles = apply_filters('editable_roles', $all_roles);
return $editable_roles;
}
La parte "editable" è presente perché offre ad altri plugin la possibilità di filtrare la lista nel caso in cui qualcuno diverso dall'amministratore abbia il privilegio 'edit_users'
(e quindi 'admin' deve essere rimosso dalla lista, altrimenti quell'utente potrebbe auto-promuoversi ad amministratore). I plugin di gestione dei ruoli che creano ruoli personalizzati sono quelli che utilizzerebbero quel filtro. Altrimenti questa funzione è essenzialmente get_roles()
(che non esiste).
Presumibilmente il tuo plugin offrirà la pagina delle impostazioni in questione solo a qualcuno che ha capacità a livello amministrativo come 'manage_options'
ed è sostanzialmente un amministratore con accesso a tutti i ruoli, quindi il filtro non dovrebbe influenzarti.
Esiste anche wp_dropdown_roles()
che restituisce i ruoli come campi <option>
per una lista <select>
(anche se le checkbox probabilmente funzionano meglio in molti scenari in cui stai scegliendo chi ha accesso a qualcosa).

Nota: Ho creato questa funzione come parte di una patch per rendere WP più sicuro, quindi sono di parte a suo favore ;)

Non sono sicuro che questa sia la soluzione migliore alla domanda, poiché secondo la documentazione, get_editable_roles()
recupera un elenco filtrato di ruoli utente che l'utente corrente è autorizzato a modificare. Forse wp_roles()
sarebbe una scelta migliore. Per favore, controlla la mia risposta.

Per coloro che hanno un sito multilingue, la funzione
function wp_roles_array() {
$editable_roles = get_editable_roles();
foreach ($editable_roles as $role => $details) {
$sub['role'] = esc_attr($role);
$sub['name'] = translate_user_role($details['name']);
$roles[] = $sub;
}
return $roles;
}
restituisce un array localizzato come questo (i nomi dei ruoli sono in lingua italiana):
Array
(
[0] => Array
(
[role] => administrator
[name] => Amministratore
)
[1] => Array
(
[role] => editor
[name] => Editore
)
[2] => Array
(
[role] => author
[name] => Autore
)
[3] => Array
(
[role] => contributor
[name] => Collaboratore
)
)

Ecco come ottenere un array di tutti i ruoli utente esistenti e delle relative capacità in WordPress. Se non vuoi stamparlo a schermo, puoi omettere l'ultima riga. La variabile $roles alla riga 2 conterrà l'array degli utenti e delle capacità, che potrai utilizzare come preferisci. Di seguito un esempio dell'array restituito.
global $wp_roles;
$roles = $wp_roles->roles;
// stampa a schermo
echo '<pre>' . print_r( $roles, true ) . '</pre>';

Non sono sicuro che la risposta accettata sia la soluzione migliore alla domanda, poiché secondo la documentazione, get_editable_roles()
recupera un elenco filtrato di ruoli utente che l'utente corrente è autorizzato a modificare.
Forse abbiamo solo bisogno di usare wp_roles()
. Questa funzione recupera l'istanza globale WP_Roles
e la istanzia se necessario. E se vuoi semplicemente un array con gli ID dei ruoli come chiavi e i nomi come valori puoi fare così:
$roles = wp_roles()->get_names();

Ecco come puoi trovare la lista dei ruoli senza alcun plugin o funzione http://screencast.com/t/uaWsGLAR3Sh
