Custom taxonomies are great. I registered a bunch of new taxonomies and wrote an importer to import our hierarchical taxonomy into WordPress a la XML. The problem is one taxonomy has about 1,100 terms and browsing a checklist of 1,100 things is cruel and unusual punishment.
Is there any way to have a hierarchical taxonomy but use the Tag interface (search box with auto complete) instead?
Update: this code from Bainternet’s answer gets most of the way there
(adds tag interface for the specified taxonomy, with working
autocomplete and correctly populated “most used” tag cloud), but terms
are not saved on post save. If the post had terms before, they will
be deleted on save. So I am still looking for an answer. (This same code saves terms just fine if the taxonomy is registered withhierarchichal
set to false, but the point of the question is to use the tag interface on a hierarchical taxonomy.)
//remove default metabox
//change TAXONOMY_NAME to your taxonomy name
add_action( 'admin_menu' , 'remove_post_custom_fields' );
function remove_post_custom_fields() {
remove_meta_box( 'issuediv' , 'post' , 'normal' );
}
//add our custom meta box
add_action( 'add_meta_boxes', 'my_add_custom_box' );
function my_add_custom_box() {
add_meta_box(
// 'myplugin_sectionid',
'tagsdiv-issue',
__( 'New and Improved Issue Tags', 'textdomain' ),
'tags_like_custom_tax',
'post'
);
}
//call back function to display the metabox
//change TAXONOMY_NAME to your taxonomy name
function tags_like_custom_tax(){
$tax_name = 'issue';
global $post;
$taxonomy = get_taxonomy($tax_name);
$disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '';
?>
<div class="tagsdiv" id="<?php echo $tax_name; ?>">
<div class="jaxtag">
<div class="nojs-tags hide-if-js">
<p><?php echo $taxonomy->labels->add_or_remove_items; ?></p>
<textarea name="<?php echo "tax_input[$tax_name]"; ?>" rows="3" cols="20" class="the-tags" id="tax-input-<?php echo $tax_name; ?>" <?php echo $disabled; ?>><?php echo get_terms_to_edit( $post->ID, $tax_name ); // textarea_escaped by esc_attr() ?></textarea>
</div>
<?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
<div class="ajaxtag hide-if-no-js">
<label class="screen-reader-text" for="new-tag-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->name; ?></label>
<div class="taghint"><?php echo $taxonomy->labels->add_new_item; ?></div>
<p><input type="text" id="new-tag-<?php echo $tax_name; ?>" name="newtag[<?php echo $tax_name; ?>]" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
<input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
</div>
<p class="howto"><?php echo esc_attr( $taxonomy->labels->separate_items_with_commas ); ?></p>
<?php } ?>
</div>
<div class="tagchecklist"></div>
</div>
<?php if ( current_user_can($taxonomy->cap->assign_terms) ) { ?>
<p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
<?php }
}
The original question is borrowed from the WordPress forum post here.
Here’s how I did it. Just add a conditional that checks if the page being loaded is an admin page or not. If it is an admin page, set hierarchical to false, otherwise set hierarchical to true. Like so:
That should give you the idea. The downside to this is you can’t add parent relationships to terms using the admin interface. You could get more specific in the
is_admin()
conditional such as looking to see if the request containspost-new.php
orpost.php
â¦Terms from a hierarchical taxonomy can only be added if WP gets their term_ids on save (look at the way the default metabox for category is working to get the idea), because in a hierarchical taxonomy there can be multiple identical term names if these terms are in different branches of the hierarchy tree.
With non-hierarchical terms, this is not possible. As was pointed out here, when adding terms from a non-hierarchical taxonomy, their ids are retrieved by term_exists() via the term names, which obviously can only work if you have unique term names. So I don’t think kingkool68’s answer is working in more complex taxonomy situations.
So I made this work by using a combination of the tag-style UI and the “inner workings” of a hierarchical taxonomy metabox. I’ve based this on Bainternet’s example. My custom taxonomy here is “coverages”, which can be added to posts, attachments and pages.
PHP
JS
The only way i have found is to remove the default metabox and create your own, here is the code i have used:
As for saving, you don’t need to worry about it, WordPress does that for you.
Update, I just tested it with categories and it works fine:
I find solution, how to use the tag interface on a hierarchical taxonomy.
For the first, we need to create is_edit_page() function:
* code taken from here.
Now you can use code prodived by kingkool68:
It saves the hierarchical structure, but show taxonomies on edit page like tags (comma separated).
I think we can add a hidden input that retrieves the selected tag’s
term_id
via jQuery (AJAX) and save it as the post’s term by using the functionwp_set_object_terms
.I’ve posted another question relevant to this problem: WP native tag suggest metabox. How does it process tag id?