รับหลายบทบาทด้วย get_users


10

ฉันได้รับรหัสเช่นนี้:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'ผู้สมัครสมาชิก';
$ users = get_users ($ query_args);
foreach ($ users เป็น $ user) $ users_array [$ user-> ID] = $ user-> display_name;

ฉันต้องการที่จะได้รับบทบาทที่มากขึ้นและยังรวมcontributor, authorและบางบทบาทที่กำหนดเองที่ฉันสร้างขึ้นด้วยบทบาท Scoper ปลั๊กอินเช่นManagerฯลฯ ความคิดใด ๆ วิธีการที่ฉันสามารถทำได้ด้วยget_users?

ขอบคุณ

คำตอบ:


20

Fastforward to WordPress 4.4 - จะรองรับrole__inคุณสมบัติ!

ดูเหมือนว่า WordPress 4.4 เป็นหมายเลขรุ่นนำโชคของเราเพราะจะรองรับทั้งคุณสมบัติrole__inและrole__not_inคุณสมบัติของWP_User_Queryคลาส

ดังนั้นจะรวมสมาชิก , ผู้สนับสนุนและผู้เขียนบทบาทเราก็สามารถใช้:

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

ลองดูตั๋ว# 22212สำหรับเรื่องราวทั้งหมด!


1
คุณได้รับการขนานนามอย่างเป็นทางการ birgireV4.4 รุ่นใหม่และปรับปรุง ;-)
Pieter Goosen

1
hehe cool, ที่ฟังดูเหมือนวอดก้าระดับพรีเมียม ( wiki ) ;-) @PieterGoosen
birgire

18

คุณสามารถทำได้ผ่านการโทรครั้งเดียวไปยังget_usersหรือใช้เพียงครั้งเดียวWP_User_Queryโดยใช้meta_queryอาร์กิวเมนต์:

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_queryนั้นจะถูกดึงจากวิธีWP_User_Queryจัดการกับroleพารามิเตอร์หากคุณสนใจ


@ Andy-Adams ขอบคุณสำหรับการแบ่งปัน ดูเหมือนว่าจะแสดงบทบาททั้งหมดให้ฉันเท่านั้น นี่ยังใช้งานได้สำหรับคุณหรือไม่
helgatheviking

@helgatheviking คุณเปรียบเทียบบทบาทอย่างไรโดยเฉพาะ มันอาจขึ้นอยู่กับชื่อบทบาท
Andy Adams

@AndyAdams ฉันพยายามทำให้มันเป็นปลั๊กอินง่าย ๆ ในรายชื่อผู้ใช้ของฉันดังนั้นฉันจึงพยายามทำให้มันใช้งานได้สำหรับทุกบทบาท บนไซต์ในพื้นที่ของฉันฉันได้ลองผู้ดูแลระบบและผู้แก้ไข แต่การวนลูปผ่านผลลัพธ์ทั้งหมดยังมีบทบาทอื่น ๆ รวมอยู่ด้วย
helgatheviking

ฉันอาจแนะนำให้ใช้ปลั๊กอิน Debug Queries เพื่อดูว่าคิวรี่ SQL ใดถูกสร้างขึ้น หลายครั้งที่สิ่งนี้ช่วยให้ฉันเข้าใจว่าทำไมฉันถึงได้รับผลลัพธ์ที่ไม่คาดคิด wordpress.org/plugins/debug-queries
Andy Adams

12

ฉันจัดการเพื่อแก้ปัญหานี้โดยใช้ฟังก์ชั่นนี้:

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

จากนั้นในชุดรูปแบบของฉันฉันสามารถทำสิ่งนี้:

$users_array = get_clients();

1
นี่คือตัวเลือกที่ดีที่สุดที่ฉันเจอ ขอบคุณ
Jake

@blogjunkie อยากรู้อยากเห็น แต่การเรียงลำดับนี้ดีแค่ไหน?
helgatheviking

4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

ตั้งแต่get_users()ส่งกลับอาร์เรย์ของผู้ใช้ที่ตรงกับสตริงแบบสอบถามที่กำหนดเป็นพารามิเตอร์ เพียงเรียกใช้get_users()แบบสอบถามสำหรับทุกบทบาทที่คุณต้องการแยกจากกันและผสานผลลัพธ์ จากนั้นคุณสามารถวนซ้ำ$usersในแบบเดียวกับที่คุณมี


1
คุณกรุณาให้ข้อมูลเพิ่มเติมเพื่ออธิบายว่าทำไมจึงแก้ปัญหาได้
GhostToast

ฉันแก้ไขคำตอบดั้งเดิมเพื่ออธิบายว่าทำไมจึงทำงานได้ดีขึ้น
ksloan

ฉันใช้สิ่งนี้เป็น$users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));และมันทำงานได้ดี ขอบคุณ!
Guit4eva

3

ปัญหาเกี่ยวกับการใช้array_mergeคือคุณไม่สามารถใช้เลขหน้าได้ ผมชอบวิธีการแก้ปัญหา @Andy อดัมส์ แต่ถ้าคุณค้นหาอยู่ในหลายบทบาทโดยใช้แบบสอบถามเมตาของเขาจะส่งผลในการช้ามากแบบสอบถาม (ภายในมันไม่ใหม่INNER JOINสำหรับแต่ละแบบสอบถามเมตา)

โซลูชันของฉันคือการใช้แบบสอบถามเมตานิพจน์ปกติ:

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

?>

สิ่งนี้จะสร้างคิวรีที่มีลักษณะดังนี้:

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

1

คุณสามารถรวมผลลัพธ์ข้อความค้นหาของผู้ใช้เพิ่มเติมได้ สมมติว่าคุณต้องการรวมทั้งAuthorและEditorบทบาท กำหนดคิวรีสำหรับแต่ละเคสจากนั้นใช้array_mergeเพื่อรวมเข้าในอาร์เรย์เดียว

$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

พารามิเตอร์ทั้งหมดจากฟังก์ชันget_usersเป็นทางเลือก หากคุณไม่ได้ระบุอะไรเลยคุณจะได้รับอาร์เรย์ที่มีวัตถุที่สอดคล้องกับผู้ใช้แต่ละคนของบล็อกปัจจุบันรวมถึงวัตถุที่มีบทบาทที่กำหนดเอง


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";
}
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.