На примере роли Редактор
1. При регистрации типа записи задаете capabilities
2. При создании роли или для существующей прописываете доступ с помощью add_cap
3. На самом сайте проверяете перед выводом постов залогинен ли юзер и его роль
Чуть подробнее:
Шаг 1, регистрация типа записи:
function register_works() {
$labels = array(
'menu_name' => __( 'Работы подписчиков', 'ay' ),
'name' => __( 'Работы подписчиков', 'ay' ),
'add_new' => __('Добавить работу', 'ay'),
'add_new_item' => __('Добавить', 'ay'),
'edit_item' => __('Редактировать', 'ay'),
'search_items' => __('Искать', 'ay'),
);
$args = array(
'labels' => $labels,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'comments' ),
'menu_icon' => 'dashicons-groups',
'menu_position' => 13,
'rewrite' => array('slug' => 'works'),
'public' => true,
'has_archive' => false,
'capabilities' => array(
'edit_post' => 'edit_works_content',
'edit_posts' => 'edit_works_contents',
'edit_published_posts' => 'edit_published_works_contents',
'edit_others_posts' => 'edit_other_works_content',
'publish_posts' => 'publish_works_content',
'read_post' => 'read_works_content',
'read_private_posts' => 'read_private_works_content',
'delete_post' => 'delete_works_content',
'delete_posts' => 'delete_works_contents',
'delete_published_posts' => 'delete_published_works_contents'
),
'map_meta_cap' => true
);
register_post_type( 'works', $args );
}
add_action( 'init', 'register_works' );
Шаг 2, раздача доступа:
function add_studio_caps() {
$editor = get_role('editor');
$editor->add_cap('edit_works_content');
$editor->add_cap('edit_works_contents');
$editor->add_cap('read_works_content');
$editor->add_cap('read_private_works_content'); // закомментить
$editor->add_cap('delete_works_content');
$editor->add_cap('delete_works_contents');
$editor->add_cap('edit_published_works_contents');
$editor->add_cap('delete_published_works_contents');
$editor->add_cap('edit_other_works_content'); // закомментить
}
add_action( 'admin_init', 'add_studio_caps');
Шаг 3, на фронте:
if ( is_user_logged_in() ) {
global $current_user;
if ( in_array( 'editor', $current_user->roles ) {
// выводим посты