問題描述

我有一些這樣的程式碼:


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

我想獲得更多角色,還包括 contributorauthor 以及我用 Role Scoper 外掛建立的一些自定義角色。 Manager 等等任何想法如何用 get_users 這樣做?

謝謝

最佳解決方案

您還可以透過使用 meta_query 引數對 get_users 進行單次呼叫或使用單個 WP_User_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 引數中獲取。

次佳解決方案

我用這個功能解決了這個問題:

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

第三種解決方案

快速到 WordPress 4.4 – 它將支援 role__in 屬性!

看來 WordPress 4.4 是我們的幸運版本號,因為它將支援 WP_User_Query 類的 role__inrole__not_in 屬性。

所以要包括訂閱者,貢獻者和作者角色,我們可以簡單地使用:

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

檢視機票 #22212 的整個故事!

第四種方案

使用 array_merge 的問題是您無法使用分頁。我非常喜歡 @Andy Adams 的解決方案,但是如果您正在搜尋許多角色,使用他的 meta 查詢將導致非常慢的查詢 (內部它為每個元查詢做一個新的 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'
        )
    )
);

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。