Возможности пользовательских таксономий
Я зарегистрировал несколько пользовательских таксономий для пользовательского типа записей. Код для одной из них выглядит следующим образом:
$labels = array(
'name' => __( 'Жанр', 'textdomain' ),
'singular_name' => __( 'Жанр', 'textdomain' ),
'search_items' => __( 'Поиск жанров', 'textdomain' ),
'all_items' => __( 'Все жанры', 'textdomain' ),
'parent_item' => __( 'Родительский жанр', 'textdomain' ),
'parent_item_colon' => __( 'Родительский жанр:', 'textdomain' ),
'edit_item' => __( 'Редактировать жанр', 'textdomain' ),
'update_item' => __( 'Обновить жанр', 'textdomain' ),
'add_new_item' => __( 'Добавить новый жанр', 'textdomain' ),
'new_item_name' => __( 'Новый жанр', 'textdomain' ),
'menu_name' => __( 'Жанры', 'textdomain' ),
);
$args = array(
'labels' => $labels,
'public' => true,
'show_admin_column' => true,
'show_ui' => true,
'hierarchical' => true,
'capabilities' => array(
'manage_terms' => 'edit_posts',
'edit_terms' => 'edit_posts',
'delete_terms' => 'edit_posts',
'assign_terms' => 'edit_posts'
)
);
register_taxonomy( 'genres', 'book', $args );
У меня возникли проблемы с правами доступа, так как я хочу, чтобы одной из пользовательских таксономий могли управлять авторы.
Если я определяю возможности, как в коде выше ('manage_terms' => 'edit_posts'
), авторам не разрешается добавлять новые термины в пользовательскую таксономию, даже если у них есть право edit_posts.
Я также пробовал добавлять пользовательские права для роли автора и назначать эти права при регистрации пользовательской таксономии, но без успеха.
Что действительно работает - это добавление 'manage_categories' к роли автора, но это решение неудовлетворительно, так как тогда все таксономии становятся доступными для редактирования авторами.
Заранее спасибо за помощь.

Так же, как и возможности пользовательских типов записей (CPT), возможности таксономий также можно настраивать в register_taxonomy()
:
capabilities (возможности)
- 'manage_terms' - 'manage_categories' (управление терминами)
- 'edit_terms' - 'manage_categories' (редактирование терминов)
- 'delete_terms' - 'manage_categories' (удаление терминов)
- 'assign_terms' - 'edit_posts' (назначение терминов)
Поскольку у ваших авторов есть только edit_posts
, это работает так, как вы наблюдаете — они могут назначать существующие термины, но не создавать их. Вы можете настроить возможности для конкретной таксономии и дать авторам соответствующее право, чтобы они могли создавать термины в ней (но не в других таксономиях).

@vguerrero нет, вам нужно настроить права для таксономий. Таксономии и пользовательские типы записей (CPT) — это совершенно разные вещи с разными наборами прав, вы не можете управлять ими обоими только через определение CPT.

Если я правильно понимаю, вы предлагаете определить права для пользовательского типа записей как 'capabilites' => array( 'manage_terms' => 'manage_custom_tax', 'edit_terms' => 'manage_custom_tax', 'delete_terms' => 'manage_custom_tax', 'assign_terms' => 'edit_posts')
и затем добавить 'manage_custom_tax' к роли автора. Я пробовал это до создания этого поста и попробовал снова, но без успеха. Думаю, я вас не до конца понимаю. Буду признателен за более подробное объяснение или пример. Спасибо.

Извините, я написал "пользовательский тип записей", но имел в виду пользовательскую таксономию.

@vguerrero да, именно это я и предлагал, и не уверен, почему это не сработало в вашем случае. Вы могли бы попробовать подробнее описать, что вы пробовали, в своем вопросе.

Ок. Это несколько неловко. Мне очень жаль. Всё из-за опечатки в слове capabilites, и я не мог её заметить, хотя бился над этим два дня. Думаю, я мог бы удалить этот пост, так как он не представляет никакого интереса. Извините за неудобства.

При определении возможностей (capabilities) при регистрации таксономии вы создаёте новые права, которые соответствуют существующим возможностям: manage_terms
, edit_terms
, delete_terms
и assign_terms
.
Поскольку ваша таксономия называется Genre
, вам следует сделать следующее:
'capabilities' => array(
'manage_terms' => 'manage_genre',
'edit_terms' => 'edit_genre',
'delete_terms' => 'delete_genre',
'assign_terms' => 'assign_genre',
)
После этого вы сможете назначить эти права определённым ролям пользователей. Самый простой способ (и мой предпочтительный) — использовать плагин, например Capability Manager Enhanced, хотя существует множество других плагинов, которые также справятся с этой задачей.

Если кто-то окажется здесь в поисках способа изменить ранее зарегистрированную таксономию, можно использовать хук register_taxonomy_args.
add_filter( 'register_taxonomy_args', 'modify_my_taxonomy', 20, 2 );
function modify_my_taxonomy( $args, $taxonomy ) {
$capabilities = array(
'manage_terms' => 'edit_posts', // управление терминами
'edit_terms' => 'edit_posts', // редактирование терминов
'delete_terms' => 'edit_posts', // удаление терминов
'assign_terms' => 'edit_posts', // назначение терминов
);
if ( 'my-tax' === $taxonomy ) {
$args['capabilities'] = $capabilities;
}
return $args;
}
