Ottenere utenti con ruoli multipli usando get_users
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

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!

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.

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

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

@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.

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/

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

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

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

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

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

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

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

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.

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