Ottenere utenti con ruoli multipli usando get_users

18 gen 2012, 14:09:07
Visualizzazioni: 44.4K
Voti: 12

Ho del codice come questo:

$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;

Voglio ottenere più ruoli e includere anche contributor, author e alcuni ruoli personalizzati che ho creato con il plugin Role Scoper, ad esempio Manager, ecc. Qualche idea su come posso farlo con get_users?

Grazie

0
Tutte le risposte alla domanda 9
1
31

Avanzamento rapido a WordPress 4.4 - supporterà l'attributo role__in!

Sembra che WordPress 4.4 sia il nostro numero di versione fortunato, perché supporterà sia gli attributi role__in che role__not_in della classe WP_User_Query.

Quindi per includere i ruoli subscriber, contributor e author, possiamo semplicemente usare:

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

Dai un'occhiata al ticket #22212 per tutta la storia!

23 nov 2015 17:50:18
Commenti

Sei stato ufficialmente nominato birgireV4.4, la versione nuova e migliorata ;-)

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

Puoi anche farlo con una singola chiamata a get_users o utilizzando una singola WP_User_Query sfruttando l'argomento 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'
        )
    )
) );

Il meta_query è derivato da come WP_User_Query gestisce il parametro role, se sei interessato.

24 feb 2013 05:21:38
Commenti

@Andy-Adams Grazie per la condivisione. Sembra che questo mostri solo tutti i ruoli per me. Funziona ancora per te?

helgatheviking helgatheviking
25 lug 2013 19:41:42

@helgatheviking Quali ruoli stai confrontando, nello specifico? Potrebbe dipendere dai nomi dei ruoli.

Andy Adams Andy Adams
25 lug 2013 21:32:04

@AndyAdams Sto cercando di integrarlo nel mio plugin Simple User Listing, quindi sto cercando di farlo funzionare per qualsiasi combinazione di ruoli. Sul mio sito locale, ho provato con amministratore e editore, ma ciclando attraverso i risultati tutti gli altri ruoli sono ancora inclusi.

helgatheviking helgatheviking
25 lug 2013 23:03:02

Potrei consigliare di utilizzare il plugin Debug Queries per vedere quale query SQL viene generata. Molte volte questo mi aiuta a capire perché ottengo risultati inaspettati. http://wordpress.org/plugins/debug-queries/

Andy Adams Andy Adams
26 lug 2013 04:06:10
2
13

Sono riuscito a risolvere questo problema utilizzando questa funzione:

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;
}

Poi nel mio tema posso fare questo:

$users_array = get_clients();
21 gen 2012 18:40:32
Commenti

Questa è la migliore opzione che ho trovato. Grazie.

Jake Jake
12 ott 2012 21:44:02

@blogjunkie Curioso, ma quanto bene ordina questo?

helgatheviking helgatheviking
25 lug 2013 18:28:55
3
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Poiché get_users() restituisce un array di utenti che corrispondono alla stringa di query passata come parametro. Basta eseguire la query get_users() separatamente per ogni ruolo desiderato e unire i risultati. Successivamente puoi iterare attraverso $users nello stesso modo in cui avresti fatto altrimenti.

29 ago 2013 20:42:17
Commenti

Puoi fornire maggiori informazioni che spieghino perché questa soluzione risolve il problema?

GhostToast GhostToast
29 ago 2013 21:33:33

Ho modificato la risposta originale per spiegare meglio perché funziona.

ksloan ksloan
31 ago 2013 08:34:54

L'ho usato così $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, e ha funzionato perfettamente. Grazie!

Guit4eva Guit4eva
2 set 2015 16:45:19
0

Il problema con l'uso di array_merge è che non puoi utilizzare la paginazione. Mi piace molto la soluzione di @Andy Adams, ma se stai cercando su molti ruoli, l'utilizzo della sua meta query risulterà in una query molto lenta (internamente esegue un nuovo INNER JOIN per ogni meta query).

La mia soluzione è utilizzare una meta query con espressione regolare:

<?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)
));

?>

Questo genera una query simile a:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
6 mar 2014 23:25:44
0

Puoi semplicemente unire i risultati di più query sugli utenti. Supponiamo che tu voglia includere sia i ruoli Autore che Editore. Definisci la query per ogni caso e poi utilizza array_merge per consolidare in un singolo array.

$xuser_query = new WP_user_query(array( 'role' => 'Autore'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editore'));
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// successivamente potresti voler effettuare un ordinamento 
// dell'array risultante di oggetti prima di iterare su di esso:

if (!empty( $mergedRoles->results ) ) {
 foreach ( $mergedRoles->results as $user ) { 
        echo $user->display_name;
      }
 else echo "nessun utente trovato";
31 gen 2014 20:04:37
0

Ciao, puoi utilizzare questo semplice metodo

$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

Tutti i parametri della funzione get_users sono opzionali. Se non specifichi nulla, otterrai un array che contiene oggetti corrispondenti a ciascun utente del blog corrente, inclusi quelli con ruoli personalizzati.

19 gen 2012 00:32:44
0
<?php 
// Query per gli utenti con ruolo Autore
$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
// Query per gli utenti con ruolo Editor
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));

// Unione dei risultati delle due query
$mergedRoles = array_merge($xuser_query->results, $xuser_query->results);

// Più avanti potresti voler fare un ordinamento
// dell'array risultante prima di ciclarlo:

if (!empty($mergedRoles)) {
    // Ciclo attraverso gli utenti trovati
    foreach ($mergedRoles as $user) { 
        echo $user->display_name;
    }
} else {
    echo "nessun utente trovato";
}
?>
6 feb 2017 07:20:48