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

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ę!


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

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.


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

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

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.


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";
}
?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.