Obtener múltiples roles con get_users

18 ene 2012, 14:09:07
Vistas: 44.4K
Votos: 12

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

0
Todas las respuestas a la pregunta 9
1
31

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!

23 nov 2015 17:50:18
Comentarios

Has sido oficialmente nombrado birgireV4.4, la versión nueva y mejorada ;-)

Pieter Goosen Pieter Goosen
23 nov 2015 17:54:07
4
19

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.

24 feb 2013 05:21:38
Comentarios

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

helgatheviking helgatheviking
25 jul 2013 19:41:42

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

Andy Adams Andy Adams
25 jul 2013 21:32:04

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

helgatheviking helgatheviking
25 jul 2013 23:03:02

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/

Andy Adams Andy Adams
26 jul 2013 04:06:10
2
13

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();
21 ene 2012 18:40:32
Comentarios

Esta es la mejor opción que he encontrado. Gracias.

Jake Jake
12 oct 2012 21:44:02

@blogjunkie Tengo curiosidad, ¿qué tan bien ordena esto?

helgatheviking helgatheviking
25 jul 2013 18:28:55
3
$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.

29 ago 2013 20:42:17
Comentarios

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

GhostToast GhostToast
29 ago 2013 21:33:33

Edité la respuesta original para explicar mejor por qué funciona.

ksloan ksloan
31 ago 2013 08:34:54

Lo usé como $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, y funcionó perfectamente. ¡Gracias!

Guit4eva Guit4eva
2 sept 2015 16:45:19
0

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'
        )
    )
);
6 mar 2014 23:25:44
0

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";
31 ene 2014 20:04:37
0

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' );
22 mar 2021 11:47:46
0

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.

19 ene 2012 00:32:44
0
<?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";
}
?>
6 feb 2017 07:20:48