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
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.
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!
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();
$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.
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'
)
)
);
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";
<?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";
}
?>
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.