Как включить произвольный тип записи для пользовательской роли в WordPress

4 янв. 2018 г., 06:42:04
Просмотры: 23.4K
Голосов: 5

Я создал произвольный тип записи 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' );
        }
        }
0
Все ответы на вопрос 4
1
15

Я не думаю, что плагин добавляет возможности (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.

4 янв. 2018 г. 08:25:52
Комментарии

Идеально, спасибо! Столкнулся с одной проблемой:

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

00-BBB 00-BBB
23 мая 2019 г. 19:02:57
1

Насколько я вижу, вы на правильном пути. Вы создали пользователя и назначили ему новые права. Вы просто упустили указание, что новые права будут использоваться для редактирования вашего пользовательского типа записей.

Я никогда не использовал плагин для создания пользовательского типа записей, поэтому не уверен, как это сделать с помощью плагина. Но если вы готовы создать свой 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. Пожалуйста, прочитайте это руководство в кодексе, чтобы понять его полностью.

Дайте мне знать, если это вам помогло.

4 янв. 2018 г. 07:17:17
Комментарии

Да. Когда я создаю пользовательский тип записи, я использую ваш совет. Но в этом проекте много пользовательских типов записей, созданных другим разработчиком, и я не хочу переписывать их все, как предложено выше.

ashanrupasinghe ashanrupasinghe
4 янв. 2018 г. 12:03:10
0

Я разрешил отображать всех пользователей в выборе "Автор":

add_filter( 'wp_dropdown_users_args', 'add_subscribers_to_dropdown', 10, 2 );
function add_subscribers_to_dropdown( $query_args, $r ) {
    $query_args['who'] = '';
    return $query_args;
}
3 янв. 2020 г. 13:53:48
0

Одна вещь, на которую я потратил пару часов и которая стоит упоминания. Если у вас есть пользовательские права (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');
1 дек. 2021 г. 13:05:16