WordPress で任意の権限を持つ全てのユーザーを取得したいという要件があって、以下のコードを書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/** * 任意の権限(capability)を持つユーザーを取得する。 * @param string $capability * @return array<WP_User> */ public function find_all_user_by_cap($capability) { global $wp_roles; if ( ! isset( $wp_roles ) ) $wp_roles = new WP_Roles(); //$capabilityを有する権限を収集する $role_and_caps = array(); $role_and_caps[] = $capability; foreach ( $wp_roles->role_objects as $role ) { if ( $role->has_cap( $capability ) ) { $role_and_caps[] = $role->name; } } //メタデータのキーを取得する $current_user = wp_get_current_user(); $current_user->for_blog( get_current_blog_id() ); $user_cap_key = $current_user->cap_key; //メタクエリで検索する $meta_query = array(); $meta_query['relation'] = 'OR'; foreach ( $role_and_caps as $role_or_cap ) { $meta_query[] = array( 'key' => $user_cap_key, 'value' => $role_or_cap, 'compare' => 'LIKE', ); } $query = new WP_User_Query( compact( 'meta_query' ) ); return $query->get_results(); } |
WordPress では、$user->cap_key に指定される名前の usermeta に、権限と権限グループの名前がシリアライズされた状態で保存されているので、これを WP_User_Query を使って meta_query で検索しています。検索する値は、指定の $capability と、その $capability を有する権限グループ(Role)になります。11行目から18行目は、その権限グループの名前を収集しています。
$user_cap_key を準備する辺りがイケテナイのですが、他に良い方法が他にありましたら、教えていただけたら嬉しいです。
追記
一つだけ余談ですが、capabilities.php の中に以下のコードが散在しています。
1 2 3 |
global $wp_roles; if ( ! isset( $wp_roles ) ) $wp_roles = new WP_Roles(); |
これはかなりイケてないと思うので、オブジェクトにするのであれば、WP_Roles::getInstance() とか、シングルトンのファクトリメソッドを準備して欲しいですね。切なる要望です。 (#^.^#)