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' );

}

2 Answers
2

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' );

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *