Woocommerce exclude specific category products from related products

I’m trying to exclude products from two specific categories from showing up in the related products on the content single products page. The closest idea I have stumbled upon is this code from http://docs.woothemes.com/document/exclude-a-category-from-the-shop-page/. Any idea how to modify it for related products and NOT for the shop page?

add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );

function custom_pre_get_posts_query( $q ) {

if ( ! $q->is_main_query() ) return;
if ( ! $q->is_post_type_archive() ) return;

if ( ! is_admin() && is_shop() ) {

    $q->set( 'tax_query', array(array(
        'taxonomy' => 'product_cat',
        'field' => 'slug',
        'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
        'operator' => 'NOT IN'
    )));

}

remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );

}

Related posts

2 comments

  1. Old question, but ranks high in Google. Here’s a solution that works with today’s Woocommerce.

    Add this to your functions.php or custom plugin.

    function exclude_brands_from_related( $categories ){
        // array of category id's that should be excluded
        $exclude_cats = array( '100', '101', '102');
    
        foreach( $categories as $index => $cat ){
            if( in_array( $cat->term_id, $exclude_cats ) ){
                unset($categories[$index]);
            }
        }
    
        return $categories;
    }
    
    add_filter( 'woocommerce_get_related_product_cat_terms', 'exclude_brands_from_related' );
    

    And to do the same with tags:

    function exclude_tags_from_related( $tags ){
        // array of tags that should be excluded
        $exclude_tags = array( 'discontinued', 'whatever', 'even-more');
    
        foreach( $tags as $index => $tag ){
            if( in_array( $tag->slug, $exclude_tags ) ){
                unset($tags[$index]);
            }
        }
    
        return $tags;
    }
    
    add_filter( 'woocommerce_get_related_product_tag_terms', 'exclude_tags_from_related' );
    
  2. When developing with WooCommerce just look into plugin files. I found a file named related.phpin woocommercetemplatesingle-product :

    $args = apply_filters('woocommerce_related_products_args', array(
    'post_type'     => 'product',
    'ignore_sticky_posts'   => 1,
    'no_found_rows'     => 1,
    'posts_per_page'    => $posts_per_page,
    'orderby'       => $orderby,
    'post__in'      => $related,
    'post__not_in'      => array($product->id)
    ) );
    

    It’s a simple query so it will be easy to exclude what you want.

Comments are closed.