web-dev-qa-db-fra.com

Obtenir plusieurs rôles avec get_users

J'ai un code comme celui-ci:

 $ query_args = array (); 
 $ query_args ['fields'] = array ('ID', 'display_name'); 
 $ query_args ['role'] = ' subscriber '; 
 $ users = get_users ($ query_args); 
 poureach ($ utilisateurs en tant que $ utilisateur) $ users_array [$ user-> ID] = $ utilisateur-> nom_écran; 

Je souhaite obtenir plus de rôles et inclure également contributor, author et certains rôles personnalisés que j'ai créés avec le plugin Role Scoper, par exemple. Manager, etc. Avez-vous des idées pour faire cela avec get_users?

Merci

11
blogjunkie

Vous pouvez également le faire via un seul appel à get_users ou en utilisant un seul WP_User_Query en utilisant l’argument 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'
        )
    )
) );

Le meta_query est extrait de la façon dont WP_User_Query traite le paramètre role, si cela vous intéresse.

18
Andy Adams

Fastforward à WordPress 4.4 - il supportera l'attribut role__in!

Il semble que WordPress 4.4 soit notre numéro de version lucky , car il supportera les attributs role__in et role__not_in de la classe WP_User_Query.

Donc, pour inclure les rôles subscriber, contributor et author, nous pouvons simplement utiliser:

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

Découvrez le billet # 22212 pour toute l'histoire!

18
birgire

J'ai réussi à résoudre cela en utilisant cette fonction:

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;
}

Ensuite, dans mon thème, je peux faire ceci:

$users_array = get_clients();
13
blogjunkie
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Puisque get_users() renvoie un tableau d'utilisateurs correspondant à la chaîne de requête donnée en tant que paramètre. Il suffit d’exécuter la requête get_users() pour chaque rôle souhaité séparément et de fusionner les résultats. Vous pouvez ensuite parcourir $users de la même manière que vous auriez autrement.

4
ksloan

Le problème avec array_merge est que vous ne pouvez pas utiliser la pagination. J'aime beaucoup la solution de @Andy Adams, mais si vous recherchez plusieurs rôles, utiliser sa méta-requête aura pour résultat une requête très lente (en interne, un nouveau INNER JOIN est attribué à chaque méta-requête).

Ma solution consiste à utiliser une méta-requête d'expression régulière:

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

?>

Cela génère une requête qui ressemble à quelque chose comme:

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

Vous pouvez simplement fusionner plus de résultats de requête utilisateur. Supposons que vous souhaitiez inclure les deux rôles Author et Editor. Définissez la requête pour chaque cas puis utilisez array_merge pour consolider dans un seul tableau.

$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";
1
pax
<?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";
}
?>
0
Charan Dass

Tous les paramètres de la fonction get_users sont facultatifs. Si vous ne spécifiez rien, vous obtiendrez un tableau contenant les objets correspondant à chaque utilisateur du blog actuel, y compris ceux dotés de rôles personnalisés.

0
Tomas Buteler