Obtenir plusieurs rôles avec get_users

11

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 );
foreach ($users as $user) $users_array[$user->ID] = $user->display_name;

Je souhaite obtenir davantage 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

    
posée blogjunkie 18.01.2012 - 13:09

8 réponses

18

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 tiré de la façon dont WP_User_Query gère le paramètre role , si cela vous intéresse.

    
réponse donnée Andy Adams 24.02.2013 - 04:21
16

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

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

Donc pour inclure les rôles abonné , contributeur et auteur , nous pouvons simplement utiliser:

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

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

    
réponse donnée birgire 23.11.2015 - 16:50
13

J'ai réussi à résoudre ce problème 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();
    
réponse donnée blogjunkie 21.01.2012 - 17:40
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Étant donné que 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.

    
réponse donnée ksloan 29.08.2013 - 19:42
3

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, l'utilisation de sa méta-requête entraînera une requête très lente (en interne, un nouveau INNER JOIN est créé pour 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)
));

?>

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

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
    
réponse donnée inxilpro 06.03.2014 - 22:25
1

Vous pouvez simplement fusionner davantage de résultats de requête utilisateur. Supposons que vous souhaitiez inclure les rôles Author et Editor . Définissez la requête pour chaque observation, puis utilisez array_merge pour effectuer la consolidation dans un tableau unique.

$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";
    
réponse donnée pax 31.01.2014 - 19:04
0

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.

    
réponse donnée 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";
}
?>
    
réponse donnée Charan Dass 06.02.2017 - 06:20

Lire d'autres questions sur les étiquettes