Shiba

Adventures in WordPress

  • Home
  • Dog
  • Art
  • Contact
  • WordPress Articles
    • WP Plugins
    • WP Programming
    • WP Admin Panels
    • WP Theme Design
    • WP How-To
    • WP Theme Images
You are here: Home / WordPress Admin / Custom Taxonomy / WordPress Custom Taxonomy Input Panels

WordPress Custom Taxonomy Input Panels

by ShibaShake 106 Comments

Would you like to add new custom fields to your WordPress posts, pages, and categories? Now you can easily do this with the WordPress custom taxonomy system. For example, if you have a blog on movie reviews, you may want to add the fields Actors and Genre to each of your posts.

What is less clear, however, is how you can expand your WordPress admin interface, so that users can easily enter in these new custom fields. WordPress 2.8+ will only include an input interface for custom taxonomies associated with posts. In addition, this input interface is the standard tag interface, where you must type in the new fields as plain text.

If you are looking for a drop-down menu, or a radio button list, you are out of luck.

Here, we consider how you can flexibly expand your WordPress post interface and style your custom taxonomy input panel however you want.

Screen-shot of the tag input interface associated with all custom taxonomies.

1. Create Your WordPress Custom Taxonomy

First, we create a simple test attribute called theme and we associate it with our WordPress posts. We add three initial terms to our new theme attribute – Beauty, Halloween, and Dragons.

Note that the hierarchical argument simply refers to whether your new theme attribute is a hierarchical structure, such as your WordPress categories, or whether it is flat, such as your WordPress tags.

The hierarchical argument does not currently affect the input interface of your new attribute. As of WordPress 2.8, the normal tag input interface will be used for all custom taxonomy attributes. To restyle the custom taxonomy input interface, you must use the add_meta_box command.

add_action( 'init', 'create_theme_taxonomy', 0 );

function create_theme_taxonomy() {
	if (!taxonomy_exists('theme')) {
		register_taxonomy( 'theme', 'post', array( 'hierarchical' => false, 'label' => __('Theme'), 'query_var' => 'theme', 'rewrite' => array( 'slug' => 'theme' ) ) );

		wp_insert_term('Beauty', 'theme');
		wp_insert_term('Dragons', 'theme');
		wp_insert_term('Halloween', 'theme');
	}
}

2. Styling Your Custom Taxonomy Input

To add input menus to your WordPress post interface, you want to use the WordPress add_meta_box command. In the example code below, we add a new custom field called Theme into our WordPress post interface. Simply include the code into your functions.php theme or plugin file.

function add_theme_box() {
	add_meta_box('theme_box_ID', __('Theme'), 'your_styling_function', 'post', 'side', 'core');
}	

function add_theme_menus() {

	if ( ! is_admin() )
		return;

	add_action('admin_menu', 'add_theme_box');
}

add_theme_menus();

Screen-shot of your new drop-down custom taxonomy interface.

The add_meta_box function adds your_styling_function to the WordPress blog system so that it gets called whenever the Edit Post screen is rendered. You can use the same function to add input code to Edit Page and Edit Link screens.

The example your_styling_function below will add a drop-down menu to your blog Edit Post screen, containing all the current terms on your theme custom taxonomy.

// This function gets called in edit-form-advanced.php
function your_styling_function($post) {

	echo '<input type="hidden" name="taxonomy_noncename" id="taxonomy_noncename" value="' . 
    		wp_create_nonce( 'taxonomy_theme' ) . '" />';

	
	// Get all theme taxonomy terms
	$themes = get_terms('theme', 'hide_empty=0'); 

?>
<select name='post_theme' id='post_theme'>
	<!-- Display themes as options -->
    <?php 
        $names = wp_get_object_terms($post->ID, 'theme'); 
        ?>
        <option class='theme-option' value='' 
        <?php if (!count($names)) echo "selected";?>>None</option>
        <?php
	foreach ($themes as $theme) {
		if (!is_wp_error($names) && !empty($names) && !strcmp($theme->slug, $names[0]->slug)) 
			echo "<option class='theme-option' value='" . $theme->slug . "' selected>" . $theme->name . "</option>\n"; 
		else
			echo "<option class='theme-option' value='" . $theme->slug . "'>" . $theme->name . "</option>\n"; 
	}
   ?>
</select>    
<?php
}

Lines 4-5 – Add security nonce check.
Line 9 – We use the hide_empty=0 argument for the get_terms function so that all theme choices will be returned, even the ones that have not yet been assigned to any post.
Line 15 – We use the wp_get_object_terms function to get the theme currently associated with our post so that we may pre-select it in our drop-down menu.
Lines 17-25 – Render our drop-down menu, populating it with our theme names.
Note – On lines 22 and 24, we are now setting the theme-option value to $theme->slug. As pointed out by Adam in the comments section, the taxonomy object slug is unique (unlike its name), and this will prevent duplicate taxonomy terms from being created.

Screen-shot of the Edit Post, which now has the old tag input box and the new drop-down menu box.

Note that when you add your new drop-down menu box, the old tag input box will still appear. To only include one input box, use the remove_meta_box command as suggested by Leo Mysor in the comments section below.

remove_meta_box('tagsdiv-theme','post','core');

Note – For non-hierarchical taxonomies (like tags) you want to use tagsdiv-{$taxonomy_name}, e.g. tagsdiv-theme. For hierarchical taxonomies (like categories) you want to use {$taxonomy_name}div, e.g. themediv.

You can add the remove_meta_box command before your add_meta_box statement.

Alternatively, you can register your custom taxonomy attribute to something other than ‘post’. In the code example below, we register our theme custom taxonomy to shiba_post, which gets rid of the standard tag input box in the Edit Post screen.

register_taxonomy( 'theme', 'shiba_post', array( 'hierarchical' => false, 'label' => __('Theme'), 'query_var' => 'theme', 'rewrite' => array( 'slug' => 'theme' ) ) );

However, as pointed out by Leo, this also removes your taxonomy tab from the Posts menu and makes it difficult for others to add new items to your taxonomy.

3. Saving Your New Inputs

Now, we can insert any input panel we want for our custom taxonomy, however, we still need a way to save those input values. This can be achieved with the save_post WordPress hook. This hook allows you to execute a function of your choice when a WordPress post gets saved. There are similar hooks for saving pages and links.

Just add the save_post hook to your existing add_theme_menus function. For example, the code below registers the save_taxonomy_data function with the WordPress blog system so that it gets executed whenever a WordPress post is saved or updated.

function add_theme_menus() {

	if ( ! is_admin() )
		return;

	add_action('admin_menu', 'add_theme_box');

	/* Use the save_post action to save new post data */
	add_action('save_post', 'save_taxonomy_data');
}

Now, you just need to specify your save_taxonomy_data function. We can adapt our own save function from the add_meta_data example on WordPress.org.

function save_taxonomy_data($post_id) {
// verify this came from our screen and with proper authorization.

 	if ( !wp_verify_nonce( $_POST['taxonomy_noncename'], 'taxonomy_theme' )) {
    	return $post_id;
  	}

  	// verify if this is an auto save routine. If it is our form has not been submitted, so we dont want to do anything
  	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
    	return $post_id;

  
  	// Check permissions
  	if ( 'page' == $_POST['post_type'] ) {
    	if ( !current_user_can( 'edit_page', $post_id ) )
      		return $post_id;
  	} else {
    	if ( !current_user_can( 'edit_post', $post_id ) )
      	return $post_id;
  	}

  	// OK, we're authenticated: we need to find and save the data
	$post = get_post($post_id);
	if (($post->post_type == 'post') || ($post->post_type == 'page')) { 
           // OR $post->post_type != 'revision'           $theme = $_POST['post_theme'];
	   wp_set_object_terms( $post_id, $theme, 'theme' );
        }
	return $theme;

}

Lines 4-6 – First we do a nonce check to ensure that the function is being called by our very own your_styling_function. Make sure that the taxonomy_noncename and taxonomy_theme terms match those that were created earlier, on lines 4-5 in your_styling_function.

Lines 9-10 – Take no action for auto-saves.

Lines 14-20 – Check that the current user has proper permissions to edit posts.

Lines 23-28 – Associates our post with the new theme taxonomy data. It is important to do a post_type check here, because this function will also get called on post revision objects.

As pointed out by Angelia, this results in double counting the newly added taxonomy relationship.

4. Getting a Taxonomy Term Count

If you want to get the count of a particular taxonomy term, i.e., the number of objects that it is associated with, you can easily extract that figure from the WordPress term_taxonomy database.

Just add the count code into the foreach $themes loop.

global $wpdb;
foreach ($themes as $theme) {

        $count = $wpdb->get_var( $wpdb->prepare( "SELECT count FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $theme->term_taxonomy_id) );

        /* Your code here to display the count ... */
}

While registering your custom taxonomy, you can link an update_count_callback function to it. This function will get called every time any term in your taxonomy gets a count update. This allows you to control what actually gets stored in the count column of your custom taxonomy terms.

$args = array( 'hierarchical' => false, 
               'update_count_callback' => 'test_taxonomy_count', 
               'label' => __('Theme'), 
               'query_var' => 'theme', 
               'rewrite' => array( 'slug' => 'theme' ) )
register_taxonomy( 'theme', 'post',  $args);

// This test count function just does the default WordPress operations
function test_taxonomy_count($terms) {
	global $wpdb;
	$terms = array_map('intval', $terms);
	
	foreach ( (array) $terms as $term) {
		$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term) );
		$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );
	}
}

5. All Done!

You can use the same code to style your custom taxonomy input panels for pages and links. Just change the post attribute to page or link when calling add_meta_box and use the save_page, edit_link, and add_link hooks instead of save_post.

You can also add new fields to your WordPress blog categories using a similar system.

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Comments

« Previous 1 … 4 5 6
  1. Phil T says

    June 28, 2022 at 5:33 am

    This is unnecessarily confusing. Why declare a variable with the same name as your taxonomy? Why did you choose a taxonomy name that is used extensively in WordPress for something completely different?

    Reply
  2. daniel says

    October 22, 2017 at 9:08 am

    hi, i was wondering if you can suggest how can i create a change the display of categories to have the same auto complete system like tags?

    thanks

    Reply
  3. Kari Sharp says

    August 7, 2017 at 10:24 am

    Hi ShibaShake —

    This is a great tutorial! Thank you so much! I don’t know if you’re still keeping up this post, but I am wondering how you might set a default term if no term is selected, or have the dropdown list not include the “None” option so that upon save, you would be saving with the first term in the list? I need to make sure each post is set with the default term in the taxonomy, rather than no term.

    Thanks!
    Kari

    Reply
  4. kenny says

    November 21, 2015 at 9:16 am

    great tutorial thanks!

    I want 2 custom taxonomies, but when I copy the code and change the names I get a server error.

    Any ideas why this happens?

    Thanks!

    Reply
    • kenny says

      November 21, 2015 at 9:53 am

      Found a solution for my problem.

      I’m using this generator which does the trick. https://generatewp.com/taxonomy/

      Reply
  5. mapaxa says

    September 24, 2015 at 6:39 am

    Hi! Thanks for great tutorial. It all works.

    Reply
  6. Alfred says

    December 28, 2014 at 11:16 pm

    Hi, how can I make this work with two or more custom taxonomies?

    Reply
  7. Imperative Ideas says

    October 9, 2013 at 2:21 pm

    This just made my day man. I was almost sure I was going to spend the next few hours figuring it out myself.

    Reply
  8. Johan says

    May 6, 2013 at 11:41 pm

    Hello and thanks for a super tutorial!
    I’m struggling to add another dropdown list, but i cant get it to work. Do you have any suggestions on how to do it?

    Much appreciated!

    Reply
« Previous 1 … 4 5 6

Recent Posts

  • Screenshot of an example article in code view of a modified Gutenberg editor.How to Harness the Power of WordPress Gutenberg Blocks and Combine It with Legacy Free-Form Text
  • Screenshot of the Success, WordPress has been installed page.Migrating Your WordPress Website to Amazon EC2 (AWS)
  • Screenshot of WinSCP for creating a SFTP configuration.How to Set-Up SFTP on Amazon EC2 (AWS)
  • WordPress Gutenberg code view screenshot of this article.How to Prevent Gutenberg Autop from Messing Up Your Code, Shortcodes, and Scripts
  • Screenshot of the Success, WordPress has been installed page.How to Create a WordPress Website on Amazon EC2 (AWS)

Recent Comments

  • Screenshot of an example article in code view of a modified Gutenberg editor.How to Harness the Power of WordPress Gutenberg Blocks and Combine It with Legacy Free-Form Text (1)
    • tom
      - hi,my experience was like the same, but for me as theme developer the "lazy blocks"(https://wordpress.org/plugins/lazy-blocks/) ...
  • WordPress Custom Taxonomy Input Panels (106)
    • Phil T
      - This is unnecessarily confusing. Why declare a variable with the same name as your taxonomy? Why did you choose a taxonomy ...
  • Create Pop-up Windows in Your WordPress Blog with Thickbox (57)
    • Jim Camomile
      - I have used this tutorial several times and it is one of the few simple and effective ways to add popups with dynamic content, ...
  • How to Add Admin Columns in WordPress (7)
    • Andy Globe
      - Hi Friends, I am facing two problem in WordPress admin1. Load custom CSS for wp-admin on user-role base (editor) 2. ...
  • Example blog front-page using excerpts and the Shiba Theme.Optimize Your WordPress Plugins with Tags (5)
    • DF
      - thanks, i went the other way and added a filter if pages I wanted.

Copyright © 2023 · Genesis Skins by ShibaShake · Terms of Service · Privacy Policy ·