Uzyskaj wiele ról dzięki get_users

10

Mam taki kod:

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

Chcę uzyskać więcej ról i to także contributor, authora niektóre niestandardowe role stworzyłem z rolą Scoper wtyczki np Manageritp Wszelkie pomysły w jaki sposób mogę to zrobić get_users?

Dzięki

blogjunkie
źródło

Odpowiedzi:

20

Fastforward do WordPress 4.4 - będzie obsługiwał ten role__inatrybut!

Wygląda na to, że WordPress 4.4 jest naszym szczęśliwym numerem wersji , ponieważ będzie obsługiwał zarówno atrybuty, jak role__ini role__not_inatrybuty WP_User_Queryklasy.

Tak aby uwzględnić abonenckich , specjalista i autor role, możemy po prostu użyć:

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

Sprawdź bilet # 22212 na całą historię!

birgire
źródło
1
Zostałeś oficjalnie nazwany birgireV4.4, nowa i ulepszona wersja ;-)
Pieter Goosen
1
hehe cool, to również brzmi jak marka wódki premium ( wiki ) ;-) @PieterGoosen
birgire
18

Możesz to również zrobić za pomocą pojedynczego wywołania get_userslub pojedynczego wywołania, WP_User_Querykorzystając z meta_queryargumentu:

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

meta_queryJest ciągnięty od tego, jak WP_User_Queryuchwyty na roleparametr, jeśli jesteś zainteresowany.

Andy Adams
źródło
@ Andy-Adams Dziękujemy za udostępnienie. Wydaje mi się, że wyświetla to tylko dla mnie wszystkie role. Czy to nadal działa dla Ciebie?
helgatheviking
@helgatheviking Jakie role porównujesz? Może to zależeć od nazw ról.
Andy Adams,
@AndyAdams Staram się wprowadzić to do mojej wtyczki Simple User Listing, więc staram się, aby działała ona dla dowolnej kombinacji ról. W mojej lokalnej witrynie próbowałem administratora i edytora, ale przeglądając wyniki, wszystkie pozostałe role są nadal uwzględniane.
helgatheviking
Mogę polecić użycie wtyczki Debug Queries, aby zobaczyć, jakie zapytanie SQL jest generowane. Wiele razy pomaga mi to zrozumieć, dlaczego otrzymuję nieoczekiwane wyniki. wordpress.org/plugins/debug-queries
Andy Adams
12

Udało mi się to rozwiązać za pomocą tej funkcji:

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

Następnie w moim temacie mogę to zrobić:

$users_array = get_clients();
blogjunkie
źródło
1
To najlepsza opcja, na jaką się natknąłem. Dzięki.
Jake,
@blogjunkie Ciekawe, ale jak dobrze to sortuje?
helgatheviking
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Ponieważ get_users()zwraca tablicę użytkowników pasujących do ciągu zapytania podanego jako parametr. Po prostu uruchom get_users()zapytanie dla każdej roli, którą chcesz osobno i scal wyniki. Następnie możesz wykonać pętlę w $userstaki sam sposób, jak w innym przypadku.

ksloan
źródło
1
Czy możesz podać więcej informacji wyjaśniających, dlaczego to rozwiązuje problem?
GhostToast,
Zredagowałem oryginalną odpowiedź, aby lepiej wyjaśnić, dlaczego to działa.
ksloan
Użyłem tego jako $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));i zadziałało. Dzięki!
Guit4eva,
3

Problem z używaniem array_mergepolega na tym, że nie można korzystać z paginacji. Naprawdę podoba mi się rozwiązanie @Andy Adams, ale jeśli szukasz wielu ról, użycie jego meta kwerendy spowoduje bardzo wolne zapytanie (wewnętrznie robi to nowe INNER JOINdla każdego kwerendy meta).

Moje rozwiązanie polega na użyciu meta zapytania wyrażenia regularnego:

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

?>

To generuje zapytanie, które wygląda mniej więcej tak:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
inxilpro
źródło
1

Możesz po prostu scalić więcej wyników zapytań użytkowników. Powiedzmy, że chcesz dołączyć zarówno Authori Editorrole. Zdefiniuj zapytanie dla każdego przypadku, a następnie użyj array_merge, aby skonsolidować w jedną tablicę.

$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";
patena
źródło
0

Wszystkie parametry z funkcji get_users są opcjonalne. Jeśli nic nie określisz, otrzymasz tablicę zawierającą obiekty odpowiadające każdemu użytkownikowi bieżącego bloga, w tym z niestandardowymi rolami.

Tomas Buteler
źródło
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
źródło