Custom taxonomies were introduced in WordPress 3.0 and have created a better way to organize and specifically query custom post types. For more information about what exactly a custom taxonomy is, you can visit the WordPress Codex. This article doesn’t cover how to create a custom taxonomy, but how to use them to enhance your custom post type queries.
Let’s say we have a custom post type of “Vehicles” and have different categories of vehicles under which our post are organized. If we had a taxonomy of “Body Style” and wanted to query items that were categorized as “Sedan”, this is how we would do it:
$args = array (
'post_type' => 'vehicles',
'tax_query' => array (
array (
'taxonomy' => 'body-style',
'terms' => 'sedan',
'field' => 'slug',
)
),
);
Now let’s say we want to search for vehicles that are either a “Sedan” or a “Coupe”:
$args = array (
'post_type' => 'vehicles',
'tax_query' => array (
array (
'taxonomy' => 'body-style',
'terms' => array('sedan', 'coupe'),
'field' => 'slug',
)
),
);
Now a bit more advanced, we want to search for vehicles of a certain body style but also of a certain make. If we have another custom taxonomy of “vehicle-make” this is how we would put it together:
$args = array (
'post_type' => 'vehicles',
'tax_query' => array (
'relation' => 'AND',
array (
'taxonomy' => 'body-style',
'terms' => array ('sedan', 'coupe'),
'field' => 'slug',
),
array (
'taxonomy' => 'vehicle-make',
'terms' => 'ford',
'field' => 'slug',
)
),
);
Since we used the AND relationship the search terms of body style AND vehicle-make must be true for a post to show up. So for example, a Chevrolet Sedan or Coupe would not be displayed because it is not under the category of “Ford”.
So what if we wanted to search for vehicles that were either a sedan, coupe or a Ford? We just need to change the relationship to OR:
$args = array (
'post_type' => 'vehicles',
'tax_query' => array (
'relation' => 'OR',
array (
'taxonomy' => 'body-style',
'terms' => array ('sedan', 'coupe'),
'field' => 'slug',
),
array (
'taxonomy' => 'vehicle-make',
'terms' => 'ford',
'field' => 'slug',
)
),
);
We can also use our custom taxonomies to eliminate specific posts from our query as well. Let’s say we want to get all vehicles except Ford.
$args = array (
'post_type' => 'vehicles',
'tax_query' => array (
array (
'taxonomy' => 'vehicle-make',
'terms' => 'ford',
'field' => 'slug',
'operator' => 'NOT IN',
)
),
);
We have just scratched the surface on some ways to use custom taxonomies, but hopefully if you aren’t familiar with using them, this will be a good guide to get you started.