Read-only taxonomy (user can assign term but can’t create or edit existing terms)

The question:

I’m creating a custom taxonomy whose terms must remain fixed by all users. Once I’ve set up the starting set of terms, I want them to be immutable. I also don’t want to clutter up the Admin UI with additional links and metaboxes where they’re not needed.

However, setting public => 'false', or show_ui => 'false' not only hides the manage tax link, but also prevents the user from assigning the term to a new post.

I need a way to hide the “manage” link within the post type pulldown, show the term selector metabox on the post page, but (hopefully) disable the “Add Term” option at the bottom of this metabox.

Does such a feature exist? Or are taxonomies always supposed to be user editable?

Custom taxonomy capabilities get me most of the way there, since you can independently set CRUD rights based on capability. But how to disable even admins from modification? (I know this sounds like a bad idea but it’s viable.)

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

A bit late but thought this could use updating.

Create your custom taxonomy and add the terms you need, then go back to your register_taxonomy() function and set the capabilities argument (which itself accepts an array of capabilities). You can see how I setup sex for dogs which can only ever have two values–”Male” or “Female”, which I input. Now admins can only assign a dog to a sex but cannot add, delete, or edit the sexes.

register_taxonomy('sex', 'dog', array(
  'capabilities' => array(
    'manage_terms' => '',
    'edit_terms' => '',
    'delete_terms' => '',
    'assign_terms' => 'edit_posts'
  ),
  'label' => 'Sex',
  'labels' => array(
    'name' => 'Sex',
    'add_new_item' => 'Add New Sex',
    'new_item_name' => "Add New Sex"
  ),
  'public' => true,
  'show_admin_column' => true,
  'show_in_nav_menus' => false,
  'show_tagcloud' => false,
  'show_ui' => true,
  'hierarchical' => true
));

Works on hierarchical taxonomies; I did not try non-hierarchical but it should work there too.

Method 2

You talking categories (hierarchical) or tags? You just need a hidden taxonomy + custom widget. If it’s categories, it easier to do, if tags… depends if the number of items is decent. And you can hide them from public view only for non-Administrators. That way you can manage them easily while the others can’t touch them.

Thanks.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment