Разрешение доступа пользовательской роли к пользовательскому типу записей в админке
У меня возникли проблемы с этим, и я не могу понять причину. Мне просто нужно, чтобы пользовательская роль имела доступ к блогу в админке.
Я добавил новый тип записей с типом возможностей blog
и новую роль пользователя со всеми правами, которые позволяют администраторам добавлять/редактировать этот кастомный тип записей. Для администраторов это работает, и они могут получить доступ к типу записей в админке. Однако пользователи с моей пользовательской ролью вообще не могут войти в админку.
Аргументы типа записей, на которые стоит обратить внимание
"capability_type" => 'blog',
"map_meta_cap" => true,
Регистрация роли
function add_blog_manager_role(){
add_role(
'blog_manager',
'Менеджер блога',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => true
)
);
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );
Добавление возможностей
function add_blog_role_caps() {
$roles = array('blog_manager', 'editor','administrator');
foreach($roles as $the_role) {
$role = get_role($the_role);
$role->add_cap( 'read' );
$role->add_cap( 'read_blog');
$role->add_cap( 'read_private_blog' );
$role->add_cap( 'edit_blog' );
$role->add_cap( 'edit_others_blog' );
$role->add_cap( 'edit_published_blog' );
$role->add_cap( 'publish_blog' );
$role->add_cap( 'delete_others_blog' );
$role->add_cap( 'delete_private_blog' );
$role->add_cap( 'delete_published_blog' );
}
}
add_action('admin_init', 'add_blog_role_caps', 5 );
Я активно гуглил, пытаясь найти причину этой проблемы. Пробовал с возможностями во множественном и единственном числе, пробовал добавлять возможности в аргументы типа записей. Однако мне так и не удалось получить доступ в админку. В теме нет другого кода, который мог бы выкидывать пользователей из админки (я удалил свой собственный код, который их выкидывал, во время тестирования).
Редактирование Вот дамп возможностей blog_manager из базы данных, там осталось много тестового мусора, но это не должно мешать входу в админку, насколько я знаю.
'blog_manager' => array (
'name' => 'Менеджер блога',
'capabilities' => array (
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => true,
'read_blog' => true,
'read_private_blog' => true,
'edit_blog' => true,
'edit_others_blog' => true,
'edit_published_blog' => true,
'publish_blog' => true,
'delete_others_blog' => true,
'delete_private_blog' => true,
'delete_published_blog' => true,
'blog' => true,
'read_private_blogs' => true,
'edit_blogs' => true,
'edit_others_blogs' => true,
'edit_published_blogs' => true,
'publish_blogs' => true,
'delete_others_blogs' => true,
'delete_private_blogs' => true,
'delete_published_blogs' => true,
'delete_blogs' => true,
'delete_blog' => true,
),
)

Сложно устранить неполадки в приведённом выше коде, так как это только часть фактического кода, но вот минимальный плагин, необходимый для регистрации пользовательского типа записи (называемого Example) и пользовательской роли (Blog Manager), которая имеет доступ к пользовательскому типу записи Example.
Этот код также можно использовать в файле functions.php темы. Просто используйте хуки активации и деактивации темы вместо плагина.
<?php
/**
* Plugin Name: WPSE 186337
* Description: Отладка вопроса WordPress StackExchange 186337
* Plugin URI: https://wordpress.stackexchange.com/questions/186337/
* Author: Nathan Johnson
* Licence: GPL2+
* Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
*/
//* Не получать прямой доступ к этому файлу
defined( 'ABSPATH' ) or die();
//* Добавляем действие к init для регистрации пользовательского типа записи
add_action( 'init', 'se186337_init' );
//* Регистрируем хук активации для добавления роли Blog Manager
register_activation_hook( __FILE__ , 'se186337_activation' );
//* Регистрируем хук деактивации для удаления роли Blog Manager
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );
function se186337_activation() {
$caps = [
//* Мета-возможности
'read' => true,
'edit_blog' => true,
'read_blog' => true,
'delete_blog' => true,
//* Базовые возможности, используемые вне map_meta_cap()
'edit_blogs' => true,
'edit_others_blogs' => true,
'publish_blogs' => true,
'read_private_blogs' => true,
//* Базовые возможности, используемые внутри map_meta_cap()
'delete_blogs' => true,
'delete_private_blogs' => true,
'delete_published_blogs' => true,
'delete_others_blogs' => true,
'edit_private_blogs' => true,
'edit_published_blogs' => true,
];
add_role( 'blog_manager', 'Менеджер блога', $caps );
}
function se186337_deactivation() {
remove_role( 'blog_manager' );
}
function se186337_init() {
$labels = [
'name' => __( 'Примеры' ),
'singular_name' => __( 'Пример' ),
];
$args = [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'capability_type' => 'blog',
'map_meta_cap' => true,
];
register_post_type( 'examples', $args );
}

Если вас устраивает плагин, вы можете использовать указанный ниже плагин.
