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 products “ABC” and “DEF“, which once again is a bit weird.
Let’s fix this with a simple snippet – enjoy!
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:
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.
Of course! I suggest you take a look at “conditional logic”: https://businessbloomer.com/woocommerce-conditional-logic-ultimate-php-guide/. Enjoy 🙂
Thanks so much Rodolfo! Yes, one would think this would be standard in WooCommerce. Thank you posting this 🙂
Great!
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
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!
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?
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!