Ограничение пользовательского типа записей только для роли администратора сайта
Как я могу убрать этот пользовательский тип записей из админки для всех пользователей, кроме администраторов?
/* Добавляем пользовательский тип записи "Websites" */
add_action( 'init', 'create_website_type' );
function create_website_type() {
register_post_type( 'website',
array(
'labels' => array(
'name' => __( 'Сайты' ),
'singular_name' => __( 'Сайт' ),
'add_new' => __( 'Добавить новый сайт' ),
'add_new_item' => __( 'Добавить новый сайт' ),
'edit' => __( 'Редактировать сайт' ),
'edit_item' => __( 'Редактировать сайт' ),
'new_item' => __( 'Добавить новый сайт' ),
'view' => __( 'Просмотреть сайт' ),
'view_item' => __( 'Просмотреть сайт' ),
'search_items' => __( 'Искать сайты' ),
'not_found' => __( 'Сайты не найдены' ),
'not_found_in_trash' => __( 'В корзине нет сайтов' ),
),
'description' => __('Сайты для отображения в разделе Ресурсы.'),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'supports' => array('title', 'editor'),
'can_export' => true,
'capability_type' => 'post',
'capabilities' => array(
'edit_post' => 'manage_options',
'read_post' => 'manage_options',
'delete_post' => 'manage_options',
'edit_posts' => 'manage_options',
'edit_others_posts' => 'manage_options',
'publish_posts' => 'manage_options',
'read_private_posts' => 'manage_options'
),
'map_meta_cap' => true
)
);
remove_post_type_support('website','editor');
}

Функция register_post_type()
принимает параметр capabilities
в своих аргументах. Смотрите get_post_type_capabilities()
для возможных значений. Из комментариев:
По умолчанию массив capabilities принимает семь ключей:
edit_post
,read_post
иdelete_post
— это мета-возможности, которые обычно преобразуются в соответствующие базовые возможности в зависимости от контекста (редактируемый/читаемый/удаляемый пост и проверяемый пользователь или роль). Таким образом, эти возможности обычно не предоставляются напрямую пользователям или ролям.
edit_posts
— Определяет, можно ли редактировать записи этого типа.edit_others_posts
— Определяет, можно ли редактировать записи этого типа, принадлежащие другим пользователям. Если тип записи не поддерживает автора, это поведение будет аналогичноedit_posts
.publish_posts
— Определяет возможность публикации записей этого типа.read_private_posts
— Определяет, можно ли читать приватные записи.Эти четыре базовые возможности проверяются в ядре в различных местах. Также есть семь других базовых возможностей, которые не используются напрямую в ядре, за исключением функции
map_meta_cap()
, которая преобразует три упомянутые мета-возможности в одну или несколько базовых возможностей, которые затем проверяются в зависимости от контекста.
read
— Определяет, можно ли читать записи этого типа.delete_posts
— Определяет, можно ли удалять записи этого типа.delete_private_posts
— Определяет, можно ли удалять приватные записи.delete_published_posts
— Определяет, можно ли удалять опубликованные записи.delete_others_posts
— Определяет, можно ли удалять записи, принадлежащие другим пользователям. Если тип записи не поддерживает автора, это поведение будет аналогичноdelete_posts
.edit_private_posts
— Определяет, можно ли редактировать приватные записи.edit_published_posts
— Определяет, можно ли редактировать опубликованные записи.Эти дополнительные возможности используются только в
map_meta_cap()
. Таким образом, они назначаются по умолчанию только в том случае, если тип записи зарегистрирован с аргументом'map_meta_cap'
, установленным вtrue
(по умолчаниюfalse
).
В аргументах регистрации добавьте:
'capabilities' => array(
'edit_post' => 'update_core',
'read_post' => 'update_core',
'delete_post' => 'update_core',
'edit_posts' => 'update_core',
'edit_others_posts' => 'update_core',
'delete_posts' => 'update_core',
'publish_posts' => 'update_core',
'read_private_posts' => 'update_core'
),

Как бы вы сделали то же самое, но разрешили доступ к пользовательскому типу записи администраторам и редакторам?

@drtanz Назначьте им обеим пользовательскую capability и используйте фильтр user_has_cap
. Пример смотрите в этом ответе.

Можно ли сделать так же, как вы предложили, но использовать manage_links capability (общую для администраторов и редакторов) вместо update_core?

@drtanz Да, но я бы использовал пользовательскую capability. Менеджер ссылок в конечном итоге будет удален, и вы не знаете, что произойдет с назначенными capabilities тогда.

Я пробовал использовать manage_categories, но получал ошибки, пытался найти какие-то уникальные capabilities для редакторов и администраторов на http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

Если использовать пользовательскую capability, я знаю, как добавить capability, но не уверен, какая фильтрация нужна для скрытия пунктов меню, связанных с CPT.

Для администратора мультисайта можно использовать следующий код в файле functions.php:
/* Добавляем пользовательский тип записи "Вебсайты" */
function create_website_CustomPostType() {
register_post_type( 'website',
array(
'labels' => array(
'name' => __( 'Вебсайты' ),
'singular_name' => __( 'Вебсайт' ),
'add_new' => __( 'Добавить вебсайт' ),
'add_new_item' => __( 'Добавить новый вебсайт' ),
'edit' => __( 'Редактировать' ),
'edit_item' => __( 'Редактировать вебсайт' ),
'new_item' => __( 'Добавить вебсайт' ),
'view' => __( 'Просмотр' ),
'view_item' => __( 'Просмотреть вебсайт' ),
'search_items' => __( 'Искать вебсайты' ),
'not_found' => __( 'Вебсайты не найдены' ),
'not_found_in_trash' => __( 'В корзине вебсайтов не найдено' ),
),
'description' => __('Вебсайты для отображения в разделе Ресурсы.'),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'supports' => array('title', 'editor'),
'can_export' => true
)
);
}
// если пользователь вошел как администратор - показываем тип записи, иначе - скрываем
add_action( 'init', function(){
$WhatRoleUserLoginNow= wp_get_current_user()->caps;
$StatusAdmin=$WhatRoleUserLoginNow['administrator'] ?? null;
if( $StatusAdmin) {
create_website_CustomPostType();
}
} );
Данный код добавляет пользовательский тип записи для всех администраторов в режиме multisite
и суперадминистраторов, скрывая и запрещая доступ для других ролей пользователей, таких как автор, редактор и т.д.
