WordPressのカスタム投稿タイプに専用ユーザー権限を設定する方法【User Role Editor対応】

Author:

WordPressでカスタム投稿タイプを作ったときに、通常の「投稿」とは別にユーザー権限を設定したいことがあります。

今回は「Blog」というカスタム投稿タイプを作り、プラグインUser Role Editorでカスタム投稿タイプBlog専用のユーザー権限を管理できるようにしました。

カスタム投稿タイプに専用権限を設定

register_post_type()capability_type に独自の値を指定します。

function create_post_type() {
	register_post_type( 'blog_cpt',
		array(
			'label' => 'ブログ',
			'public' => true,
			'has_archive' => true,
			'menu_position' => 5,
			'supports' => array(
				'title',
				'editor',
				'thumbnail',
				'excerpt',
				'author',
				'revisions',
			),
			'rewrite' => array(
				'slug' => 'blog',
				'with_front' => false,
			),
			'exclude_from_search' => false,
			'show_in_rest' => true,
			'capability_type' => array( 'blog', 'blogs' ),
			'map_meta_cap' => true,
		),
	);
}
add_action( 'init', 'create_post_type', 5 );

ポイントはこの2つです。

'capability_type' => array( 'blog', 'blogs' ),
'map_meta_cap' => true,

これでBlog専用の権限を作ることができます。

例えば、

edit_blogs
edit_others_blogs
publish_blogs
delete_blogs

などの権限をUser Role Editorから設定できます。

これなら、

「このユーザーにはBlogだけ編集してもらう」

といった設定ができます。

カテゴリー・タグにも専用権限を設定

Blogのカテゴリーとタグについても、通常のカテゴリー・タグとは別に権限を設定します。

カテゴリーの場合は、

'capabilities' => array(
	'manage_terms' => 'manage_blogs_cat_terms',
	'edit_terms' => 'edit_blogs_cat_terms',
	'delete_terms' => 'delete_blogs_cat_terms',
	'assign_terms' => 'assign_blogs_cat_terms',
),

タグの場合は、

'capabilities' => array(
	'manage_terms' => 'manage_blogs_tag_terms',
	'edit_terms' => 'edit_blogs_tag_terms',
	'delete_terms' => 'delete_blogs_tag_terms',
	'assign_terms' => 'assign_blogs_tag_terms',
),

とします。

これで、Blogカテゴリー・Blogタグについても専用の権限になります。

User Role Editorで設定

あとはUser Role Editorで、必要な権限をロールに付与します。

例えばBlog担当者なら、

edit_blogs
publish_blogs
edit_published_blogs
delete_blogs

などを付与します。

カテゴリーやタグも管理してもらう場合は、

manage_blogs_cat_terms
manage_blogs_tag_terms

などを追加します。

まとめ

今回使ったコード

<?php

/**
 * Blog カスタム投稿タイプ
 */
function create_post_type() {

	register_post_type(
		'blog_cpt',
		array(
			'label' => 'ブログ',
			'public' => true,
			'has_archive' => true,
			'menu_position' => 5,
			'supports' => array(
				'title',
				'editor',
				'thumbnail',
				'excerpt',
				'author',
				'revisions',
			),
			'rewrite' => array(
				'slug' => 'blog',
				'with_front' => false,
			),
			'exclude_from_search' => false,
			'show_in_rest' => true,

			// Blog専用の権限
			'capability_type' => array( 'blog', 'blogs' ),
			'map_meta_cap' => true,
		)
	);

}
add_action( 'init', 'create_post_type', 5 );


/**
 * Blogカテゴリー
 */
function create_blog_cat_taxonomy() {

	register_taxonomy(
		'blog_cat',
		array( 'blog_cpt' ),
		array(
			'labels' => array(
				'name' => 'ブログカテゴリー',
				'singular_name' => 'ブログカテゴリー',
				'menu_name' => 'ブログカテゴリー',
				'all_items' => 'すべてのブログカテゴリー',
				'parent_item' => '親ブログカテゴリー',
				'parent_item_colon' => '親ブログカテゴリー:',
			),
			'hierarchical' => true,
			'show_ui' => true,
			'show_admin_column' => true,
			'rewrite' => array(
				'slug' => 'blog-cat',
			),
			'show_in_rest' => true,

			// Blogカテゴリー専用の権限
			'capabilities' => array(
				'manage_terms' => 'manage_blogs_cat_terms',
				'edit_terms' => 'edit_blogs_cat_terms',
				'delete_terms' => 'delete_blogs_cat_terms',
				'assign_terms' => 'assign_blogs_cat_terms',
			),
		)
	);

}
add_action( 'init', 'create_blog_cat_taxonomy', 6 );


/**
 * Blogタグ
 */
function create_blog_tag_taxonomy() {

	register_taxonomy(
		'blog_tag',
		array( 'blog_cpt' ),
		array(
			'labels' => array(
				'name' => 'ブログタグ',
				'singular_name' => 'ブログタグ',
				'menu_name' => 'ブログタグ',
				'all_items' => 'すべてのブログタグ',
				'edit_item' => 'ブログタグを編集',
				'view_item' => 'ブログタグを表示',
				'update_item' => 'ブログタグ名を変更',
				'add_new_item' => '新規ブログタグを追加',
				'new_item_name' => '新規ブログタグ名',
				'search_items' => 'ブログタグを検索',
				'popular_items' => 'よく使われているブログタグ',
				'separate_items_with_commas' => 'ブログタグをカンマで区切ってください',
				'add_or_remove_items' => 'ブログタグの追加または削除',
				'choose_from_most_used' => 'よく使われているブログタグから選択',
				'not_found' => 'ブログタグが見つかりません',
			),
			'hierarchical' => false,
			'show_ui' => true,
			'show_admin_column' => true,
			'rewrite' => array(
				'slug' => 'blog-tag',
			),
			'show_in_rest' => true,

			// Blogタグ専用の権限
			'capabilities' => array(
				'manage_terms' => 'manage_blogs_tag_terms',
				'edit_terms' => 'edit_blogs_tag_terms',
				'delete_terms' => 'delete_blogs_tag_terms',
				'assign_terms' => 'assign_blogs_tag_terms',
			),
		)
	);

}
add_action( 'init', 'create_blog_tag_taxonomy', 6 );

User Role Editorで設定する主な権限

CPT側では、以下のようなBlog専用capabilityが使えるようになります。

edit_blog
read_blog
delete_blog

edit_blogs
edit_others_blogs
publish_blogs
read_private_blogs

delete_blogs
delete_private_blogs
delete_published_blogs
delete_others_blogs

edit_private_blogs
edit_published_blogs

カテゴリーは、

manage_blogs_cat_terms
edit_blogs_cat_terms
delete_blogs_cat_terms
assign_blogs_cat_terms

タグは、

manage_blogs_tag_terms
edit_blogs_tag_terms
delete_blogs_tag_terms
assign_blogs_tag_terms

です。

blog_cpt だけでなく、blog_catblog_tag まで専用権限にしているので、User Role Editorで「Blog担当者」をかなり細かく制御でき、複数人でWordPressを運用する場合には、けっこう便利な方法です。