WooCommerce: Detect if Current Category is a Subcategory

A client of mine had to style a WooCommerce product category page but ONLY if it was a subcategory. So I decided to add a “subcategory” class to the HTML body, so that they could target this in their custom CSS.

As usual, the PHP is quite easy: I check if the current page is a product category, then if the category has “parents” – and only in this case – add a body class. Pretty easy!

WooCommerce: detect if current page is a subcategory

PHP Snippet 1: Add Body Class if Current Page is a Subcategory – WooCommerce

/**
 * @snippet 	   Add "Subcategory" Class to HTML Body
 * @how-to 	      Get CustomizeWoo.com FREE
 * @author 	      Rodolfo Melogli
 * @compatible    WooCommerce 5
 * @community     https://businessbloomer.com/club/
 */
 
add_filter( 'body_class', 'bbloomer_wc_product_cats_css_body_class' );

function bbloomer_wc_product_cats_css_body_class( $classes ){
   if ( is_tax( 'product_cat' ) ) {
      $cat = get_queried_object();
      if ( $cat->parent > 0  ) $classes[] = 'subcategory';
   }
   return $classes;
}

PHP Snippet 2: Detect if Current Subcategory Page Belongs To a Specific Parent Category – WooCommerce

As you can see inside the first snippet, there is a way to find out if the current object (a product category in this case) has a parent. You can apply the same method for other conditional work.

In this case study, however, I want to check if the subcategory ID is a child of a specific product category ID, so that I can run PHP only if this condition is met.

/**
 * @snippet 	   Check If Subcategory is Child Of Category ID
 * @how-to 	      Get CustomizeWoo.com FREE
 * @author 	      Rodolfo Melogli
 * @compatible    WooCommerce 5
 * @community     https://businessbloomer.com/club/
 */
 
$cat = get_queried_object();
if ( $cat->parent === 456  ) {
   // do something if parent term id is 456
}

PHP Snippet 3: Detect if Current Subcategory Page Belongs To a Specific Ancestor Category – WooCommerce

Not only you can detect if a subcategory belongs to a parent category, but also grandparent, great grandparents and so on…

/**
 * @snippet 	   Check If Subcategory Has Category ID Ancestor
 * @how-to 	      Get CustomizeWoo.com FREE
 * @author 	      Rodolfo Melogli
 * @compatible    WooCommerce 5
 * @community     https://businessbloomer.com/club/
 */
 
$cat_id = get_queried_object_id();
$ancestors = get_ancestors( $cat_id, 'product_cat' );
if ( in_array( 456, $ancestors ) ) {
   // do something if term id 456 is an ancestor
}

Where to add custom code?

You should place custom PHP in functions.php and custom CSS in style.css of your child theme: where to place WooCommerce customization?

This code still works, unless you report otherwise. To exclude conflicts, temporarily switch to the Storefront theme, disable all plugins except WooCommerce, and test the snippet again: WooCommerce troubleshooting 101

Related content

  • WooCommerce: Add Second Description @ Product Category Pages
    In terms of SEO, if you’re trying to rank your product category pages, you really need to make the most of the default WooCommerce product category “description” and “thumbnail”. Most themes, if compatible with WooCommerce, will show this content right below the product category name and above products. Nothing new so far. But what if […]
  • WooCommerce: Show Category For Each Product @ Shop Page
    A client of mine has a category called “Brand”. Each product is assigned to a specific Brand subcategory e.g. Nike, Adidas, etc. The goal of this task was to show the “Brand” subcategories in the shop/category/loop pages as a way to help the user identify the brand name. The same can be applied to showing […]
  • WooCommerce: Change Product Permalinks @ Shop / Loop Pages
    A BloomerArmada fan asked me a very interesting question: how can I link each product in the shop page to its own custom landing page as opposed to the default permalink? Of course this applies when you don’t want to use the default single product page for all or some products. Clearly, you could set […]
  • Bellini WooCommerce Product CategoriesWooCommerce: How To Display Categories on Any Page
    Categorizing products is a great a way to de-clutter your WooCommerce shop and intuitively guide users to the page they are looking for. In WooCommerce you can easily group your similar products under a category, making it easy for users to scan and find the products. For Example, if you sell T-shirts, Shirts, Pants, and […]
  • WooCommerce: Product Category Filter @ Shop Page
    There is already a widget that allows you to place a “Product Category Dropdown” in your sidebar areas. The problem is that lately, sidebars have become kinda 1990. So, what if you want to place a “Category Select Box” anywhere in your WooCommerce website, and (in this case study), exactly on the Product Category pages, […]

Rodolfo Melogli

Business Bloomer Founder

Author, WooCommerce expert and WordCamp speaker, Rodolfo has worked as an independent WooCommerce freelancer since 2011. His goal is to help entrepreneurs and developers overcome their WooCommerce nightmares. Rodolfo loves travelling, chasing tennis & soccer balls and, of course, wood fired oven pizza. Follow @rmelogli

6 thoughts on “WooCommerce: Detect if Current Category is a Subcategory

  1. Thank you Rodolfo for the great contribution you constantly make!

    I just wanted to mention that snippet 3 does not work because the taxonomy “product_category” is incorrect, it has to be “product_cat”.

  2. Perfect solution, thanks!
    Is there a reason to put

    if (0<expression)

    instead of just

    if (expression)

    ) ?

    1. Hey Francisco, if there is no parent it will return 0, so I’m checking it’s a subcategory when it’s > 0

      1. Hey there Rodolfo, in regards to snippet 1, is there a way to detect if the subcategory has products associated with it or not? Not sure what code modification it would take.

        1. Hi Ryan, thanks so much for your comment! Yes, this is definitely possible, but I’m afraid it’s custom work. If you’d like to get a quote, feel free to contact me here. Thanks a lot for your understanding!

Questions? Feedback? Customization? Leave your comment now!
_____

If you are writing code, please wrap it like so: [php]code_here[/php]. Failure to complying with this, as well as going off topic or not using the English language will result in comment disapproval. You should expect a reply in about 2 weeks - this is a popular blog but I need to get paid work done first. Please consider joining the Business Bloomer Club to get quick WooCommerce support. Thank you!

Your email address will not be published. Required fields are marked *