Beginner's Guide for WordPress - Start your WordPress Blog in minutes.
Choosing the Best
WordPress Hosting
How to Easily
Install WordPress
Recommended
WordPress Plugins
View all Guides

Display Subcategories on Category Pages in WordPress

Last updated on by
Elegant Themes
Display Subcategories on Category Pages in WordPress

When using WordPress as a CMS, or even as a blog you might want to display subcategories on category pages. There is really no easy way to do this and some ways that are out there on the web has various bugs. In this article we will show you how you can display subcategories on category pages using this hack.

Now the hack shared on Yoast’s blog is outdated and has bugs. The bug is that even though it shows the subcategories on the category page, but when you go inside the subcategory, it does not show any category. With the hack we are sharing it will show subcategories on the parent category pages, and when you click on the subcategories, you will still see other sibling categories in the parent category.

Ok if the above terminology did not make sense to you let us explain in another way. Lets say you have a top level (parent) category called Sports. You have three subcategories under sports called NFL, NBA, and MLB. Now when someone arrive to your homepage, you will only see Sports category and other top level parent categories. When someone clicks on Sports, the categories will now show only the subcategories under Sports, so it will be NFL, NBA, and MLB. Now with Yoast’s hack if you click on NFL, everything will be gone. With our hack when you click on NFL, it will still show NFL, NBA, and MLB.

So basically this hack is allowing you to List subcategories if viewing a Category, and brothers / sibling categories if in subcategory.

    <?php
    if (is_category()) {
    $this_category = get_category($cat);
    }
    ?>
    <?php
    if($this_category->category_parent)
    $this_category = wp_list_categories('orderby=id&show_count=0
    &title_li=&use_desc_for_title=1&child_of='.$this_category->category_parent.
    "&echo=0"); else
    $this_category = wp_list_categories('orderby=id&depth=1&show_count=0
    &title_li=&use_desc_for_title=1&child_of='.$this_category->cat_ID.
    "&echo=0");
    if ($this_category) { ?> 

<ul>
<?php echo $this_category; ?>

</ul>

<?php } ?>

Paste the above code wherever you like the categories to display and modify it however you please. The code listed above, when you visit the subcategory from the main category, hides the main category and only shows the subcategories.

If you want to show the main category also on subcategory pages, just remove the parameter depth=”1″ from the code above.

This is a very useful and handy category hack when it comes to designing templates for WordPress specially when using WordPress as a CMS.

For further details on parameters refer to WordPress Codex.


Editorial Staff at WPBeginner is a team of WordPress lovers led by Syed Balkhi. Page maintained by Syed Balkhi.

WPBeginner's Video Icon
Our HD-Quality tutorial videos for WordPress Beginners will teach you how to use WordPress to create and manage your own website in about an hour. Get started now »
  • Katia

    Thank you for this helpful post.
    I need to exclude some of the categories , so those will not show . How can I do that?

  • Catalin

    Hello

    I need some help with the script above. I have a Category list of countries like USA, UK, Italy, France etc. and each country it will have cities as sub categories.
    This script works great, when i click on Italy the cities sub categories appear in the side bar, however when a click on page or inside a post the cities disappear and it show only the country in the side bar.
    How can I modify so when i click over a post inside the cities remain and when i click on a page like About or Home the cities to disappear? Also I use Hueman theme and i will need the cities to appear in the header menu. How much do you charge for that? E-mail me at kid_punky @ yahoo.com

  • sourabh nigam

    i am using jigoshop plugin for e-eCommerce clothing website
    in the jigoshop category add
    MAN
    WOMAN
    BOYS
    OTHER
    it has also sub category
    i want to display main category in sidebar and when click on category then sub category should be display;

  • Mitul

    thanks great post, this tricks work but I have question..I want display sub category like your http://www.wpbeginner.com/deals/ category page. please tell me how can I add css and make sections page like your deal page.

    • http://www.wpbeginner.com/ WPBeginner Support

      Mitul, for CSS you can view it in the source, feel free to play with it. You can use conditional tags in your template to show your sub categories differently or you can create a new template for the subcategory.

  • pustiu314p

    Hi,
    I use your code with success, and thanls for that.
    I have a little trouble: I removed “depth=”1″ from code but the main category does not appear in sidebar. only subcategories.
    How can I display both the parent category and subcategories?
    Thank you.

    • http://www.wpbeginner.com Editorial Staff

      depth=1 is meant to keep only child categories (not grand-child categories).

      • Pustiu314p

        oh ok, so is any way to display grand-child categories?

  • rob_mod

    Hi. Will this work with WordPress 3.3.1?

    Also, this question might seem silly, but I want to double check:

    This code will allow subcategories specific to the category page you’re on to appear in the sidebar, correct? Phrased another way: I’m on the homepage. I click on the main navigation which says “Illinois.” That takes me to a (category) archive page for Illinois, that has a sidebar. In that sidebar is: Chicago, Evanston, Skokie (subcategories). Now, If clicked on “New York” in the main navigation, I’d go to a (category) archive page for New York, and in the right hand column for that page would be: NYC, Albany, Buffalo, Rochester.

    Am I correct, or am I misunderstanding the application?

    Thanks so much!

  • VandeMataram

    comment is not posted correctly … so putting it again:

    Main-Category

    Sub-category-1, Sub-category-2, Sub-category-3, Sub-category-4, Sub-category-5,

    Sub-category-6, Sub-category-7, and so on ………….

  • VandeMataram

    I want to show list of sub-categories in main category archive page, for example:

    <Main Category>

    <sub-category-1>, <sub-category-2>, <sub-category-3>, <sub-category-4>, <sub-category-5>, <sub-category-6>, and so on …

    I have copied the same code provided in this article, but it’s not working … nothing is displaying in category page.

    Please help.

  • robolist

    Hi there, I am hoping there is a fix for what i am trying to do as i cant seem to find a solution anywhere.

    what i have is several sub-categories under a main category. but the second tier categories are not child categories of the main. only the sub categories under the second tier are child. but i still want to contain the loop of those categories on the main category, but essentially it will never have a post nor a child. I managed to find the filter to display a loop of the categories below it, but the page only appears if there is one post in that category…

    LOL, this all sound rather complicated when i say it out loud haha… I hope you get what i am talking about.

    In short i want to have the category page displayed even without and posts under it. I am using a custom theme and template files for each category.

    Hope someone has the answer. :)

    Cheers

    • wpbeginner

      @robolist What’s the point of having a category with no post under it? It seems like it shouldn’t even be there. Perhaps you want to elaborate, so we can see what you are doing with that category. Maybe an alternative route should be taken.

      • robolist

        @wpbeginner thanks for getting back so fast :)

        ok so the reason is because i dont want the main category to appear in the URL structure. although the final URL for the post will be different. The main category will be something like ‘destinations’ then under that will have countries. with each country having a child city then posts under the city. so the main menu will display ‘destinations’ with a loop of all posts under that. then under that in the sub menu will be the country then city. with both country and city containing a loop of its respective posts.so by the time you get to the city landing page i dont want the URL to be ‘.com/destinations/country/city/ ‘ i want it to be ‘.com/country/city/’

        You see my dilemma?

        • wpbeginner

          @robolist It seems like there is a better way.Wouldn’t it make more sense to eliminate destination category altogether. Create a page called Destinations – use custom page template to have it output all categories that WordPress has using wp_list_categories() function. Now you will still have the urls like .com/country/city/And when the user goes on a page like .com/destinations/ << They can still see all the countries listed there. Does that make sense? If it doesn’t, then maybe we don’t understand what you are trying to do.

        • robolist

          @wpbeginner that does sound better and makes sense… But i am not familiar with the wp_list_categories() function, although i have seen it around. This could be the one. thanks so much for your help, i will go and give that a try :) thanks so much…

          thanks also for all your amazing tutorials on this site…

        • wpbeginner

          @robolist wp_list_categories() is a very simple and powerful function. http://codex.wordpress.org/Template_Tags/wp_list_categoriesIt will let you display your categories anywhere in a custom page template. http://www.wpbeginner.com/wp-themes/how-to-create-a-custom-page-in-wordpress/ So create a custom page template. In the template area paste the codewp_list_categories(); Make sure to set child=0 if you don’t want to show your cities in there. As I presume, you will only want to display the countries there. Then once a user clicks on a country, they go and see all the cities. Style it to your liking and there you have it.

        • robolist

          @wpbeginner excellent :) thanks so much

        • robolist

          @wpbeginner

          hey guys, thanks so much for your advice last night, it worked a treat :). I am however stuck on the permalink structure now and would be very grateful if you and any tips for me again :)

          My final post is now at the end of a three tier category structure, ‘continent/country/city/post/’ (destinations as you recommended is now a page). But for the final URL of the post i dont want it to be four deep and would prefer it to only be three deep. so the permalink that i would like is country/city/post/… Is there anyway i can remove the top level parent category from the permalink structure? at the moment i have it set up like this ‘/%category%/%postname%-%post_id%/’ But it automatically grabs all parent categories. , Do i have to again make the top category a page or is there a better way round this? Many thanks in advance for your help

          Cheers

        • wpbeginner

          @robolist You can write some permalink rewrite rules, but that is a bit harder than making the top category a page. Easy solution: make continent a page.Hard solution: rewrite permalink rule.Honestly, do you need continents? most folks don’t really look by North America or South America… They just look for countries…

        • robolist

          @wpbeginner Thanks for getting back to me.

          Well having the continents does help to organise the blog as it will get pretty big eventually, its more like regions really, not exactly continents, which is why I’d prefer to include them . I would love to learn how to do the rewrite rule because that way i wont have to be constantly adding extra category IDs to the region pages every time a new city/country is added. The way i have it set with the destinations is perfect because i will never add any more regions so i never have to touch that page again,:) as it stands there are 9 regions thats it., but countries and cities will be added over time

          i dont suppose you could point me in the right direction for the rewrite? :) I would be ever so grateful

          Many thanks for all your help so far

        • wpbeginner

          @robolist Rewrite requires writing custom codes and which is something we charge for. You can look at google for your guide or look in the WordPress core if you like tackling code.

        • robolist

          @wpbeginner I would love to hire you guys but just dont have a budget for that :(, plus i would love to learn how to do it myself. but thanks so much for all the help you have given me on this. if i do fail at my attempt then i will just go for the simple way out and create pages for the regions. thanks again :)

  • sdiggles

    Did you ever get this? I am trying to accomplish the same thing right now. Only show subcategories on category pages if there are subcategories. That “No categories” stuff is killing me.

    • robolist

      @sdiggles i think i am after the same… did you find a solution?

  • Seosphere

    Hi ! sorry for my english.

    I would like to use your code, but not on the sidebar. When i click on a main category, i would like to find on the nav. bar the sub menu instead to have the main menu.

    Sorry but i m not a developper, where do i have to paste your code ?

    In category.php ? :(

    Thank you

  • http://giriayoga.com giriayoga

    thanks you for your information

  • Aleksandr

    The code is not finished.

    «…
    if ($this_category) {
    //There is must be a code
    //to show the list of subcategories.
    }?>
    …»

    Something like that:
    if ($this_category) {
    printf( $this_category );
    }

    P.S. working on «Twenty Ten» 3.0.1

  • tes

    testing with v 3.0 doesnot work.. buggy

  • Emily

    I’ve heard that this code no longer works since the WP upgrade. I also got a parse error.

    • http://www.wpbeginner.com Editorial Staff

      Where did you hear this?

  • http://www.brooklynupdates.com Rachel

    Hi,
    This code is exactly what I need, only I want to use it in the actual category.php content section, not in the sidebar. Anyway, I pasted it in and I get a parse error. Is there something missing at the end of the code snippet?
    Thanks.
    -Rachel

    • http://www.wpbeginner.com Editorial Staff

      So many things can matter. Where exactly did you place it… please contact us via our contact form for help.

    • David

      Rachel, did you get this figured out? I’m getting the same error.

  • Karl B

    This is a great starting point for me as I had been searching high and low for this.

    I wondered if there was a way to elaborate on this and allow say, 1 post title and excerpt then 4 more titles from each subcategory, displayed in a div.

    I have been trying to find a way to do this for months but have never found anyone able to assist. I even offered a small payment but no-one came forward :)

    Thanks if anyone can offer any advice :)

    Karl

    • http://www.wpbeginner.com Editorial Staff

      We can help you if you contact via email. There is a way to do it that can be explained either via email, or we can do it for you for a small payment :)

  • http://www.google.com Jerry

    I’m getting a “Parse error: syntax error, unexpected ‘=’” error from this?

    Ideas?

    • http://www.wpbeginner.com Editorial Staff

      Try it now :) It should work. The code just converted the quotes into curly quotes.

  • Jacqueline

    Hi, thanks so much for this code and I have it working on my template. How would I prevent this entire code from running if a category has NO children? If there are no children, it creates an empty list and prints the text “No Categories.” Here’s how I had it setup with Yoast’s code:

    cat_ID) != “”) { ?>

    Subcategories:
    cat_ID);?>



    If there were no subcategories, nothing would show up. Your code is better, but I need it to only show up ONLY if there are subcategories. How would I achieve this? Thanks for any suggestions.

  • http://www.barrelocrafts.com Victor

    Thanks for posting this. I got my posts displaying fine, but had forgotten about the sub cats…it makes more sense this way.

  • Nick

    Hi,

    I’m trying to accomplish this in the sidebar, only instead of links, I want to list recent posts in subcategories.

    and of course, this would occur in all category and subcategory pages, as well as single posts.

    Don’t know if this is possible. But, I’ve been looking around like crazy, and not being a programmer isn’t helping either.

  • http://www.faqpal.com FAQPAL

    Excellent post, thanks for the snippet.