Obtén múltiples roles con get_users

10

Tengo un código como este:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'suscriptor';
$ usuarios = get_users ($ query_args);
foreach ($ usuarios como $ usuario) $ users_array [$ user-> ID] = $ user-> display_name;

Quiero obtener más roles y también incluir contributor, authory algunos roles personalizados que creé con el complemento Role Scoper Manager, por ejemplo , etc. ¿Alguna idea de cómo puedo hacer esto get_users?

Gracias

blogjunkie
fuente

Respuestas:

20

Avance rápido a WordPress 4.4: ¡admitirá el role__inatributo!

Parece que WordPress 4.4 es nuestro número de versión de la suerte , porque admitirá los atributos role__iny role__not_inde la WP_User_Queryclase.

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

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

¡Mira el boleto # 22212 para toda la historia!

Birgire
fuente
1
Usted ha sido oficialmente llamado birgireV4.4, la versión nueva y mejorada ;-)
Pieter Goosen el
1
jeje genial, eso también suena como una marca de vodka premium ( wiki ) ;-) @PieterGoosen
birgire
18

También puede hacer esto a través de una sola llamada get_userso usando una sola WP_User_Queryhaciendo uso del meta_queryargumento:

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

Se meta_queryextrae de cómo WP_User_Querymaneja el roleparámetro, si está interesado.

Andy Adams
fuente
@ Andy-Adams Gracias por compartir. Esto solo parece mostrar todos los roles para mí. ¿Esto sigue funcionando para ti?
helgatheviking
@helgatheviking ¿Qué roles estás comparando específicamente? Podría depender de cuáles son los nombres de los roles.
Andy Adams
@AndyAdams Estoy tratando de incluir esto en mi complemento de Lista de usuarios simples, así que estoy tratando de que funcione para cualquier combinación de roles. En mi sitio local, probé administrador y editor, pero recorriendo los resultados todos los otros roles todavía están incluidos.
helgatheviking
Podría recomendar el uso del complemento Debug Queries para ver qué consulta SQL se está generando. Muchas veces esto me ayuda a entender por qué obtengo resultados inesperados. wordpress.org/plugins/debug-queries
Andy Adams
12

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();
blogjunkie
fuente
1
Esta es la mejor opción que he encontrado. Gracias.
Jake
@blogjunkie Curioso, pero ¿qué tan bien funciona?
helgatheviking
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 un parámetro. Simplemente ejecute la get_users()consulta para cada rol que desee por separado y combine los resultados. Luego puede recorrer de $usersla misma manera que lo hubiera hecho de otra manera.

ksloan
fuente
1
¿Puede proporcionar más información que explique por qué esto resuelve el problema?
GhostToast
Edité la respuesta original para explicar mejor por qué funciona.
ksloan
Usé esto como $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, y funcionó de maravilla. ¡Gracias!
Guit4eva
3

El problema con el uso array_mergees que no puede usar la paginación. Realmente me gusta la solución de @Andy Adams, pero si está buscando muchos roles, usar su metaconsulta resultará en una consulta muy lenta (internamente, hace una nueva INNER JOINpara cada metaconsulta).

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:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
inxilpro
fuente
1

Simplemente podría combinar más resultados de consultas de usuarios. Digamos que quieres incluir ambos Authory Editorroles. Defina la consulta para cada caso y luego use 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";
paz
fuente
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.

Tomás Buteler
fuente
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";
}
?>
Charan Dass
fuente