Adding Custom Meta Headers To Taxonomy Table Columns in WordPress 3.0
Filed Under: Tags: headers, meta, plugin, taxonomy, WordPress
This is part 2 of a series on digging deeper into the new WordPress Custom Taxonomies. In the previous article, “Custom Meta for new Taxonomies in WordPress 3.0“, I walked you through setting up the custom meta tables and the Taxonomy term editor form. In this part of the series I’ll show you how to add your new taxonomy meta fields to the taxonomy listing page.
Background
To bring everyone up to speed on the project I’m developing a simple product management system (e-Commerce) for a client. I wanted to take advantage of the new Custom Post Types and Taxonomies in the WordPress 3.0 system. I setup a new Post Type ‘Products’. As part of Products I’m defining a new Taxonomy ‘Product Packages’. A ‘Package’ is how a product is sold to the user. Think of threadless.com or some product site where you must select options like size or color. In our case each package has a number of extra ‘meta’ fields associated with it. In the case of my product packages some of these meta fields are unit price, shipping price, package active.
The goal of this article is to modify the default columns displayed on the taxonomy listing. These default columns are Name, Description and Slug. While these are sufficient for other taxonomies like post categories or post tags they don’t exactly work for my product package needs. What we will be building is some more like the following which includes meta field from part I. The column headers we will be added are ‘Active’ to show when a Product Package is on or off and the column header ‘Price’ which is the unit Price for a given package. These columns were chosen because the let the administrator visually see the information in the table form without needing to access each package detail.
So lets get started.
Adding Taxonomy Column Headers
We will start with adding the filter to modify the column headers. When I click on the ‘Product Packages’ I noted that URL for the taxonomy listing is
http://local.localsite.com/wp-admin/edit-tags.php?taxonomy=product_packages&post_type=products
After doing some digging I found that the edit-tags.php code calls a number of functions to build out the page structure. One of these function is ‘get_column_headers()’ The get_column_headers function is located in the /wp-admin/includes/template.php file line 674. Inside this function there are various checks to see if we are dealing with a normal build-in screen like for post categories or post tags. If not the logic falls down to line 761 there a filter is executed. The filename key or name is dynamic and is based on the taxonomy name. The filter key is ‘manage_’ . $screen->id . ‘_columns’. The screen->id value is the taxonomy name we used ‘product_packages’. The filter we will be setting up will be ‘manage_product_packages_columns’. So in our code’s init function we to subscribe to this filter and add a function to handle the processing. Below is the code. The init function you may recognize from part I.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | add_action( 'init', 'product_init' ); function product_init() { register_taxonomy( 'product_packages', 'products', array( 'hierarchical' => true, 'label' => __('Product Packages'), 'query_var' => false ) ); // Added from Part II. // This filter sets up a call to your function which will handle // adding (and removing) items from the columns array. This // filter passes up only one argument. The array of default headers. add_filter( 'manage_product_packages_columns', 'admin_product_packages_column_headers, 10, 1); } // Add this to your code's init function. This filter passes up // only one argument. The array of default headers. add_filter( 'manage_product_packages_columns', 'admin_product_packages_column_headers, 10, 1); // Add this function somewhere else in your plugin or functions file. function admin_product_packages_column_headers($columns) { // We are going to create a new array to hold the headers. // Below we take the checkbox column and the name column // and add to the new column array. Removing unwanted columns // and adding new one is trivial. The below method has // room form much improvement. $columns_local = array(); if (isset($columns['cb'])) { $columns_local['cb'] = $columns['cb']; unset($columns['cb']); } if (isset($columns['name'])) { $columns_local['name'] = $columns['name']; unset($columns['name']); } // We add the Package Active to the second column if (!isset($columns_local['product_package_active'])) $columns_local['product_package_active'] = "Active"; if (isset($columns['posts'])) $columns['posts'] = "Used"; $columns_local = array_merge($columns_local, $columns); if (!isset($columns_local['product_package_unit_price'])) $columns_local['product_package_unit_price'] = "Price"; return array_merge($columns_local, $columns); } |
This should get the new columns added to the display table. You can save your code and verify. The table headers will be displayed. But the row content will be empty.
Adding Taxonomy Column Data
The table row content is added using another filter hook. Again, once of the function called from within edit_tags.php is the core function tag_rows(); This function in turn calls other functions. Eventually, the flow ends up in _tag_row() in template.php line 398. Much like the header logic various checks are made to see if we are dealing with a built-in taxonomy. If not then a dynamic filter hook is executed at line 483. This dynamic filter like the header filter uses the taxonomy to name the filter key unique. The filter key is
‘manage_${taxonomy}_custom_column’. Again placing in our taxonomy key ‘product_packages’ the complete filter key will be ‘manage_product_packages_custom_column’.
So back to our code we add another add_filter command to out init function. Then we add a new function to process the filter request.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | add_action( 'init', 'product_init' ); function product_init() { // From Part I register_taxonomy( 'product_packages', 'products', array( 'hierarchical' => true, 'label' => __('Product Packages'), 'query_var' => false ) ); // Added from Part II. // This filter sets up a call to your function which will handle adding (and removing) items // from the columns array. This filter passes up only one argument. The array of default headers. add_filter( 'manage_product_packages_columns', 'admin_product_packages_column_headers, 10, 1); // This filter sets up a call to display the contents of a Product Package row column. // The filter passes up 3 argument. We only use the second and third arguments. add_filter( 'manage_product_packages_custom_column', 'admin_product_packages_column_row', 10, 3 ); } // This function we check the column name then pull in the row data using get_metadata() function admin_product_packages_column_row( $row_content, $column_name, $term_id ) { switch($column_name) { case 'product_package_active': $product_package_active = get_metadata('product_packages', $term_id, 'product_package_active', true); if (!$product_package_active) $product_package_active = "yes"; return ucfirst($product_package_active); break; case 'product_package_unit_price': return get_metadata('product_packages', $term_id, 'product_package_unit_price', true); break; default: break; } } |
And that is it. At this point you should now see your taxonomy custom meta fields display in new column when listing your taxonomy items.
You can leave a response, or trackback from your own site.





August 30th, 2010 at 12:16 pm
Once again a great article, I’am however with some problems with the implementation of the meta fields in the custom taxonomies. How can I show the content of the meta fields in the FrontOffice? The ‘get_the_term_list’ only returns the taxonomy name and not the created meta fields…
August 30th, 2010 at 12:20 pm
@Pedro Farinha: Thanks. To get at the meta you have to call get_metadata() for the specific taxonomy term. In the article in the function ‘dmin_product_packages_column_row’ I’m calling get_metadata() for each of the taxonomy meta fields.
$product_package_active = get_metadata(‘product_packages’, $term_id, ‘product_package_active’, true);
As far as I know there is not a simple way to grab all meta fields at once like with post meta.
November 6th, 2010 at 6:43 pm
Hey, Paul. Great article. Is it possible to make those new entries input fields for inline editing, or is it strictly read-only? It would be great if you could make modifications right there!
November 7th, 2010 at 6:26 am
@Tim Woodbury: Thanks for the comment. Doing inline field edits would be nice but not really the focus of the how-to article.
January 19th, 2011 at 8:40 pm
Great articles Paul!!! I was able to follow through the both tutorials just fine.
I did run into one catch though.. as of 3.0.4? The filter to add columns to the new taxonomy term list page has changed (note the addition of ‘edit-’):
add_filter( ‘manage_edit-product_packages_columns’,
‘admin_product_packages_column_headers, 10, 1);
Thanks Paul!
January 20th, 2011 at 8:41 am
@James Mehorter: Awesome! Thanks for the comment and thanks for providing the note on the difference in 3.0.4 (and higher). I’ve been waiting for WP 3.1 to finish up then was planning to update the post.
July 13th, 2011 at 2:24 am
how if I want to add new colomn in list post table wordpress admin??
for example, I add
“note” field in database. How if I want to show my new field in list post table wordpress??
July 13th, 2011 at 9:43 am
[...] how if I want to add new colomn in list post table wordpress admin?? for example,… by Guns on July 13, [...]
July 13th, 2011 at 9:44 am
Guns » I just wrote up a quick post on how to add columns to the Post listing http://www.codehooligans.com/2011/07/13/adding-custom-columns-to-wordpress-post-listing/
October 21st, 2011 at 7:31 am
Hey Paul,
Great stuff!! Is there any way to add the custom meta fields to the “Add New {TAXONOMY TYPE}” screen? I’m looking at the {TAXONOMY_TYPE}_pre_edit_form, but I’m not sure that’s the answer…
Any insight you have surely would be appreciated.
Thanks,
–d
October 21st, 2011 at 7:40 am
My bad… what I was looking for was the _add_form_fields action…
October 21st, 2011 at 9:28 am
Luke » I’m confused. Have you found what you are looking for or do you still need help?