Nhận nhiều vai trò với get_users


10

Tôi đã có một số mã như thế này:

$ query_args = mảng ();
$ query_args ['Field'] = mảng ('ID', 'display_name');
$ query_args ['vai trò'] = 'người đăng ký';
$ users = get_users ($ query_args);
foreach ($ user as $ user) $ users_array [$ user-> ID] = $ user-> display_name;

Tôi muốn nhận được nhiều vai trò hơn và cũng bao gồm contributor, authorvà một số vai trò tùy chỉnh mà tôi đã tạo bằng plugin Role Scoper, vdManager , v.v., có ý tưởng nào tôi có thể làm điều này với get_users?

Cảm ơn

Câu trả lời:


19

Nhanh chóng chuyển sang WordPress 4.4 - nó sẽ hỗ trợ role__in thuộc tính!

Có vẻ như WordPress 4.4 là số phiên bản may mắn của chúng tôi , bởi vì nó sẽ hỗ trợ cả thuộc tính role__inrole__not_inthuộc tính củaWP_User_Query lớp.

Vì vậy, để bao gồm vai trò của người đăng ký , người đóng góptác giả , chúng ta chỉ cần sử dụng:

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

Kiểm tra vé # 22212 cho toàn bộ câu chuyện!


1
Bạn đã được chính thức đặt tên là birgireV4.4, phiên bản mới và được cải tiến ;-)
Pieter Goosen

1
hehe tuyệt, âm thanh đó cũng giống như một nhãn hiệu vodka cao cấp ( wiki ) ;-) @PieterGoosen
birgire

18

Bạn cũng có thể thực hiện việc này thông qua một cuộc gọi đến get_usershoặc sử dụng một cuộc gọi bằng WP_User_Querycách sử dụngmeta_query đối số:

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

Cái meta_queryđược lấy từ cách WP_User_Queryxử lý roletham số, nếu bạn quan tâm.


@ Andy-Adams Cảm ơn bạn đã chia sẻ. Điều này dường như chỉ hiển thị tất cả các vai trò cho tôi. Điều này vẫn còn làm việc cho bạn?
xe đạp

@helgatheviking Vai trò nào bạn đang so sánh, cụ thể? Nó có thể phụ thuộc vào tên vai trò là gì.
Andy Adams

@AndyAdams Tôi đang cố gắng làm việc này với plugin Danh sách người dùng đơn giản của mình, vì vậy tôi đang cố gắng làm cho nó hoạt động cho bất kỳ tổ hợp vai trò nào. Trên trang web địa phương của tôi, tôi đã thử quản trị viên và biên tập viên, nhưng lặp lại kết quả, tất cả các vai trò khác vẫn được đưa vào.
xe đạp

Tôi có thể khuyên bạn nên sử dụng plugin Debug Queries để xem truy vấn SQL nào đang được tạo. Rất nhiều lần điều này giúp tôi tìm ra lý do tại sao tôi nhận được kết quả bất ngờ. wordpress.org/plugins/debug-queries
Andy Adams

12

Tôi quản lý để giải quyết điều này bằng cách sử dụng chức năng này:

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

Sau đó, trong chủ đề của tôi, tôi có thể làm điều này:

$users_array = get_clients();

1
Đây là lựa chọn tốt nhất mà tôi đã đi qua. Cảm ơn.
Jake

@blogjunkie Tò mò, nhưng làm thế nào để sắp xếp này?
xe đạp

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

get_users()trả về một mảng người dùng khớp với chuỗi truy vấn được cung cấp dưới dạng param. Chỉ cần chạy get_users()truy vấn cho mọi vai trò bạn muốn riêng biệt và hợp nhất các kết quả. Sau đó, bạn có thể lặp qua $userscùng một cách bạn sẽ có khác.


1
Bạn có thể vui lòng cung cấp thêm thông tin giải thích lý do tại sao điều này giải quyết vấn đề?
GhostToast

Tôi chỉnh sửa câu trả lời ban đầu để giải thích rõ hơn tại sao nó hoạt động.
ksloan

Tôi đã sử dụng nó như là $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, và nó đã làm việc một điều trị. Cảm ơn!
Guit4eva

3

Vấn đề với việc sử dụng array_mergelà bạn không thể sử dụng phân trang. Tôi thực sự thích giải pháp của @Andy Adams, nhưng nếu bạn đang tìm kiếm trên nhiều vai trò, sử dụng truy vấn meta của anh ấy sẽ dẫn đến kết quả rất chậm truy vấn (bên trong nó thực hiện một truy vấn mớiINNER JOIN truy vấn cho mỗi truy vấn meta).

Giải pháp của tôi là sử dụng truy vấn meta biểu thức chính quy:

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

?>

Điều này tạo ra một truy vấn trông giống như:

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

1

Bạn chỉ có thể hợp nhất nhiều kết quả truy vấn người dùng. Giả sử bạn muốn bao gồm cả hai AuthorEditorvai trò. Xác định truy vấn cho từng trường hợp sau đó sử dụng Array_merge để hợp nhất thành một mảng duy nhất.

$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

Tất cả các tham số từ hàm get_users là tùy chọn. Nếu bạn chỉ định không có gì, bạn sẽ nhận được một mảng chứa các đối tượng tương ứng với mỗi và mọi người dùng của blog hiện tại, bao gồm cả những người có vai trò tùy chỉnh.


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";
}
?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.