カスタム投稿タイプを設定すると、そのcapability_typeはデフォルトではpostになります。なので、例えば特定のユーザが属しているroleから、edit_postのcapabilityを削除すると、そのユーザーは投稿もカスタム投稿タイプも編集できなくなります。もう1つ、デフォルトで設定できるcabapility_typeにpageがあるのですが、こちらも固定ページのcapabilityを削除すると同様の結果になります。
そこで、カスタム投稿タイプにその投稿タイプ専用のcapabilityを設定すれば、他からは独立した権限設定が可能になります。
まずregister_post_type()の$argsにcapability_typeとmap_meta_capを追加。
function register_custom_post_types() {
// set up the arguments
$speakers_args = array(
'labels' => array( ~省略~ ),
'public' => true,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'has_archive' => true,
'rewrite' => array( 'slug' => 'speaker' ),
// add capability for Speaker
'capability_type' => array( 'speaker', 'speakers'),
'map_meta_cap'=> true
);
// register this post type
register_post_type( 'speakers', $speakers_args );
}
add_action( 'init', 'register_custom_post_types' );
これでcapabilityの設定が追加されることになるが、このままではどこのRoleにもアサインされていない状態なので、administratorにアサインする。
function tujicas_roles_set() {
global $wp_roles;
$role = get_role( 'administrator' );
if ( $role ) {
$role->add_cap( 'edit_speaker' );
$role->add_cap( 'read_speaker' );
$role->add_cap( 'delete_speaker' );
$role->add_cap( 'delete_speakers');
$role->add_cap( 'edit_speakers' );
$role->add_cap( 'edit_others_speakers' );
$role->add_cap( 'delete_others_speakers' );
$role->add_cap( 'publish_speakers' );
$role->add_cap( 'edit_published_speakers' );
$role->add_cap( 'delete_published_speakers' );
$role->add_cap( 'delete_private_speakers' );
$role->add_cap( 'edit_private_speakers' );
$role->add_cap( 'read_private_speakers' );
}
}
add_action( 'init', 'tujicas_roles_set' );
$role->add_capに指定する項目は必要に応じて。各roleへのcapabilityの細かな設定は、上記のコードに追記してもよいですが、僕はMembersプラグインを入れて管理してます。
このトピックはあまり詳細に文書化されておらず、ググっても2~3年前の記事しかでてきません。ということで、メモ程度に記事にしてみました。