Пользователь не может привязывать рубрики к CPT записям WordPress, как дать ему это право?

Ссылка скопирована
1 ответ

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

Код с помощью которого создал роль

function add_teacher_role() {     add_role('teacher', 'Преподаватель', array(         'read' => true, // Разрешаем просмотр контента     )); } add_action('init', 'add_teacher_role');  function restrict_teacher_role() {     $teacher_role = get_role('teacher');     $teacher_role->add_cap('edit_teacher');     $teacher_role->add_cap('read_teacher');     $teacher_role->add_cap('edit_published_teacher');     $teacher_role->add_cap('publish_teacher'); 	$teacher_role->add_cap('edit_others_teacher'); 	     $teacher_role->add_cap('assign_terms'); // Эта возможность разрешает привязку к таксономиям       $teacher_role->add_cap('manage_categories');     // Отменяем права на редактирование, публикацию и удаление для других типов записей     $teacher_role->remove_cap('edit_post');     $teacher_role->remove_cap('edit_others_posts');     $teacher_role->remove_cap('edit_published_posts');     $teacher_role->remove_cap('publish_posts');     $teacher_role->remove_cap('delete_posts');     $teacher_role->remove_cap('delete_others_posts');     $teacher_role->remove_cap('delete_published_posts');      // Даем администратору полные права     $admin_role = get_role('administrator');     $admin_role->add_cap('edit_teacher');     $admin_role->add_cap('read_teacher');     $admin_role->add_cap('edit_published_teacher');     $admin_role->add_cap('publish_teacher');     $admin_role->add_cap('delete_teacher');     $admin_role->add_cap('edit_others_teacher');     $admin_role->add_cap('delete_others_teacher');     $admin_role->add_cap('delete_published_teacher'); } add_action('init', 'restrict_teacher_role');

function add_teacher_role() { add_role('teacher', 'Преподаватель', array( 'read' => true, // Разрешаем просмотр контента )); } add_action('init', 'add_teacher_role'); function restrict_teacher_role() { $teacher_role = get_role('teacher'); $teacher_role->add_cap('edit_teacher'); $teacher_role->add_cap('read_teacher'); $teacher_role->add_cap('edit_published_teacher'); $teacher_role->add_cap('publish_teacher'); $teacher_role->add_cap('edit_others_teacher'); $teacher_role->add_cap('assign_terms'); // Эта возможность разрешает привязку к таксономиям $teacher_role->add_cap('manage_categories'); // Отменяем права на редактирование, публикацию и удаление для других типов записей $teacher_role->remove_cap('edit_post'); $teacher_role->remove_cap('edit_others_posts'); $teacher_role->remove_cap('edit_published_posts'); $teacher_role->remove_cap('publish_posts'); $teacher_role->remove_cap('delete_posts'); $teacher_role->remove_cap('delete_others_posts'); $teacher_role->remove_cap('delete_published_posts'); // Даем администратору полные права $admin_role = get_role('administrator'); $admin_role->add_cap('edit_teacher'); $admin_role->add_cap('read_teacher'); $admin_role->add_cap('edit_published_teacher'); $admin_role->add_cap('publish_teacher'); $admin_role->add_cap('delete_teacher'); $admin_role->add_cap('edit_others_teacher'); $admin_role->add_cap('delete_others_teacher'); $admin_role->add_cap('delete_published_teacher'); } add_action('init', 'restrict_teacher_role');

Дополнительно:

Ответы:

Так а где register post type ?

  • Зарегестрировал CPT с помощью плагина CPT UI
  • FelixKerser, мы не знаем как капабилитес там выставлены, так что как вам помочь непонятно
  • pantsarny,

    Пользователь не может привязывать рубрики к CPT записям Wordpress, как дать ему это право?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Алексей Денисов Ответ

Для привязки рубрик к CPT недостаточно дать роли абстрактный capability assign_terms. Таксономия должна быть зарегистрирована с правильными capabilities, а роль должна иметь именно capability назначения терминов этой таксономии. Если это стандартная category, обычно нужен assign_categories.

Если CPT “Преподаватели” использует стандартные рубрики, добавьте роли:

add_action('init', function () {
    $role = get_role('teacher');
 
    if (!$role) {
        return;
    }
 
    $role->add_cap('read');
    $role->add_cap('edit_teachers');
    $role->add_cap('edit_published_teachers');
    $role->add_cap('publish_teachers');
    $role->add_cap('assign_categories');
});

add_action('init', function () { $role = get_role('teacher'); if (!$role) { return; } $role->add_cap('read'); $role->add_cap('edit_teachers'); $role->add_cap('edit_published_teachers'); $role->add_cap('publish_teachers'); $role->add_cap('assign_categories'); });

Обратите внимание на множественное число capabilities. При регистрации CPT нужно задать capability_type и map_meta_cap корректно. Например:

register_post_type('teacher', [
    'label' => 'Преподаватели',
    'public' => true,
    'capability_type' => ['teacher', 'teachers'],
    'map_meta_cap' => true,
    'taxonomies' => ['category'],
]);

register_post_type('teacher', [ 'label' => 'Преподаватели', 'public' => true, 'capability_type' => ['teacher', 'teachers'], 'map_meta_cap' => true, 'taxonomies' => ['category'], ]);

Если у Вас кастомная таксономия, например teacher_cat, при её регистрации можно задать свои права:

register_taxonomy('teacher_cat', ['teacher'], [
    'label' => 'Рубрики преподавателей',
    'hierarchical' => true,
    'capabilities' => [
        'manage_terms' => 'manage_teacher_terms',
        'edit_terms'   => 'edit_teacher_terms',
        'delete_terms' => 'delete_teacher_terms',
        'assign_terms' => 'assign_teacher_terms',
    ],
]);

register_taxonomy('teacher_cat', ['teacher'], [ 'label' => 'Рубрики преподавателей', 'hierarchical' => true, 'capabilities' => [ 'manage_terms' => 'manage_teacher_terms', 'edit_terms' => 'edit_teacher_terms', 'delete_terms' => 'delete_teacher_terms', 'assign_terms' => 'assign_teacher_terms', ], ]);

И роли дать assign_teacher_terms. После изменения ролей иногда проще удалить роль и создать заново при активации плагина, потому что add_role() не обновляет существующую роль. Либо явно добавляйте capabilities через get_role()->add_cap().

Также проверьте, что таксономия действительно подключена к CPT в register_post_type() или через register_taxonomy_for_object_type(). Если метабокс рубрик не появляется даже у администратора, проблема не в роли, а в регистрации таксономии. Если у администратора появляется, а у роли нет — тогда уже смотрите capabilities.

Права лучше добавлять при активации собственного плагина или один раз через миграцию, а не на каждом хите сайта. После изменения capabilities выйдите из админки и зайдите заново под нужным пользователем: WordPress и плагины ролей могут кэшировать доступ. Если CPT открыт через REST API, дополнительно проверьте show_in_rest, потому что Gutenberg может не показывать панель таксономии, хотя классический метабокс работал бы нормально.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно