Obtener múltiples roles con get_users
Tengo un código como este:
$query_args = array();
$query_args['fields'] = array( 'ID', 'display_name' );
$query_args['role'] = 'subscriber';
$users = get_users( $query_args );
foreach ($users as $user) $users_array[$user->ID] = $user->display_name;
Quiero obtener más roles e incluir también contributor
, author
y algunos roles personalizados que creé con el plugin Role Scoper, por ejemplo Manager
, etc. ¿Alguna idea de cómo puedo hacer esto con get_users
?
Gracias

Avance rápido a WordPress 4.4 - ¡soportará el atributo role__in
!
Parece que WordPress 4.4 es nuestro número de versión afortunado, porque soportará tanto los atributos role__in
como role__not_in
de la clase WP_User_Query
.
Así que para incluir los roles de suscriptor, colaborador y autor, podemos simplemente usar:
$users = get_users( [ 'role__in' => [ 'subscriber', 'contributor', 'author' ] ] );
¡Consulta el ticket #22212 para conocer toda la historia!

También puedes hacer esto mediante una única llamada a get_users
o usando una sola instancia de WP_User_Query
aprovechando el argumento meta_query
:
global $wpdb;
$blog_id = get_current_blog_id();
$user_query = new WP_User_Query( array(
'meta_query' => array(
'relation' => 'OR',
array(
'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
'value' => 'role_one',
'compare' => 'like'
),
array(
'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
'value' => 'role_two',
'compare' => 'like'
)
)
) );
El meta_query
se extrae de cómo WP_User_Query
maneja el parámetro role
, por si estás interesado.

@Andy-Adams Gracias por compartir. Esto solo parece mostrar todos los roles para mí. ¿Esto todavía funciona para ti?

@helgatheviking ¿Qué roles estás comparando, específicamente? Podría depender de cuáles son los nombres de los roles.

@AndyAdams Estoy intentando integrar esto en mi plugin Simple User Listing, así que estoy tratando de hacer que funcione para cualquier combinación de roles. En mi sitio local, he probado con administrador y editor, pero al recorrer los resultados todos los demás roles aún se incluyen.

Podría recomendarte usar el plugin Debug Queries para ver qué consulta SQL se está generando. Muchas veces esto me ayuda a entender por qué obtengo resultados inesperados. http://wordpress.org/plugins/debug-queries/

Logré resolver esto usando esta función:
function get_clients() {
$users = array();
$roles = array('subscriber', 'custom_role1', 'custom_role2');
foreach ($roles as $role) :
$users_query = new WP_User_Query( array(
'fields' => 'all_with_meta',
'role' => $role,
'orderby' => 'display_name'
) );
$results = $users_query->get_results();
if ($results) $users = array_merge($users, $results);
endforeach;
return $users;
}
Luego en mi tema puedo hacer esto:
$users_array = get_clients();

$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );
Dado que get_users()
devuelve un array de usuarios que coinciden con la cadena de consulta proporcionada como parámetro. Simplemente ejecuta la consulta get_users()
para cada rol que desees por separado y combina los resultados. Luego puedes iterar a través de $users
de la misma manera que lo habrías hecho normalmente.

¿Podrías proporcionar más información que explique por qué esto resuelve el problema?

El problema con usar array_merge
es que no puedes utilizar paginación. Realmente me gusta la solución de @Andy Adams, pero si estás buscando en muchos roles, usar su consulta meta resultará en una consulta muy lenta (internamente hace un nuevo INNER JOIN
por cada consulta meta).
Mi solución es usar una consulta meta con expresión regular:
<?php
global $wpdb;
$blog_id = get_current_blog_id();
$roles = array('editor', 'administrator');
$meta_query = array(
'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',
'value' => '"(' . implode('|', array_map('preg_quote', $roles)) . ')"',
'compare' => 'REGEXP'
);
$user_query = new WP_User_Query(array(
'meta_query' = array($meta_query)
));
?>
Esto genera una consulta que luce algo así:
array(
'meta_query' => array(
array(
'key' => 'wp_capabilities'
'value' => '"(editor|administrator)"'
'compare' => 'REGEXP'
)
)
);

Podrías simplemente combinar más resultados de consulta de usuarios. Digamos que deseas incluir tanto los roles de Author
como de Editor
. Define la consulta para cada caso y luego usa array_merge para consolidar en un solo arreglo.
$xuser_query = new WP_user_query(array( 'role' => 'Author'));
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);
// más adelante quizás quieras hacer algún tipo de ordenamiento
// del arreglo resultante de objetos antes de recorrerlo:
if (!empty( $mergedRoles->results ) ) {
foreach ( $mergedRoles->results as $user ) {
echo $user->display_name;
}
else echo "nada, no se encontraron usuarios";

Hola, puedes usar esta forma sencilla
$admins = get_users( array(
'role__in' => array('administrator', 'editor', 'author'),
'fields' => array( 'ID' ),
) );
$admins_ids = wp_list_pluck( $admins, 'ID' );
$users = get_users(array(
'exclude' => $admins_ids,
'fields' => array( 'ID' ),
) );
$users_ids = wp_list_pluck( $users, 'ID' );

Todos los parámetros de la función get_users son opcionales. Si no especificas nada, obtendrás un array que contiene objetos correspondientes a cada usuario del blog actual, incluyendo aquellos con roles personalizados.

<?php
// Consulta para obtener usuarios con rol de Autor
$xuser_query = new WP_user_query(array( 'role' => 'Author'));
// Consulta para obtener usuarios con rol de Editor
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
// Combinar los resultados de ambas consultas
$mergedRoles = array_merge($xuser_query->results, $xuser_query->results);
// Más adelante podrías querer ordenar
// el array resultante de objetos antes de recorrerlo:
if (!empty( $mergedRoles ) ) {
// Recorrer los usuarios combinados
foreach ( $mergedRoles as $user ) {
echo $user->display_name;
}
} else {
echo "No se encontraron usuarios";
}
?>
