てくてくあるく

WordPress の テーマ とか プラグイン に ついて 勉強しています

user_level は もう使われていないと思ったら まだ 使っているところがありました

wp_dropdown_users に 追加した ユーザ が 表示されずに 原因がわかるまでに 無駄に 時間を使ってしまいました

メンバー紹介ページを作りたい と思いまして
カスタム投稿 だけに アクセスできるユーザー を 作って
そのユーザは 自分の投稿だけを 修正できるようにしたいと 考えました

調べたら 多少古い記事でしたが 良さげな情報でしたので

I referred to カスタム投稿タイプと専用のユーザー権限(完結編) | Gatespace's Blog.
https://gatespace.jp/2012/05/24/custom-post-type-and-user-role-fix/


カスタム投稿タイプ と カスタム役割 の 作成


参考サイトを元に サクッと 作成します


カスタム投稿タイプ


カスタム投稿タイプ を 作る際の注意点としては

'capability_type'     => POST_TYPE,
'map_meta_cap'        => true,

の 2点です

最初 map_meta_cap を 設定していなくて 正しく 権限を割り振れなかったので 注意が必要です

関数リファレンス/register post type - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type


カスタム役割


こちらに関しては 参考サイトの コードを 少しカスタマイズして 使いました

ここでは 注意する点は 特にないかと思います


wp_dropdown_users の who が authors の 時


カスタム投稿タイプ と カスタム役割 を 作成しましたが
管理ページ の 投稿者 の プルダウン に 追加した ユーザー が 表示されていないことに気が付きました

これでは 対象の投稿を 割り振ることができません


wp_dropdown_users


まずは /wp-admin/edit.php の ソースコード を 読んで
投稿者 の プルダウン は wp_dropdown_users を 呼び出していることがわかりました

なので wp_dropdown_users に ついて 調べました

wp_dropdown_users() | Function | WordPress Developer Resources
https://developer.wordpress.org/reference/functions/wp_dropdown_users/

get_users で データを 取得していることが わかりました


get_users


今度は get_users を 調べてみます

get_users() | Function | WordPress Developer Resources
https://developer.wordpress.org/reference/functions/get_users/

WP_User_Query で データを 取得していることがわかりました


WP_User_Query


さらに WP_User_Query を 調べてみます

WP_User_Query | Class | WordPress Developer Resources
https://developer.wordpress.org/reference/classes/wp_user_query/

ここで DBから データを 取得していることが わかりました


who が authors の 時は 何をしてるか


WP_User_Query の Who Parameter に 以下の様に 絞り込んでいる事が わかりました

$args = array(
	'meta_key'     => 'user_level',
	'meta_value'   => '0',
	'meta_compare' => '!=',
	'blog_id'      => 0
)
$user_query = new WP_User_Query( $args );


user_level を 設定する


wp_dropdown_users の who が authors の 時でも
user_level が 0 以外であれば 表示されることがわかったので
user_level を 設定しようと思います


user_level


まずは user_level について 調べてみました

ユーザーの種類と権限 - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E6%A8%A9%E9%99%90#.E3.83.A6.E3.83.BC.E3.82.B6.E3.83.BC.E3.83.AC.E3.83.99.E3.83.AB

ユーザーレベルは最終的に、バージョン3.0で非推奨となりました。 と書いてありましたが どうやら まだ 使われている所は あるみたいです


update_user_level_from_caps


user_level は どの様に 設定するのか 調べていたら どうやら update_user_level_from_caps で 設定できることがわかりました

WP_User::update_user_level_from_caps() | Method | WordPress Developer Resources
https://developer.wordpress.org/reference/classes/wp_user/update_user_level_from_caps/

なので まずは add_role した後 add_cap で level_2 等 を 足してあげます

add_role( ROLE_TYPE, __( 'Member', 'translation' ) );

$role = get_role( ROLE_TYPE );

$role->add_cap( 'level_2' );
$role->add_cap( 'level_1' );
$role->add_cap( 'level_0' );

その後 update_user_level_from_caps を してあげます

$users = get_users();

foreach( $users as $user ) {
  if( in_array( ROLE_TYPE, $user->roles ) ) {
    $user->update_user_level_from_caps();
  }
}

この方法で あっているかわかりませんが
これで 管理ページ の 投稿者 の プルダウン から 選択できるようになりました