カスタム投稿タイプを設定すると、その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年前の記事しかでてきません。ということで、メモ程度に記事にしてみました。