¿Cómo obtener una lista de roles disponibles actualmente en un sitio WordPress?
Al desarrollar plugins para WordPress, a menudo surge la necesidad de configurar opciones para determinar qué roles del sitio tienen acceso a ciertas funcionalidades o contenido. Para hacer esto, un desarrollador de plugins necesita obtener la lista de roles que existen en el sitio para usarlos en las opciones. Debido a que se pueden crear roles personalizados, no podemos asumir que los roles predeterminados son los únicos disponibles.
¿Cuál es la mejor manera de obtener esta lista?

Los roles se almacenan en la variable global $wp_roles
.
La función ideal es get_editable_roles()
de /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" es porque ofrece a otros plugins la oportunidad de filtrar la lista en caso de que alguien que no sea un administrador tenga el privilegio 'edit_users'
(y por lo tanto 'admin' debe eliminarse de la lista, de lo contrario ese usuario podría hacerse administrador). Los plugins de gestión de roles que se utilizan para crear roles personalizados son los que usarían ese filtro. Por lo demás, esta función es esencialmente get_roles()
(que no existe).
Presumiblemente, tu plugin solo ofrecerá la página de configuración en cuestión a alguien que tenga capacidades de nivel de administrador como 'manage_options'
y que básicamente sea un administrador con acceso a todos los roles, por lo que el filtro no debería afectarte.
También existe wp_dropdown_roles()
que te proporciona los roles como campos <option>
para una lista <select>
(aunque los checkboxes probablemente funcionen mejor en muchos escenarios donde estás eligiendo quién tiene acceso a algo).

Nota: Creé esta función como parte de un parche para hacer WP más seguro, así que estoy parcializado a su favor ;)

No estoy seguro si esta es la mejor solución a la pregunta, ya que según la documentación, get_editable_roles()
recupera una lista filtrada de roles de usuario que el usuario actual tiene permiso para editar. Tal vez wp_roles()
sería una mejor opción. Por favor, revisa mi respuesta.

Para aquellos que tienen un sitio multilingüe, la función
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;
}
devuelve un array localizado como este (los nombres de los roles están en idioma eslovaco):
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ľ
)
)

Así es como puedes obtener un array con todos los roles de usuario existentes y las capacidades para cada rol en WordPress. Si no deseas imprimirlo en pantalla, omite la última línea. La variable $roles en la línea 2 contendrá el array de usuarios y capacidades para que puedas usarlo como necesites. A continuación se muestra un ejemplo del array devuelto.
global $wp_roles;
$roles = $wp_roles->roles;
// imprimirlo en pantalla
echo '<pre>' . print_r( $roles, true ) . '</pre>';

No estoy seguro de que la respuesta aceptada sea la mejor solución a la pregunta, ya que según la documentación, get_editable_roles()
recupera una lista filtrada de roles de usuario que el usuario actual tiene permiso para editar.
Tal vez solo necesitemos usar wp_roles()
. Esta función recupera la instancia global de WP_Roles
y la instancia si es necesario. Y si solo quieres un array con los IDs de los roles como claves y los nombres como valores, puedes hacer esto:
$roles = wp_roles()->get_names();

Aquí está cómo puedes encontrar la lista de roles sin necesidad de plugins o funciones http://screencast.com/t/uaWsGLAR3Sh
