Obtenez plusieurs rôles avec get_users

10

J'ai un code comme celui-ci:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'abonné';
$ users = get_users ($ query_args);
foreach ($ users as $ user) $ users_array [$ user-> ID] = $ user-> display_name;

Je veux obtenir plus de rôles et également inclure contributor, authoret certains rôles personnalisés que j'ai créés avec le plugin Role Scoper Manager, par exemple , etc. Des idées sur la façon dont je peux le faire get_users?

Merci

blogjunkie
la source

Réponses:

20

Avance rapide vers WordPress 4.4 - il prendra en charge l' role__inattribut!

Il semble que WordPress 4.4 soit notre numéro de version chanceux , car il prendra en charge à la fois les attributs role__inet role__not_inla WP_User_Queryclasse.

Ainsi, pour inclure les rôles d' abonné , de contributeur et d' auteur , nous pouvons simplement utiliser:

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

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

Birgire
la source
1
Vous avez été officiellement surnommé birgireV4.4, la nouvelle version améliorée ;-)
Pieter Goosen
1
hehe cool, cela ressemble aussi à une marque de vodka premium ( wiki ) ;-) @PieterGoosen
birgire
18

Vous pouvez également le faire via un seul appel get_usersou en utilisant un seul WP_User_Queryen utilisant l' meta_queryargument:

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_queryest tiré de la façon dont WP_User_Querygère le roleparamètre, si cela vous intéresse.

Andy Adams
la source
@ Andy-Adams Merci pour le partage. Cela semble seulement afficher tous les rôles pour moi. Est-ce que cela fonctionne toujours pour vous?
helgatheviking
@helgatheviking Quels rôles comparez-vous en particulier? Cela peut dépendre du nom des rôles.
Andy Adams
@AndyAdams J'essaye de travailler ceci dans mon plugin Simple User Listing, donc j'essaye de le faire fonctionner pour n'importe quelle combinaison de rôles. Sur mon site local, j'ai essayé l'administrateur et l'éditeur, mais en parcourant les résultats, tous les autres rôles sont toujours inclus.
helgatheviking
Je pourrais recommander d'utiliser le plugin Debug Queries pour voir quelle requête SQL est générée. Souvent, cela m'aide à comprendre pourquoi j'obtiens des résultats inattendus. wordpress.org/plugins/debug-queries
Andy Adams
12

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 le faire:

$users_array = get_clients();
blogjunkie
la source
1
C'est la meilleure option que j'ai rencontrée. Merci.
Jake
@blogjunkie Curieux, mais comment fonctionne ce tri?
helgatheviking
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Depuis get_users()retourne un tableau d'utilisateurs qui correspondent à la chaîne de requête donnée en paramètre. Exécutez simplement la get_users()requête pour chaque rôle que vous souhaitez séparément et fusionnez les résultats. Vous pouvez ensuite parcourir $usersla même manière que vous auriez autrement.

ksloan
la source
1
Pouvez-vous fournir plus d'informations expliquant pourquoi cela résout le problème?
GhostToast
J'ai édité la réponse originale pour mieux expliquer pourquoi cela fonctionne.
ksloan
Je l'ai utilisé comme $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));ça et ça a fonctionné un régal. Merci!
Guit4eva
3

Le problème avec l'utilisation array_mergeest que vous ne pouvez pas utiliser la pagination. J'aime vraiment la solution de @Andy Adams, mais si vous recherchez de nombreux rôles, l'utilisation de sa méta-requête entraînera une requête très lente (en interne, elle fait une nouvelle INNER JOINpour 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'
        )
    )
);
inxilpro
la source
1

Vous pouvez simplement fusionner davantage de résultats de requête utilisateur. Supposons que vous souhaitiez inclure les rôles Authoret les deux Editor. Définissez la requête pour chaque cas, puis utilisez array_merge pour consolider en 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";
pax
la source
0

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

Tomas Buteler
la source
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
la source