以前、「カスタム投稿タイプに独自の権限を設定して操作できるユーザーを制限する方法」という記事を書きましたが、細かい権限制御をしようとしたときに不具合がでてきました。調べてみたところ、設定方法に少々誤りがあったようです。そこで、正しい設定方法を再度まとめてみました。
カスタム投稿タイプを登録
例1:スタンダードなタイプの場合
カスタム投稿タイプにオリジナルの権限を設定するには、register_post_type 時に capability_type、map_meta_cap を設定する必要があります。デフォルトの投稿タイプである post や page と同等の権限にしたい場合は下記のようにシンプルに設定することができます。
// カスタム投稿タイプ movie の場合 register_post_type( 'movie', array( 'capability_type' => array( 'movie', 'movies' ), 'map_meta_cap' => true ) );
ポイントは2つ。一つは capability_type を配列にして、単数形(カスタム投稿タイプ名)と複数形(カスタム投稿タイプ名 + s)の2つを指定すること。もう一つは map_meta_cap を true にすることです。
例2:権限を細かく指定する場合
権限を細かく指定する場合は、capabilities に一つ一つ権限を設定します。
// カスタム投稿タイプ movie の場合 // 付与する権限を用意 $capabilities = array( // 自分の投稿を編集する権限 'edit_posts' => 'edit_movies', // 他のユーザーの投稿を編集する権限 'edit_others_posts' => 'edit_others_movies', // 投稿を公開する権限 'publish_posts' => 'publish_movies', // プライベート投稿を閲覧する権限 'read_private_posts' => 'read_private_movies', // 自分の投稿を削除する権限 'delete_posts' => 'delete_movies', // プライベート投稿を削除する権限 'delete_private_posts' => 'delete_private_movies', // 公開済み投稿を削除する権限 'delete_published_posts' => 'delete_published_movies', // 他のユーザーの投稿を削除する権限 'delete_others_posts' => 'delete_others_movies', // プライベート投稿を編集する権限 'edit_private_posts' => 'edit_private_movies', // 公開済みの投稿を編集する権限 'edit_published_posts' => 'edit_published_movies', ); // カスタム投稿作成時に権限グループとその権限を設定 register_post_type( 'movie', array( 'capability_type' => 'movie', 'capabilities' => $capabilities, 'map_meta_cap' => true ) );
ここでのポイントも2つ。一つは capability_type を単数系(カスタム投稿タイプ名)のみの指定にすること。もう一つは capabilities は「◯◯_posts」をキーとした連想配列にすることです。
ユーザー(ロール)に権限を追加
上記でカスタム投稿タイプにオリジナルの権限を設定することができますが、この時点ではどのユーザー(ロール)にも、その権限を使用できるという宣言をしていないため、新規追加等の操作ができません。そこで、管理者には全ての権限が利用できるように下記のコードを追記します。
// 付与する権限を用意 // 例2 では $capabilities は宣言済みなので不要 $capabilities = array( // 自分の投稿を編集する権限 'edit_posts' => 'edit_movies', // 他のユーザーの投稿を編集する権限 'edit_others_posts' => 'edit_others_movies', // 投稿を公開する権限 'publish_posts' => 'publish_movies', // プライベート投稿を閲覧する権限 'read_private_posts' => 'read_private_movies', // 自分の投稿を削除する権限 'delete_posts' => 'delete_movies', // プライベート投稿を削除する権限 'delete_private_posts' => 'delete_private_movies', // 公開済み投稿を削除する権限 'delete_published_posts' => 'delete_published_movies', // 他のユーザーの投稿を削除する権限 'delete_others_posts' => 'delete_others_movies', // プライベート投稿を編集する権限 'edit_private_posts' => 'edit_private_movies', // 公開済みの投稿を編集する権限 'edit_published_posts' => 'edit_published_movies', ); // 管理者に独自権限を付与 $role = get_role( 'administrator' ); foreach ( $capabilities as $cap ) { $role->add_cap( $cap ); }
管理者以外のユーザー権限にもオリジナル権限を付与したい場合は、上記のようにコードを追記しても良いですが、「User Role Editor」を使用すると簡単です。管理者に付与されているオリジナル権限から、どの権限を付与させるか選択することができます。
細かい話
capability_type
例1 では capability_type を単数形と複数形の両方を指定し、例2 では capability_type を単数系のみ指定しました。なぜかというと、capability_type を配列にして単数形と複数形の両方を指定すると、capabilities が無視されてしまうからです。そのため、capabilities を細かくし指定したい場合は capability_type を単数形のみ指定する必要があります。
map_meta_cap
例1、例2 ともに map_meta_cap は true としていますが、map_meta_cap を true にした場合(デフォルトは false です)は次の7つの権限が指定可能になります。
- read
- delete_posts
- delete_private_posts
- delete_published_posts
- delete_others_posts
- edit_published_posts
- edit_private_posts
カスタム投稿タイプに指定された権限を確認する
カスタム投稿タイプが設定された後に、下記のコードを実行することで確認できます。
var_dump( $GLOBALS['wp_post_types']['カスタム投稿タイプ名']['cap'] );