コメダ珈琲にMacBookを持って行く勇気がない
ポストネッコ
アソビアソート
WordPressを使った開発をしていて、「投稿者権限」をもつユーザーの一覧を取得したくなりました。
WordPressの適当な関数が見つからなかったのでSQLで抽出します。
wp_usermetaに各ユーザーの権限が入っているのですが、meta_valueは単純に’editor’のような権限名になっていません。
1a:1:{s:6:"editor";b:1;}
こんな謎の文字列が格納されています。
ぱっと見はJSONと似てる。
調べてみるとPHPに標準で用意されているserializeという関数で連想配列を文字列化したものらしいです。
試しに投稿者権限の文字列を作ってみました。
1$capabilities = [
2 'editor' => true,
3];
4
5var_dump( serialize($capabilities) );
6
7/**
8 * string(23) "a:1:{s:6:"editor";b:1;}"
9 */
OK OK。完全に一致してる。
材料が揃ったので、ユーザーを権限指定で抽出するSQLを組み立てます。
1$capabilities = [
2 'editor' => true,
3];
4
5$serialized = serialize($capabilities);
6
7global $wpdb;
8$sql = "SELECT
9 US.* FROM {$wpdb->users} AS US
10 INNER JOIN {$wpdb->usermeta} AS UM ON US.ID = UM.user_id AND UM.meta_key = 'wp_capabilities'
11 WHERE UM.meta_value = %s
12";
13
14$results = $wpdb->get_results($wpdb->prepare($sql, $serialized));
これで特定の権限ユーザーを取得できます。
が、ユーザー数やユーザメタ情報が増大するとクエリの実行速度に影響が出そうなので、他の条件でも絞り込みをかけた方が良さそうですね。
また目的の権限以外にも権限を持つユーザーがいる場合はmeta_valueを完全一致で絞り込むわけにはいかないので、別のアプローチを考える必要があります。
結論、権限が1つのユーザーしか存在しないサイトなら使える。