Obținerea mai multor roluri cu get_users

18 ian. 2012, 14:09:07
Vizualizări: 44.4K
Voturi: 12

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

0
Toate răspunsurile la întrebare 9
1
31

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!

23 nov. 2015 17:50:18
Comentarii

Ai fost numit oficial birgireV4.4, versiunea nouă și îmbunătățită ;-)

Pieter Goosen Pieter Goosen
23 nov. 2015 17:54:07
4
19

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.

24 feb. 2013 05:21:38
Comentarii

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

helgatheviking helgatheviking
25 iul. 2013 19:41:42

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

Andy Adams Andy Adams
25 iul. 2013 21:32:04

@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 helgatheviking
25 iul. 2013 23:03:02

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 Andy Adams
26 iul. 2013 04:06:10
2
13

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();
21 ian. 2012 18:40:32
Comentarii

Aceasta este cea mai bună opțiune pe care am întâlnit-o. Mulțumesc.

Jake Jake
12 oct. 2012 21:44:02

@blogjunkie Sunt curios, dar cât de bine sortează acest lucru?

helgatheviking helgatheviking
25 iul. 2013 18:28:55
3
$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.

29 aug. 2013 20:42:17
Comentarii

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

GhostToast GhostToast
29 aug. 2013 21:33:33

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

ksloan ksloan
31 aug. 2013 08:34:54

Am folosit asta ca $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, și a funcționat perfect. Mulțumesc!

Guit4eva Guit4eva
2 sept. 2015 16:45:19
0

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'
        )
    )
);
6 mar. 2014 23:25:44
0

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";
31 ian. 2014 20:04:37
0

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' );
22 mar. 2021 11:47:46
0

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.

19 ian. 2012 00:32:44
0
<?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";
}
?>
6 feb. 2017 07:20:48