WooCommerce: Hide SubCategory Products On Product Category Pages

You’d think that this was a core WooCommerce setting – it’s not.

In fact, from the WordPress “Customizer“, you can set the product category page display to “Show products” only, “Show subcategories” only, or “Show subcategories and products” (see screenshot below). But these 3 options, in my opinion, could and should do much better.

For example, if you assign a product “ABC” to a parent category “X“, and a product “DEF” to a child category “X->Y“, and if you choose “Show products“, the parent category page will show both “ABC” and “DEF” products, while there should only be 1.

If you select “Show subcategories“, the same page will only have the link to the subcategory, but the product belonging to the parent category, “ABC“, won’t be visible, which doesn’t make sense.

If, even worse, you pick “Show subcategories and products“, the parent category page will display the subcategory link, as well as both productsABC” and “DEF“, which once again is a bit weird.

Let’s fix this with a simple snippet – enjoy!

These are the three options regarding the WooCommerce Product page display that you can find under WordPress Customizer > WooCommerce > Product Catalog.

PHP Snippet: Hide Subcategory Products @ WooCommerce Parent Category Page

/**
 * @snippet       Hide Subcat Products @ WooCommerce Category Page
 * @how-to        businessbloomer.com/woocommerce-customization
 * @author        Rodolfo Melogli, Business Bloomer
 * @compatible    WooCommerce 8
 * @community     https://businessbloomer.com/club/
 */

add_action( 'woocommerce_product_query', 'bbloomer_hide_products_subcategory', 9999 );
   
function bbloomer_hide_products_subcategory( $q ) {
	
	if ( ! is_product_category() ) return;
	
	$parent_id = get_queried_object_id();
	$subcats = woocommerce_get_product_subcategories( $parent_id );
	if ( empty( $subcats ) ) return;
	
	$tax_query = (array) $q->get( 'tax_query' );
	$tax_query[] = array(
		'taxonomy' => 'product_cat',
		'field' => 'slug',
		'terms' => array_column( $subcats, 'slug' ),
		'operator' => 'NOT IN'
	);
	
	$q->set( 'tax_query', $tax_query, true );
	
}

Once this snippet is active, the display in case of “Show products” option will go from:

to:

because the first two products in the first screenshot belong to a subcategory of “Newsletters” called “Sponsorships” in my test website.

The snippet also works to – finally – fix the “Show subcategories and products” option, because it hides the two subcategory products, which will be visible only when you click on the “Sponsorships” subcategory:

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

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

8 thoughts on “WooCommerce: Hide SubCategory Products On Product Category Pages

  1. Is it possible to modify this code so it works only for certain categories? I want only one specific category not to display subcategory products.

    1. Of course! I suggest you take a look at “conditional logic”: https://businessbloomer.com/woocommerce-conditional-logic-ultimate-php-guide/. Enjoy 🙂

  2. Thanks so much Rodolfo! Yes, one would think this would be standard in WooCommerce. Thank you posting this 🙂

  3. Hi, this worked great, thank you.
    I’m wondering now if there is a way to have the products display first in the category, then the sub category? (currently it shows the sub-category first, then the products)

    Thanks
    Sarah

    1. Hi Sarah, 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!

  4. Would it also be possible to incorporate a checkbox into this?
    I only want products with a checked checkbox to not be shown in the parent categories.

    I can add the checkbox myself, but how would this be added as an extra rule for the query in your code?

    1. Hello Matthijs, 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 *