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
@helgatheviking Ce roluri compari, mai exact? Ar putea depinde de numele rolurilor.
Andy Adams
@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.
helgatheviking
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/
Andy Adams
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?
GhostToast
Am editat răspunsul original pentru a explica mai bine de ce funcționează.
ksloan
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";
}
?>