Как включить произвольный тип записи для пользовательской роли в WordPress
Я создал произвольный тип записи Course Documents, используя плагин WordPress Custom Post Type UI. Также я создал новую пользовательскую роль Teacher (Учитель).
add_role('rpt_teacher',
'Teacher',
array(
'read' => true, // разрешить чтение
'edit_posts' => false, // запретить редактирование записей
'delete_posts' => false, // запретить удаление записей
'publish_posts' => false, // запретить публикацию записей
'upload_files' => true, // разрешить загрузку файлов
)
);
И теперь я хочу включить произвольный тип записи в меню панели управления для учителя. Я использовал следующий код в моем functions.php, но ничего не происходит. Как мне решить эту проблему?
add_action('admin_init','rpt_add_role_caps',999);
/**
добавление прав для учителей
*/
function rpt_add_role_caps() {
// Добавляем роли, которым нужно администрировать произвольные типы записей
$roles = array('rpt_teacher','editor','administrator');
// Перебираем каждую роль и назначаем права
foreach($roles as $the_role) {
$role = get_role($the_role);
$role->add_cap( 'read' );
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'delete_published_course_documents' );
}
}

Я не думаю, что плагин добавляет возможности (capabilities), которые вы используете в add_cap
при регистрации типа записи.
Вы можете изменить зарегистрированный тип записи, добавив код в файл темы functions.php
. Вот как это можно сделать:
/**
* Переопределение аргументов пользовательского типа записи, зарегистрированного плагином
*/
add_filter( 'register_post_type_args', 'change_capabilities_of_course_document' , 10, 2 );
function change_capabilities_of_course_document( $args, $post_type ){
// Не фильтруем другие типы записей
if ( 'course_document' !== $post_type ) {
// Возвращаем оригинальные аргументы для других типов записей
return $args;
}
// Изменяем возможности для типа записи "course_document"
$args['capabilities'] = array(
'edit_post' => 'edit_course_document',
'edit_posts' => 'edit_course_documents',
'edit_others_posts' => 'edit_other_course_documents',
'publish_posts' => 'publish_course_documents',
'read_post' => 'read_course_document',
'read_private_posts' => 'read_private_course_documents',
'delete_post' => 'delete_course_document'
);
// Возвращаем модифицированные аргументы для типа записи course_document
return $args;
}
Затем вы можете добавить:
/**
Добавляем возможности для учителей
*/
add_action('admin_init','rpt_add_role_caps',999);
function rpt_add_role_caps() {
$role = get_role('teacher');
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_other_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'read_private_course_documents' );
$role->add_cap( 'delete_course_document' );
}
Вам не нужно добавлять возможности для администратора и редактора, так как capability_type
по умолчанию имеет значение post
при регистрации пользовательского типа записи через этот плагин. Вы можете изменить это, если предпочитаете иметь пользовательский capability_type
на основе другого типа записи.
Примечание: Убедитесь, что параметр Show in Menu
установлен в true
. В этом плагине по умолчанию он имеет значение true
.

Идеально, спасибо! Столкнулся с одной проблемой:
"Если вы определяете пользовательскую роль и добавляете возможности к этой роли с помощью add_role(), имейте в виду, что изменение массива возможностей и повторный вызов add_role() не обязательно обновит роль с новым списком возможностей. Функция add_role() пропускает выполнение, если роль уже существует в базе данных. Обходной путь в этом случае — предварить ваш вызов add_role() вызовом remove_role(), который удаляет роль, которую вы добавляете." https://codex.wordpress.org/Function_Reference/add_role#Delete_existing_role

Насколько я вижу, вы на правильном пути. Вы создали пользователя и назначили ему новые права. Вы просто упустили указание, что новые права будут использоваться для редактирования вашего пользовательского типа записей.
Я никогда не использовал плагин для создания пользовательского типа записей, поэтому не уверен, как это сделать с помощью плагина. Но если вы готовы создать свой CPT через код, вы можете использовать следующее:
add_action( 'init', 'psp_register_cpt_projects');
function psp_register_cpt_projects() {
$args = array(
'label' => __( 'course_documents', 'course_documents' ),
'description' => __( 'Course document', 'course_document' ),
'supports' => array( 'title', 'comments', 'revisions', ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'capability_type' => array('course_document','course_documents'),
'map_meta_cap' => true,
);
register_post_type( 'course_documents', $args );
}
Примечание: Это просто базовый код для создания CPT. Пожалуйста, прочитайте это руководство в кодексе, чтобы понять его полностью.
Дайте мне знать, если это вам помогло.

Одна вещь, на которую я потратил пару часов и которая стоит упоминания. Если у вас есть пользовательские права (capabilities) и вы хотите обновить права для пользовательской роли, не делайте это в функции add_role.
Например, это не обновит роль, так как она уже существует:
$role = add_role(
'client',
'Client',
array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
CAP_READ_ADDRESS => true,
CAP_DELETE_ADDRESS => true,
CAP_EDIT_OTHER_ADDRESSES => true,
CAP_READ_PRIVATE_ADDRESS => true,
CAP_EDIT_ADDRESSES => true,
CAP_PUBLISH_ADDRESS => true,
CAP_EDIT_ADDRESS => true
)
После любого обновления прав моя роль 'client' не обновлялась, так как она уже существовала.
Самый безопасный способ добавить пользовательские права к пользовательской роли — получить роль и добавить права после add_role:
function addCaps() {
$role = get_role('client');
$role->add_cap(CAP_READ_ADDRESS, true);
$role->add_cap(CAP_EDIT_ADDRESSES, true);
}
add_action('admin_init', 'addCaps');
