skip to Main Content

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


  1. Add below code in functions.php of active theme.

    add_filter( 'woocommerce_product_related_posts','wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
       $get_related_products_args = array(
                  'orderby' => 'id', // you can place id,title over here. 
                  'order'     => 'ASC',
                );
       return $get_related_products_args;
    }
    
    Login or Signup to reply.
  2. This may help:

    add_filter( 'woocommerce_output_related_products_args', 'prefix_modify_related_products_args', 20 );
      function prefix_modify_related_products_args( $args ) {
      $args['orderby'] = 'ID';
    
        return $args;
    }

    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

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search