Create a Custom, Sortable Column for a Taxonomy

Development,Projects,Snippets,WordPress,WordPress Filters

A recent project required a custom, sortable column for a taxonomy which contained a custom field. I found plenty of tutorials on how to make a custom sortable column in the WordPress edit screen, but sadly their scopes were all confined to the post edit screen. The code from those tutorials got me 90% of the way there, but they did not provide working examples of sortable custom columns on the taxonomy or post_tag edit screen.

Most tutorials I found relied on the pre_get_posts action hook to modify the edit screen’s query and sort its results by meta_key. Unfortunately this poses two issues: (1) pre_get_posts is not an action hook available to us when querying taxonomy terms into the admin grid/table on wp-admin/edit-tags.php?taxonomy=post_tag; and (2) in my case, my wp_terms table does not have native metadata and the custom field I wanted to search by was located in another table. I understand that #2 may be available in future versions of WordPress and custom fields plugins, but for purposes of this post I assume your taxonomy has metadata stored in a table outside the native wp_terms table (mine is stored in wp_options).

I poked around in the WordPress taxonomy API (wp-includes/taxonomy.php in WP 4.3.1) and discovered that the query is set on line 2004 and above it we have access to several filters which allow us to modify the query. #1 solved.

My custom taxonomy is called issue and the custom field is a required date picker called issue-date (created using ACF PRO). Using phpMyAdmin I ran a quick search in my database for issue-date to figure out where the metadata was being stored:

custom_taxonomy_columns-db_search_results

So we need to join the wp_options table to our query…

custom_taxonomy_columns-db_search_results_details

…based on option_name intersecting with our term_id and sorted by option_value to solve #2.

No problem!

IMPORTANT: make sure if you’re using a date picker field like I was that you set its return format to Ymd.

Here’s how I ended up doing it:

Step 1: Create the new column itself, it will be empty initially

Step 2: Populate the new column

Step 3: Make the new column sortable

Step 4: Define the custom sorting (where the magic happens)

This worked right out of the gate for me. Notice that my two ternary expressions (lines 10 & 11 in step 4) ensure that Issues will be sorted descending by date (newest first) when an admin first arrives at the Issue edit screen until they specify different sorting criteria. That is what my client really wanted so I set it up as the default.

Enjoy your new custom, sortable taxonomy columns!


Leave a Comment