問題描述
我有一些這樣的程式碼:
$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;
我想獲得更多角色,還包括 contributor,author 以及我用 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__in 和 role__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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。