Ottieni più ruoli con get_users


10

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, authore alcuni ruoli personalizzati che ho creato con il plug-in Role Scoper Manager, ad esempio , ecc. Qualche idea su come posso farlo get_users?

Grazie

Risposte:


20

Fastforward a WordPress 4.4 - supporterà l' role__inattributo!

Sembra che WordPress 4.4 è il nostro numero di versione fortunato , perché supporterà sia l' role__ine role__not_inattributi della WP_User_Queryclasse.

Quindi, per includere i ruoli di abbonato , contributore e autore , possiamo semplicemente usare:

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

Dai un'occhiata al biglietto n. 22212 per l'intera storia!


1
Sei stato ufficialmente soprannominato birgireV4.4, la versione nuova e migliorata ;-)
Pieter Goosen il

1
hehe cool, che suona anche come un marchio di vodka premium ( wiki ) ;-) @PieterGoosen
birgire

18

Puoi anche farlo tramite una singola chiamata get_userso utilizzando una singola WP_User_Queryusando l' meta_queryargomento:

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è tirato da come WP_User_Queryle maniglie del roleparametro, se siete interessati.


@ Andy-Adams Grazie per la condivisione. Questo sembra mostrare solo tutti i ruoli per me. Funziona ancora per te?
Helgatheviking,

@helgatheviking Quali ruoli stai confrontando, in particolare? Potrebbe dipendere da quali sono i nomi dei ruoli.
Andy Adams,

@AndyAdams Sto cercando di farlo funzionare nel mio plug-in di elenco utenti semplice, quindi sto cercando di farlo funzionare per qualsiasi combinazione di ruoli. Sul mio sito locale, ho provato l'amministratore e l'editor, ma continuando a scorrere i risultati tutti gli altri ruoli sono ancora inclusi.
Helgatheviking,

Potrei consigliare di utilizzare il plug-in Debug Queries per vedere quale query SQL viene generata. Molte volte questo mi aiuta a capire perché sto ottenendo risultati inaspettati. wordpress.org/plugins/debug-queries
Andy Adams,

12

Sono riuscito a risolverlo 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;
}

Quindi nel mio tema posso farlo:

$users_array = get_clients();

1
Questa è l'opzione migliore che mi sono imbattuto. Grazie.
Jake,

@blogjunkie Curioso, ma quanto bene fa questo tipo?
helgatheviking,

4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Since get_users()restituisce un array di utenti che corrispondono alla stringa di query fornita come parametro. Basta eseguire la get_users()query per ogni ruolo desiderato separatamente e unire i risultati. È quindi possibile eseguire il ciclo $usersnello stesso modo in cui si sarebbe altrimenti.


1
Potete per favore fornire maggiori informazioni spiegando perché questo risolve il problema?
GhostToast,

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

Ho usato questo come $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, e ha funzionato a meraviglia. Grazie!
Guit4eva,

3

Il problema con l'utilizzo array_mergeè che non è possibile utilizzare l'impaginazione. Mi piace molto la soluzione di @Andy Adams, ma se stai cercando molti ruoli, l'utilizzo della sua meta query genererà una query molto lenta (internamente ne fa una nuova INNER JOINper ogni meta query).

La mia soluzione è utilizzare una meta query di espressioni regolari:

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

1

Potresti semplicemente unire più risultati delle query degli utenti. Supponiamo che tu voglia includere sia ruoli Authorche Editorruoli. Definire la query per ciascun caso, quindi utilizzare array_merge per consolidare in un singolo array.

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

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles->results ) ) {
 foreach ( $mergedRoles->results as $user ) { 
        echo $user->display_name;
      }
 else echo "nada, no users found";

0

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


0
<?php 
$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));

$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles) ) {

    foreach ( $mergedRoles as $user ) { 
        echo $user->display_name;
    }

} else {
    echo "nada, no users found";
}
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.