カスタム投稿タイプに独自の権限を設定して操作できるユーザーを制限する方法

WordPressの投稿タイプ(post や page 等)には、それぞれ閲覧・編集・削除等の権限が設定されている。独自のカスタム投稿タイプを設定した場合、その投稿タイプの権限の初期値は「post」となる。もし「問い合わせ管理」というカスタム投稿タイプを作成し、管理者だけが閲覧できるようにしたい場合を想定する。

// カスタム投稿タイプを作成
register_post_type( 'contacts', array(
	'public'  => false,
	'show_ui' => true,
) );

上記のように普通に作成すると権限が「post」となるため、「投稿」を操作できるユーザーは「問い合わせ管理」も操作できる状態となってしまう。そこで、register_post_type するとき、capability_type と capabilities を設定してオリジナルの権限を作成することでアクセス制御を行うことができる。

// 付与する権限を用意
$contact_capabilities = array(
	'read_contact',	  // 閲覧のメタ権限
	'edit_contact',   // 編集のメタ権限
	'delete_contact', // 削除のメタ権限
	'edit_contacts',   // 自分の投稿を編集する権限
	'edit_others_contacts', // 他のユーザーの投稿を編集する権限
	'publish_contacts',     // 投稿を公開する権限
	'read_private_contacts', // プライベート投稿を閲覧する権限
	'delete_contacts',       // 自分の投稿を削除する権限
	'delete_private_contacts',   // プライベート投稿を削除する権限
	'delete_published_contacts', // 公開済み投稿を削除する権限
	'delete_others_contacts',    // 他のユーザーの投稿を削除する権限
	'edit_private_contacts',  // プライベート投稿を編集する権限
	'edit_published_contacts' // 公開済みの投稿を編集する権限
);

// カスタム投稿作成時に権限グループとその権限を設定
register_post_type( 'contacts', array(
	'public'  => false,
	'show_ui' => true,
	'capability_type' => 'contact',
	'capabilities'    => $contact_capabilities,
) );

// 管理者に独自権限を付与
$role = get_role( 'administrator' );
foreach ( $contact_capabilities as $cap ) {
	$role->add_cap( $cap );
}

管理者以外のユーザー権限にもオリジナル権限を付与したい場合は「User Role Editor」を使用すれば良い。管理者に付与されているオリジナル権限から、どの権限を付与させるか選択することができる。

ちなみに、「メタ権限」を付与しないと権限不足となってしまい正しく管理画面を表示することができなかった。もし編集に関する権限を持たせたいとしたら edit_contacts、edit_others_contacts、edit_private_contacts、edit_published_contacts だけではなく edit_contact 権限も付与しなければならないようだ。

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。