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!
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
}
Hi,
I am showing categories on the Shop page and sub categories on the category pages. And then products on the sub category pages. It may have multiple levels of sub categories.
Is there a way to check if the current category or sub category page has further sub categories or products? If it has sub categories then add a body class?
Thank you.
Anja, 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!
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”.
Thank you!
Perfect solution, thanks!
Is there a reason to put
instead of just
) ?
Hey Francisco, if there is no parent it will return 0, so I’m checking it’s a subcategory when it’s > 0
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.
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!