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