Пользователь не может привязывать рубрики к CPT записям WordPress, как дать ему это право?
Создал я роль "Преподаватели", чтобы пользователь с этой ролью мог редактировать преподавателей на сайте, и не мог случайно их удалить, и зайти в ненужные части админки. Но вылезла такая проблема, что к записям "Преподаватели" нельзя присвоить рубрики.
Я уже пытался это гуглить, много что перебпробовал. Давал различные доступы, но не помогало
Код с помощью которого создал роль
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 недостаточно дать роли абстрактный 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'); });
Обратите внимание на множественное число capabilities. При регистрации CPT нужно задать
capability_typeиmap_meta_capкорректно. Например: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', ], ]);
И роли дать
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 может не показывать панель таксономии, хотя классический метабокс работал бы нормально.