Holen Sie sich mit get_users mehrere Rollen

10

Ich habe einen Code wie diesen:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'subscriber';
$ users = get_users ($ query_args);
foreach ($ users als $ user) $ users_array [$ user-> ID] = $ user-> display_name;

Ich möchte mehr Rollen erhalten und auch einige benutzerdefinierte Rollen einschließen contributor, die authorich mit dem Role Scoper-Plugin erstellt habe, z. B. Managerusw. Haben Sie Ideen, wie ich dies tun kann get_users?

Vielen Dank

Blogjunkie
quelle

Antworten:

19

Schneller Vorlauf zu WordPress 4.4 - es wird das role__inAttribut unterstützen!

Es sieht so aus, als ob WordPress 4.4 unsere glückliche Versionsnummer ist , da es sowohl die role__inals auch die role__not_inAttribute der WP_User_QueryKlasse unterstützt.

Um die Rollen der Abonnenten , Mitwirkenden und Autoren einzuschließen, können wir einfach Folgendes verwenden:

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

Schauen Sie sich das Ticket Nr. 22212 für die ganze Geschichte an!

Birgire
quelle
1
Sie wurden offiziell birgireV4.4 genannt, die neue und verbesserte Version ;-)
Pieter Goosen
1
hehe cool, das klingt auch nach einer Premium-Wodka-Marke ( Wiki ) ;-) @PieterGoosen
Birgire
18

Sie können dies auch über einen einzelnen Aufruf get_usersoder über einen einzelnen Aufruf tun, WP_User_Queryindem Sie das folgende meta_queryArgument verwenden:

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

Der meta_queryaus wie gezogen WP_User_QueryGriffe der roleParameter, wenn Sie interessiert sind .

Andy Adams
quelle
@ Andy-Adams Danke fürs Teilen. Dies scheint nur alle Rollen für mich anzuzeigen . Funktioniert das noch für dich?
Helgatheviking
@helgatheviking Welche Rollen vergleichen Sie speziell? Dies kann von den Rollennamen abhängen.
Andy Adams
@AndyAdams Ich versuche, dies in mein Plugin für einfache Benutzerlisten zu integrieren, daher versuche ich, es für eine beliebige Kombination von Rollen zum Laufen zu bringen. Auf meiner lokalen Site habe ich versucht, Administrator und Editor zu verwenden, aber beim Durchlaufen der Ergebnisse sind alle anderen Rollen weiterhin enthalten.
Helgatheviking
Ich kann empfehlen, das Plugin Debug Queries zu verwenden, um zu sehen, welche SQL-Abfrage generiert wird. Oft hilft mir das herauszufinden, warum ich unerwartete Ergebnisse erhalte. wordpress.org/plugins/debug-queries
Andy Adams
12

Ich habe es geschafft, dies mit dieser Funktion zu lösen:

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

Dann kann ich in meinem Thema Folgendes tun:

$users_array = get_clients();
Blogjunkie
quelle
1
Dies ist die beste Option, die mir begegnet ist. Vielen Dank.
Jake
@blogjunkie Neugierig, aber wie gut funktioniert das?
Helgatheviking
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Since get_users()gibt ein Array von Benutzern zurück, die mit der als Parameter angegebenen Abfragezeichenfolge übereinstimmen. Führen get_users()Sie einfach die Abfrage für jede gewünschte Rolle separat aus und führen Sie die Ergebnisse zusammen. Sie können dann auf $usersdie gleiche Weise durchlaufen, wie Sie es sonst getan hätten.

ksloan
quelle
1
Können Sie bitte weitere Informationen dazu geben, warum dies das Problem löst?
GhostToast
Ich habe die ursprüngliche Antwort bearbeitet, um besser zu erklären, warum es funktioniert.
Ksloan
Ich habe das als verwendet $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, und es hat sehr gut funktioniert. Vielen Dank!
Guit4eva
3

Das Problem bei der Verwendung array_mergeist, dass Sie die Paginierung nicht verwenden können. Ich mag die Lösung von @Andy Adams sehr, aber wenn Sie nach vielen Rollen suchen, führt die Verwendung seiner Meta-Abfrage zu einer sehr langsamen Abfrage (intern führt sie eine neue ausINNER JOIN für jede Metaabfrage Abfrage durchgeführt).

Meine Lösung besteht darin, eine Metaabfrage mit regulären Ausdrücken zu verwenden:

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

?>

Dies erzeugt eine Abfrage, die ungefähr so ​​aussieht:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
inxilpro
quelle
1

Sie können einfach mehr Benutzerabfrageergebnisse zusammenführen. Angenommen, Sie möchten sowohl Authorals auch EditorRollen einschließen . Definieren Sie die Abfrage für jeden Fall und konsolidieren Sie sie mit array_merge in einem einzigen 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";
pax
quelle
0

Alle Parameter der Funktion get_users sind optional. Wenn Sie nichts angeben, erhalten Sie ein Array, das Objekte enthält, die jedem einzelnen Benutzer des aktuellen Blogs entsprechen, einschließlich solcher mit benutzerdefinierten Rollen.

Tomas Buteler
quelle
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";
}
?>
Charan Dass
quelle