未分類

【WordPress】特定の権限のユーザーリストを取得する方法

ポストネッコ

WordPressを使った開発をしていて、「投稿者権限」をもつユーザーの一覧を取得したくなりました。

WordPressの適当な関数が見つからなかったのでSQLで抽出します。

wp_usermetaに各ユーザーの権限が入っているのですが、meta_valueは単純に’editor’のような権限名になっていません。

1a:1:{s:6:"editor";b:1;}

こんな謎の文字列が格納されています。

ポストネッコ
ポストネッコ

ぱっと見はJSONと似てる。

調べてみるとPHPに標準で用意されているserializeという関数で連想配列を文字列化したものらしいです。

値の保存可能な表現を生成します。

型や構造を失わずに PHP の値を保存または渡す際に有用です。

シリアル化された文字列を PHP の値に戻すには、 unserialize() を使用してください。

https://www.php.net/manual/ja/function.serialize.php

試しに投稿者権限の文字列を作ってみました。

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つのユーザーしか存在しないサイトなら使える。

ABOUT ME
ポストネッコ
ポストネッコ
1998年生まれ。
高卒→工場勤務→憧れのあったSEに転職。
休日にコメダ珈琲のモーニングをゆっくり楽しむのが好きです。
記事URLをコピーしました