Cum obții o listă cu rolurile disponibile într-un site WordPress?
Când dezvolți plugin-uri WordPress, deseori apare necesitatea de a configura opțiuni pentru rolurile care au acces la anumite funcționalități sau conținut pe site. Pentru aceasta, un dezvoltator de plugin-uri trebuie să obțină lista rolurilor existente pe site pentru a le utiliza în opțiuni. Deoarece pot fi create roluri personalizate, nu putem presupune că rolurile implicite sunt singurele disponibile.
Care este cea mai bună metodă pentru a obține această listă?

Rolurile sunt stocate în variabila globală $wp_roles
.
Funcția ideală este get_editable_roles()
din /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;
}
Partea "editable" există deoarece oferă altor pluginuri șansa de a filtra lista în cazul în care cineva altul decât administratorul are privilegiul 'edit_users'
(și astfel rolul 'admin' trebuie eliminat din listă, altfel acel utilizator s-ar putea face administrator). Pluginurile de gestionare a rolurilor care creează roluri personalizate sunt cele care ar folosi acest filtru. În caz contrar, această funcție este în esență get_roles()
(care nu există).
Se presupune că pluginul tău va oferi pagina de setări în discuție doar cuiva care are capabilități de nivel admin precum 'manage_options'
și este practic un administrator cu acces la toate rolurile, deci filtrul nu ar trebui să te afecteze.
Există și wp_dropdown_roles()
care oferă rolurile ca câmpuri <option>
pentru o listă <select>
(deși checkbox-urile sunt probabil mai potrivite în multe scenarii în care alegi cine are acces la ceva).

Notă: Am creat această funcție ca parte a unui patch pentru a face WP mai sigur, așa că sunt părtinitor în favoarea ei ;)

Nu sunt sigur dacă aceasta este cea mai bună soluție la întrebare, deoarece conform documentației, get_editable_roles()
preia o listă filtrată de roluri de utilizator pe care utilizatorul curent are voie să le editeze. Poate că wp_roles()
ar fi o alegere mai bună. Te rog, verifică răspunsul meu.

Pentru cei care au un site multilingv, funcția
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;
}
returnează un array localizat astfel (numele rolurilor sunt în limba slovacă):
Array
(
[0] => Array
(
[role] => administrator
[name] => Administrátor
)
[1] => Array
(
[role] => editor
[name] => Editor
)
[2] => Array
(
[role] => author
[name] => Autor
)
[3] => Array
(
[role] => contributor
[name] => Prispievateľ
)
)

Iată cum poți obține un array cu toate rolurile de utilizator existente și capabilitățile pentru fiecare rol în WordPress. Dacă nu dorești să afișezi rezultatele pe ecran, poți omite ultima linie. Variabila $roles de pe linia 2 va conține array-ul cu utilizatorii și capabilitățile, astfel încât să le poți folosi după necesități. Mai jos găsești un exemplu al array-ului returnat.
global $wp_roles;
$roles = $wp_roles->roles;
// afișează rezultatele pe ecran
echo '<pre>' . print_r( $roles, true ) . '</pre>';

Nu sunt sigur dacă răspunsul acceptat este cea mai bună soluție la întrebare, conform documentației, get_editable_roles()
recuperează o listă filtrată de roluri de utilizator pe care utilizatorul curent are permisiunea să le editeze.
Poate că trebuie doar să folosim wp_roles()
. Această funcție recuperează instanța globală WP_Roles
și o instantiază dacă este necesar. Și dacă dorești doar un array cu ID-urile rolurilor ca chei și numele ca valori, poți face asta:
$roles = wp_roles()->get_names();

Iată cum poți găsi lista de roluri fără a utiliza plugin-uri sau funcții suplimentare http://screencast.com/t/uaWsGLAR3Sh
