Display products from specific category in shop page

The question:

I know many people asked for this question but I didn’t find a proper way to do it. How to add a simple meta_query (product_cat) before the execution of the shop page’s query.

Maybe by using a filter ?



The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

The shop page is actually an archive page for posts of type ‘product’. Its template is in woocommerce/archive-product.php.

You need to use the pre_get_posts action to preprocess the query before the loop, conditional_tags to recognize that you are in the product archive page, and a taxonomy query to filter the product categories, which belong to the taxonomy ‘product_cat’.

For example, the following (placed in your theme’s functions.php or in a plugin) will display only products with product category ‘type-1’:


 function shop_filter_cat($query) {
    if (!is_admin() && is_post_type_archive( 'product' ) && $query->is_main_query()) {
       $query->set('tax_query', array(
                    array ('taxonomy' => 'product_cat',
                                       'field' => 'slug',
                                        'terms' => 'type-1'

You can also exclude categories by using ‘operator’ => NOT IN, and ‘terms’ can be an array of product category slugs.

A good introduction to query customization is http://www.billerickson.net/customize-the-wordpress-query/

Method 2

This worked for me:

[product_category category="YOUR CATEGORY" per_page="8" columns="3" orderby="date" order="desc"]

Method 3

If you want to show products from a specific category on your shop page you can insert the below code in your themes function.php file.

// Execute before the loop starte
add_action( 'woocommerce_before_shop_loop', 'techlyse_before_action', 15 );
function techlyse_before_action() {
    //To ensure Shop Page
    if ( is_shop() ) {
        $query_args['tax_query'] =  array(
                'taxonomy' => 'product_cat',   
                'field' => 'id',  //If you want the category slug you pass slug instead of id and 1330 instead of category slug. 
                'terms' => 1330 
        query_posts( $query_args );

// Execute after the loop ends
add_action( 'woocommerce_after_shop_loop', 'techlyse_after_action', 15 );
function techlyse_after_action() {
    //To ensure Shop Page
    if ( is_shop() ) {
        //Reset the Query after Loop

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment