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

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!


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

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.


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

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

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.


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";
}
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.