Add Custom Post Types to Tags and Categories in WordPress

WordPress gives you the ability to add custom post types and taxonomies easily with some simple code in your functions.php file, or through the use of a plugin like CustomPress. That means, you can quickly turn your WordPress site into a fairly well-featured CMS.

The only problem is, out of the box, WordPress does not automatically take your newly created custom post types and add them to the archive pages for existing taxonomies ‘categories’ or ‘tags.’

That means, if you created a custom post type called “movies” and used the native WordPress taxonomy “category” to categorize and order that custom post type, simply navigating to the archive for that category will not show your custom post type in the list of posts for that archive.

For example, you created a movie review site and used standard WordPress categories and tags with that custom post type so you could relate those reviews to your other posts or pages. Let’s say you decided to use a category of “drama.” Navigating to the category archive for drama, namely http://yoursite.com/category/drama will not show the custom post type you just added – even though you selected the drama category.

This is frustrating for those who go through the trouble to add plan out a custom post type, taxonomies, add the content and then find out it doesn’t display correctly.

Some would call this a bug, but the developers at WordPress maintain that sorting archives is for normal post types for which WordPress was created, and adding in that functionality for custom post types requires some custom code. And indeed it does.

So, if you’d like your custom post types to show up in archive listings for your site’s standard tags and categories you can add the following code to your functions.php file:

1
2
3
4
5
6
7
8
9
10
11
function add_custom_types_to_tax( $query ) {
if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {

// Get all your post types
$post_types = get_post_types();

$query->set( 'post_type', $post_types );
return $query;
}
}
add_filter( 'pre_get_posts', 'add_custom_types_to_tax' );

If you’d like to add only specific post types to listings of tags and categories you can replace the line:

1
$post_types = get_post_types();

with:

1
$post_types = array( 'post', 'your_custom_type' );

If you’d like to read more about the difference between custom post types, custom fields, and custom taxonomies you will be interested in this series of posts right here on WPMU.org.

Comments (9)

  1. Craig, I’m really new to custom post types and while I make a little progress I keep ending back up where I started, which is looking for a good solution for posting press releases. I’d like to create a custom post type which includes the standard fields and also allows me to attach an image file and a PDF.

    I’ve tried using a lot of different plug-ins and tried writing my own code but nothing is working out for me. The ACF plug-in gets me close but I’m not sure how to call my single-press_release.php template. I’ve been working on this for over two days without any success.

    • Shaun,
      It can be kind of confusing if you’re just starting with CPTs, but I’d be happy to help if I can.
      Why don’t you post a link to your site, and I’ll see if I can work something up simultaneously on a test site and see if we can get it working together.

  2. Great post, Craig– As huriara says, I’ve been searching for hours for a solution, and this was it! =)

    One problem, though. The theme that our company is using has a shortcode to display recent posts on the homepage. But when I use my new CPT “blog” in the settings, I get nothing. Here’s the shortcode:

    [blog_posts count=”4″ post_category=”blog” title=”From the Blog” link_text=”Read More” character_count=”115″ layout=”four_col_small” style=”modern”]

    When I view the category for that post, your code allows those posts to be displayed, but something’s not registering with the short code. See below:

    http://dev.dreamlocal.com
    Scroll to the bottom to see the From the Blog heading and no posts below. Going to:

    http://dev.dreamlocal.com/categories/blog
    you can see that the CPT and category of Blog is definitely working.

    Any ideas? Am I best to contact the developer?

    I’m a bit of a novice when it comes to messing with the depths of WP code and CPT’s.

    Thanks!!

    –Jason

    • Jason,

      it’s likely the developer of the theme created the functions for those shortcodes and baked them right into your theme. It’s also possible they work with a specific post type – probably just the standard posts.

      Aside from that, I’m a little confused from your message. It sounds like you created a custom pot type called “Blog”, which, if that’s true, probably isn’t a great idea. It will just cause too much confusion down the road.

      Your site should already include posting functionality, and you can create just a category “blog” you don’t need a new post type for that.

      If you want to create another area of your site for other articles, you might consider creating a custom post type called “articles” or better yet, try to be more descriptive with it.

  3. I have been insanely trying to find a way for this to work all other methods adding categories to both posts and custom posts but did not list both together. Now it finally lists them on the category. But when I call a page with all the posts from that category, all I get is every normal post.

    Can you please help me.

    gojournalism.ca

    • For anyone else who has this problem, simply replace;

      $post_types = get_post_types();

      with

      $post_types = array( ‘nav_menu_item’,’your_custom_type’, ‘news’ );

Participate