Woocommerce display in single product page by default a section of correlated product, it retrieve in random mode 4 product with same category or tag.
So every time you reload the page or visit the page in next day it display every time different correlated product, this is not good option for SEO, because in this way not pass link juice between pages during the time.
so i want to try to display a correlated product by sequential ID order.
from what I understand woocommerce extrapolates related products randomly through the use of the orderby = ‘rand’ function in the query
then tried to find a filter that could change this value in orderby = 'ID'
or orderby = 'post__in'
, using this snippet in function.php of theme:
add_filter('woocommerce_output_related_products_args', 'wh_related_products_args');
function wh_related_products_args($args)
{
$args['orderby'] = 'ID'; // or $args['orderby'] = 'post__in';
return $args;
}
but it does not work
the code in related.php is that
<?php
/**
* Related Products
*
* This template can be overridden by copying it to yourtheme/woocommerce/single-product/related.php.
*
* HOWEVER, on occasion WooCommerce will need to update template files and you
* (the theme developer) will need to copy the new files to your theme to
* maintain compatibility. We try to do this as little as possible, but it does
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @author WooThemes
* @package WooCommerce/Templates
* @version 3.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( $related_products ) : ?>
<section class="related products">
<h2><?php esc_html_e( 'Related products', 'woocommerce' ); ?></h2>
<?php woocommerce_product_loop_start(); ?>
<?php foreach ( $related_products as $related_product ) : ?>
<?php
$post_object = get_post( $related_product->get_id() );
setup_postdata( $GLOBALS['post'] =& $post_object );
wc_get_template_part( 'content', 'product' ); ?>
<?php endforeach; ?>
<?php woocommerce_product_loop_end(); ?>
</section>
<?php endif;
wp_reset_postdata();
what am I doing wrong ?
2
Answers
Add below code in functions.php of active theme.
This may help:
Note, you can add other things, like
$args['order']
,$args['posts_per_page']
etc. Review https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters