Dapatkan banyak peran dengan get_users

10

Saya punya beberapa kode seperti ini:

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

Saya ingin mendapatkan lebih banyak peran dan juga memasukkan contributor, authordan beberapa peran khusus yang saya buat dengan plugin Role Scoper misalnya Manager, dll. Adakah ide bagaimana saya bisa melakukan ini get_users?

Terima kasih

blogjunkie
sumber

Jawaban:

20

Fastforward ke WordPress 4.4 - itu akan mendukung role__inatribut!

Sepertinya WordPress 4.4 adalah nomor versi keberuntungan kami , karena akan mendukung atribut role__indan role__not_inatribut WP_User_Querykelas.

Jadi untuk memasukkan peran pelanggan , kontributor dan penulis , kita cukup menggunakan:

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

Lihat tiket # 22212 untuk keseluruhan cerita!

birgire
sumber
1
Anda telah secara resmi dijuluki birgireV4.4, versi baru dan lebih baik ;-)
Pieter Goosen
1
hehe cool, kedengarannya juga seperti merek vodka premium ( wiki ) ;-) @PieterGoosen
birgire
18

Anda juga dapat melakukan ini melalui satu panggilan ke get_usersatau menggunakan satu WP_User_Querydengan memanfaatkan meta_queryargumen:

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

Ini meta_queryditarik dari bagaimana WP_User_Querymenangani roleparameter, jika Anda tertarik.

Andy Adams
sumber
@ Andy-Adams Terima kasih telah berbagi. Ini sepertinya hanya menampilkan semua peran untukku. Apakah ini masih berfungsi untuk Anda?
Helgatheviking
@helgatheviking Peran apa yang Anda bandingkan, khususnya? Itu bisa tergantung pada apa nama perannya.
Andy Adams
@AndyAdams Saya mencoba mengerjakan ini ke dalam plugin Daftar Pengguna Sederhana saya, jadi saya mencoba membuatnya berfungsi untuk kombinasi peran apa pun. Di situs lokal saya, saya sudah mencoba administrator dan editor, tetapi mengulang-ulang hasil semua peran lainnya masih termasuk.
Helgatheviking
Saya mungkin merekomendasikan menggunakan plugin Debug Queries untuk melihat apa query SQL yang dihasilkan. Sering kali ini membantu saya mencari tahu mengapa saya mendapatkan hasil yang tidak terduga. wordpress.org/plugins/debug-queries
Andy Adams
12

Saya berhasil menyelesaikan ini dengan menggunakan fungsi ini:

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

Maka dalam tema saya, saya bisa melakukan ini:

$users_array = get_clients();
blogjunkie
sumber
1
Ini adalah pilihan terbaik yang saya temui. Terima kasih.
Jake
@blogjunkie Penasaran, tapi seberapa baik hal ini?
Helgatheviking
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Sejak get_users()mengembalikan array pengguna yang cocok dengan string kueri yang diberikan sebagai param. Jalankan saja get_users()kueri untuk setiap peran yang Anda inginkan secara terpisah dan gabungkan hasilnya. Anda kemudian dapat mengulang melalui $userscara yang sama seperti jika tidak.

ksloan
sumber
1
Bisakah Anda memberikan lebih banyak informasi untuk menjelaskan mengapa ini menyelesaikan masalah?
GhostToast
Saya mengedit jawaban asli untuk lebih menjelaskan mengapa itu bekerja.
ksloan
Saya menggunakan ini sebagai $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, dan itu berhasil memperlakukan. Terima kasih!
Guit4eva
3

Masalah dengan menggunakan array_mergeadalah Anda tidak dapat menggunakan pagination. Saya sangat suka solusi @Andy Adams, tetapi jika Anda mencari di banyak peran, menggunakan kueri metanya akan menghasilkan kueri yang sangat lambat (secara internal ia melakukan yang baru INNER JOINuntuk setiap kueri meta).

Solusi saya adalah menggunakan kueri meta ekspresi reguler:

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

?>

Ini menghasilkan kueri yang terlihat seperti:

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

Anda bisa menggabungkan lebih banyak hasil permintaan pengguna. Katakanlah Anda ingin memasukkan keduanya Authordan Editorperan. Tentukan permintaan untuk setiap kasus kemudian gunakan array_merge untuk mengkonsolidasikan menjadi satu 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
sumber
0

Semua parameter dari fungsi get_users adalah opsional. Jika Anda tidak menentukan apa pun, Anda akan mendapatkan larik yang berisi objek yang sesuai dengan masing-masing dan setiap pengguna blog saat ini, termasuk yang dengan peran khusus.

Tomas Buteler
sumber
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
sumber