Obtenga múltiples roles con get_users

11

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 y también incluir contributor , author y algunos roles personalizados que creé con el complemento Role Scoper, por ejemplo. Manager , etc. ¿Alguna idea de cómo puedo hacer esto con get_users ?

Gracias

    
pregunta blogjunkie 18.01.2012 - 13:09

8 respuestas

18

También puede hacer esto a través de una sola llamada a get_users o usando un solo WP_User_Query haciendo uso del 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 , si está interesado.

    
respondido por el Andy Adams 24.02.2013 - 04:21
16

Avance rápido a WordPress 4.4 - ¡admitirá el atributo role__in !

Parece que WordPress 4.4 es nuestro número de versión afortunada , porque admitirá los atributos role__in y role__not_in de la clase WP_User_Query .

Entonces, para incluir los roles suscriptor , contribuidor y autor , simplemente podemos usar:

$users = get_users( [ 'role__in' => [ 'subscriber', 'subscriber', 'author' ] ] );

Revise el boleto # 22212 para ver toda la historia

    
respondido por el birgire 23.11.2015 - 16:50
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;
}

Entonces en mi tema puedo hacer esto:

$users_array = get_clients();
    
respondido por el blogjunkie 21.01.2012 - 17:40
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Dado que get_users() devuelve una matriz de usuarios que coinciden con la cadena de consulta dada como parámetro. Simplemente ejecute la consulta get_users() para cada rol que desee por separado y combine los resultados. A continuación, puede recorrer $users de la misma manera que tendría de otra manera.

    
respondido por el ksloan 29.08.2013 - 19:42
3

El problema con el uso de array_merge es que no se puede usar la paginación. Realmente me gusta la solución de @Andy Adams, pero si está buscando muchos roles, el uso de su meta consulta dará como resultado una consulta muy lenta (internamente hace un nuevo INNER JOIN para cada meta consulta) .

Mi solución es usar una meta consulta de 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 se parece a algo como:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
    
respondido por el inxilpro 06.03.2014 - 22:25
1

Usted podría simplemente fusionar más resultados de consulta del usuario. Supongamos que desea incluir los roles Author y Editor . Defina la consulta para cada caso y luego utilice array_merge para consolidar en una sola matriz.

$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);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles->results ) ) {
 foreach ( $mergedRoles->results as $user ) { 
        echo $user->display_name;
      }
 else echo "nada, no users found";
    
respondido por el pax 31.01.2014 - 19:04
0

Todos los parámetros de la función get_users son opcionales. Si no especifica nada, obtendrá una matriz que contiene objetos correspondientes a todos y cada uno de los usuarios del blog actual, incluidos los que tienen roles personalizados.

    
respondido por el Tomas Buteler 18.01.2012 - 23:32
0
<?php 
$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);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles) ) {

    foreach ( $mergedRoles as $user ) { 
        echo $user->display_name;
    }

} else {
    echo "nada, no users found";
}
?>
    
respondido por el Charan Dass 06.02.2017 - 06:20

Lea otras preguntas en las etiquetas