Obținerea mai multor roluri cu get_users
Am un cod de genul acesta:
$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;
Vreau să obțin mai multe roluri și să includ și contributor
, author
și câteva roluri personalizate pe care le-am creat cu plugin-ul Role Scoper, de exemplu Manager
, etc. Aveți idei cum pot face asta cu get_users
?
Mulțumesc

Avans rapid la WordPress 4.4 - va suporta atributul role__in
!
Se pare că WordPress 4.4 este numărul nostru norocos de versiune, deoarece va suporta atât atributul role__in
cât și role__not_in
din clasa WP_User_Query
.
Deci, pentru a include rolurile de subscriber, contributor și author, putem folosi simplu:
$users = get_users( [ 'role__in' => [ 'subscriber', 'contributor', 'author' ] ] );
Consultă tichetul #22212 pentru întreaga poveste!

Puteți face acest lucru și printr-un singur apel la get_users
sau folosind o singură interogare WP_User_Query
prin utilizarea argumentului 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', // rolul_unu
'compare' => 'like'
),
array(
'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
'value' => 'role_two', // rolul_doi
'compare' => 'like'
)
)
) );
Argumentul meta_query
este preluat din modul în care WP_User_Query
gestionează parametrul role
, dacă sunteți interesat.

@Andy-Adams Mulțumesc pentru partajare. Se pare că pentru mine afișează toate rolurile. Încă funcționează pentru tine?

@helgatheviking Ce roluri compari, mai exact? Ar putea depinde de numele rolurilor.

@AndyAdams Încerc să integrez asta în plugin-ul meu Simple User Listing, așa că încerc să fac să funcționeze pentru orice combinație de roluri. Pe site-ul meu local, am încercat administrator și editor, dar în bucla de rezultate sunt incluse toate celelalte roluri.

Aș putea recomanda utilizarea plugin-ului Debug Queries pentru a vedea ce interogare SQL este generată. De multe ori, acest lucru mă ajută să înțeleg de ce obțin rezultate neașteptate. http://wordpress.org/plugins/debug-queries/

Am reușit să rezolv această problemă folosind următoarea funcție:
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;
}
Apoi în tema mea pot face asta:
$users_array = get_clients();

$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );
Deoarece get_users()
returnează un array de utilizatori care corespund șirului de interogare dat ca parametru. Pur și simplu rulează interogarea get_users()
pentru fiecare rol pe care îl dorești separat și apoi unifică rezultatele. Apoi poți parcurge $users
în același mod în care ai fi făcut-o altfel.

Poți să oferi mai multe informații care să explice de ce această soluție rezolvă problema?

Am editat răspunsul original pentru a explica mai bine de ce funcționează.

Problema cu folosirea funcției array_merge
este că nu poți utiliza paginarea. Soluția propusă de @Andy Adams este una pe care o apreciez, dar dacă cauți în mai multe roluri, folosirea interogării meta va rezulta într-o interogare foarte lentă (în interior, se realizează un nou INNER JOIN
pentru fiecare interogare meta).
Soluția mea este utilizarea unei interogări meta cu expresie regulată:
<?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)
));
?>
Aceasta generează o interogare care arată cam așa:
array(
'meta_query' => array(
array(
'key' => 'wp_capabilities'
'value' => '"(editor|administrator)"'
'compare' => 'REGEXP'
)
)
);

Poți simplu să combini rezultatele din mai multe interogări de utilizatori. Să presupunem că vrei să incluzi atât rolurile de Autor
cât și de Editor
. Definești interogarea pentru fiecare caz, apoi folosești array_merge pentru a consolida într-un singur array.
$xuser_query = new WP_user_query(array( 'role' => 'Autor'));
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);
// ulterior, poți dori să faci o sortare
// a array-ului rezultat de obiecte înainte de a parcurge:
if (!empty( $mergedRoles->results ) ) {
foreach ( $mergedRoles->results as $user ) {
echo $user->display_name;
}
else echo "nimic, nu s-au găsit utilizatori";

Salut, poți folosi această metodă simplă
$admins = get_users( array(
'role__in' => array('administrator', 'editor', 'author'),
'fields' => array( 'ID' ),
) );
$admins_ids = wp_list_pluck( $admins, 'ID' );
$users = get_users(array(
'exclude' => $admins_ids,
'fields' => array( 'ID' ),
) );
$users_ids = wp_list_pluck( $users, 'ID' );

Toți parametrii funcției get_users sunt opționali. Dacă nu specificați nimic, veți obține un array care conține obiecte corespunzătoare fiecărui utilizator al blogului curent, inclusiv cei cu roluri personalizate.

<?php
// Interogare pentru utilizatorii cu rolul de Autor
$xuser_query = new WP_user_query(array( 'role' => 'Author'));
// Interogare pentru utilizatorii cu rolul de Editor
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
// Combină rezultatele celor două interogări
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);
// Opțional: aici poți adăuga logica de sortare
// a array-ului rezultat înainte de a-l parcurge:
if (!empty( $mergedRoles) ) {
// Parcurge fiecare utilizator și afișează numele
foreach ( $mergedRoles as $user ) {
echo $user->display_name;
}
} else {
// Mesaj afișat dacă nu sunt găsiți utilizatori
echo "niciun utilizator găsit";
}
?>
