Galera, já notaram que de uns tempos pra cá o shortcode dos produtos relacionados do Woocommerce (related_products) têm se comportado de maneira um pouco estranha?

Independente da página do produto que você estiver, os produtos relacionados exibidos são sempre os mesmos, só mudando a ordem.

Encontramos até uma pergunta no forum do WordPress falando sobre isso:
https://wordpress.org/support/topic/related-products-always-the-same

Por exemplo, se eu estiver na página do produto A, são apresentados os produtos relacionados B, C, D e E

Se eu estiver na página do produto Z, são exibidos esses mesmos produtos só q em outra ordem, C E B e D por exemplo.

Pra solucionar o problema basta dar um override no filtro woocommerce_product_related_posts_query que faz parte do método responsável por criar os produtos relacionados de um produto

Pra solucionar o problema, usamos um filtro (woocommerce_related_products_args) que se encontrava no template dos produtos relacionados (single-productrelated.php) .

Retiramos os produtos que eram inseridos manualmente com o parametro post__in e adicionamos o parametro tax_query pra buscar os produtos da mesma categoria. Ou seja, com essa solução os produtos não se relacionam pela tag, apenas pela categoria.
//Conserta os produtos relacionados do woocommerce
function fixRelatedProducts($args){
unset($args[‘post__in’]);
global $post;
$terms = get_the_terms( $post->ID, ‘product_cat’ );
$firstTermID = $terms[0]->term_id;
$args[‘tax_query’]=array(
array(
‘taxonomy’ => ‘product_cat’,
‘field’ => ‘term_id’,
‘terms’ => $firstTermID,
),
);
return $args;
}
add_filter(‘woocommerce_related_products_args’,’fixRelatedProducts’);

O código acima é o suficiente pra consertar, mas o ideal além disso é encontrar uma forma de colocar a query dos produtos relacionados em cache. Talvez no próprio related.php usando a função get_transient()

Atualização

Como já havíamos dito, a solução acima não era satisfatória porque causaria um gargalo na performance devido ao fato da query não ser salva no cache. Com a ajuda do pessoal do Woocommerce Brasil, incluindo o Guga e o Claudio, fomos orientados a fazer isso de uma outra forma. Então o próprio Claudio criou outra solução que eu estou postando abaixo. É só incluir no functions.php

function rand_related_products_query( $query ) {
$query['limits'] = ' ORDER BY RAND() ' . $query['limits'];
return $query;
}
add_filter( 'woocommerce_product_related_posts_query', 'rand_related_products_query');

É bom lembrar que o próprio Claudio falou que essa solução também não é ideal pois dependendo da quantidade de produtos da loja, a query pode ficar pesada e acabar quebrando.

Notou algo de errado? Tem alguma idéia melhor? Por favor não deixe de comentar!