Как выводить рекомендуемые товары только из основной (конечной, не имеющей дочерних) категории WooCommerce


Октябрь 24, 2018

Как выводить рекомендуемые товары только из основной (конечной, не имеющей дочерних) категории WooCommerce

По умолчанию WooCommerce на странице товара выводит рекомендуемые товары не самым лучшим образом, превращая выдачу в "кашу".

Пример: в магазине ботинок есть главные категории, мужские ботинки, женские ботинки, и подкатегории, спортивные, рабочие, кожаные, зимние, летние, и т.д. И когда мы галочками ставим всю иерархию категорий магазин>мужские ботинки>рабочие ботинки>ботинок номер 1,  у товара ботинок номер 1 в рекомендуемых товарах будут попадать все подряд из всех выделенных галочкой категорий, а нам нужно только из той категории, которая является основной и конечной по иерархии для товара.

Для исключения всех лишних товаров есть готовый код, его нужно вставить в файл related.php который находится в папке шаблонов вукомерс внутри вашей темы /woocommerce/single-product/ . Старый код нужно полностью удалить, заменив указанным в этой статье.

<?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;
}
  
global $product, $woocommerce_loop;
  
if ( empty( $product ) || ! $product->exists() ) {
    return;
}
  
if ( ! $related = $product->get_related( $posts_per_page ) ) {
    return;
}
  
$cats_array = array(0);
  
// get categories
$terms = wp_get_post_terms( $product->id, 'product_cat' );
  
// select only the category which doesn't have any children
foreach ( $terms as $term ) {
    $children = get_term_children( $term->term_id, 'product_cat' );
    if ( !sizeof( $children ) )
    $cats_array[] = $term->term_id;
}
  
$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,
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field' => 'id',
            'terms' => $cats_array
        ),
    )
));
  
$products                    = new WP_Query( $args );
$woocommerce_loop['name']    = 'related';
$woocommerce_loop['columns'] = apply_filters( 'woocommerce_related_products_columns', $columns );
  
if ( $products->have_posts() ) : ?>
<?php woocommerce_product_loop_start(); ?>
    <?php esc_html_e( 'Related products', 'woocommerce' ); ?>
    <?php while ( $products->have_posts() ) : $products->the_post(); ?>
        <?php wc_get_template_part( 'content', 'product' ); ?>
    <?php endwhile; // end of the loop. ?>
<?php woocommerce_product_loop_end(); ?> 
<?php endif;
  
wp_reset_postdata();
 
?>

Код ищет самую конечную по глубине вложенности иерархии категорий товаров и рекомендует только реально товары из той же категории. Останется только изменить внешний вид вывода цикла рекомендуемых товаров под стиль вашей темы. Это актуально для таких магазинов, когда мы выделяем галочками те категории, в которых товар надо показывать(сейчас речь просто про выдачу товаров внутри категории а не о рекомендуемых), иногда товар нам не нужно показывать в родительской категории и для этого есть тоже специальное решение (в следующей статье). В таком случае без такого вывода рекомендуемых товаров не обойтись.


Также рекомендую к ознакомлению


avatar
  Подписаться  
Уведомление о
Последние комментарии