Как настроить индивидуальные возможности в таксономии? Или как перерегистрировать существующую таксономию?
Таксономия по умолчанию, категория. По умолчанию только те, у кого есть возможность edit_posts
, могут назначать категории во время создания/редактирования записи.
У меня есть роль с очень ограниченными возможностями. Я хочу, чтобы пользователи в этой роли могли назначать категории во время создания/редактирования пользовательских типов, но я не могу предоставить им возможность edit_posts
, и они не должны иметь возможности редактировать таксономию, только назначать ее.
Как я могу это сделать? Установка 'assign_terms' => 'read'
является одним из вариантов, но как я могу установить это значение без необходимости перерегистрировать таксономию?
Или, в качестве альтернативы, как я могу предоставить моей роли низкого уровня разрешение на назначение таксономии?
3 answers
Это должно сработать
add_action( 'init', 'register_category_again', 1 );
function register_category_again() {
$user = wp_get_current_user();
if ( $user->roles[0] != 'your_custom_role' ) return;
global $wp_taxonomies;
unset( $wp_taxonomies['category'] );
global $wp_rewrite;
$rewrite = array(
'hierarchical' => true,
'slug' => get_option('category_base') ? get_option('category_base') : 'category',
'with_front' => ! get_option('category_base') || $wp_rewrite->using_index_permalinks(),
'ep_mask' => EP_CATEGORIES,
);
register_taxonomy( 'category', 'post', array(
'hierarchical' => true,
'query_var' => 'category_name',
'rewrite' => $rewrite,
'public' => true,
'capabilities' => array(
'manage_terms'=> 'manage_categories',
'edit_terms'=> 'manage_categories',
'delete_terms'=> 'manage_categories',
'assign_terms' => 'read'
),
'show_ui' => true,
'show_admin_column' => true,
'_builtin' => true,
) );
}
Я только что нашел этот вопрос, и хотя он мог бы сработать, я не был удовлетворен решением. Должен был быть лучший способ сделать это, не регистрируя таксономию снова. И есть лучшее решение, которое я сейчас использую в своем плагине CPT.
public function wpse_108219_set_taxonomy_caps( $taxonomy, $object_type, $args ) {
global $wp_taxonomies;
if ( 'category' == $taxonomy && 'cpt_item' == $object_type ) {
$wp_taxonomies[ $taxonomy ]->cap->assign_terms = 'edit_cpt_items';
}
}
add_filter( 'registered_taxonomy', 'wpse_108219_set_taxonomy_caps' ), 10, 3 );
В этом примере я установил возможность assign_terms
для пользовательского типа записи cpt_item
в пользовательскую возможность edit_cpt_items
, которая позволяет любому пользователю с этой возможностью назначать категории CPT.
Я надеюсь, что это более чистое решение также работает на тебя.
Вы также можете отфильтровать аргументы категории core до регистрации таксономии:
<?php
/*
* Set the capabilities for the category taxonomy before it's registered.
*
* @param array $args Array of arguments for registering a taxonomy.
* @param array $object_type Array of names of object types for the taxonomy.
* @param string $taxonomy Taxonomy key.
*/
function wpse_108219_register_taxonomy_args( $args, $taxonomy, $object_type ) {
if ( 'category' === $taxonomy ) {
$args['capabilities'] = array(
'manage_terms' => 'manage_categories',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'read',
);
}
return $args;
}
add_filter( 'register_taxonomy_args', 'wpse_108219_register_taxonomy_args', 10, 3 );