/ Wordpress / «Правильные» похожие товары в woocommerce

«Правильные» похожие товары в woocommerce

HIT

21.09.2015

20392

12

Похожие товары реализованы не совсем грамотно: если добавлять товарам метки (присущие большинству товаров, например 33 класс у ламината), то похожие товары будут выводится практически одни и те же.
Исправляем данный недочет так: в нашей локализованной версии woocommerce находим файл /themes/current-theme/woocommerce/single-product/related.php и меняем строку

$related = $product->get_related( $posts_per_page );

на

$related = get_related_custom($product->id);

А в файл funсtions.php добавляем код

//New "Related Products" function for WooCommerce
function get_related_custom( $id, $limit = 5 ) {
	global $woocommerce;

	// Related products are found from category and tag
	$tags_array = array(0);
	$cats_array = array(0);

	// Get tags
	//$terms = wp_get_post_terms($id, 'product_tag');
	//foreach ( $terms as $term ) $tags_array[] = $term->term_id;

	// Get categories (removed by NerdyMind)
	$terms = wp_get_post_terms($id, 'product_cat');
	foreach ( $terms as $term ) $cats_array[] = $term->term_id;
	// Don't bother if none are set
	if ( sizeof($cats_array)==1 && sizeof($tags_array)==1 ) return array();

	// Meta query
	$meta_query = array();
	$meta_query[] = $woocommerce->query->visibility_meta_query();
	$meta_query[] = $woocommerce->query->stock_status_meta_query();

	// Get the posts
	$related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
		'orderby' => 'rand',
		'posts_per_page' => $limit,
		'post_type' => 'product',
		'fields' => 'ids',
		'meta_query' => $meta_query,
		'tax_query' => array(
			'relation' => 'OR',
			array(
				'taxonomy' => 'product_cat',
				'field' => 'id',
				'terms' => $cats_array
			),
			array(
				'taxonomy' => 'product_tag',
				'field' => 'id',
				'terms' => $tags_array
			)
		)
	) ) );
	
	$related_posts = array_diff( $related_posts, array( $id ));
	return $related_posts;
}
add_action('init','get_related_custom');

В данном коде объединены 2 метода выборки Похожих товаров, но выборка по тэгам отключена (лучше ее и не включать).

Похожие товары только в наличии

Данная функция никак не связана с предыдущей, распространяется на стандартный вывод похожих товаров

// Похожие товары в наличии

add_filter( 'woocommerce_related_products', 'mysite_filter_related_products', 10, 1 );
function mysite_filter_related_products( $related_product_ids ) {

    foreach( $related_product_ids as $key => $value ) {
        $relatedProduct = wc_get_product( $value );
        if( ! $relatedProduct->is_in_stock() ) {
            unset( $related_product_ids["$key"] );
        }
    }

    return $related_product_ids;
}
Работает не вполне корректно, т.к. запрос к товарам происходит раньше, а далее мы фильтруем не выводить товары которых нет в наличии. В результате в Похожим может не вывестись товаров даже если они по факту есть.

Собственный вывод похожих товаров

В данном случае товаров из этой же категории, которые есть в наличии

// Содержимое вкладки Похожие товары
function related_product_tab_content() { 
	//do_action('tab_woocommerce_related_products');
	
	global $post;
	$terms = get_the_terms( $post->ID, 'product_cat' );
	
	$args = array(
		'post_type' => 'product',
		'posts_per_page' => 3,
		'product_cat' => $terms[0]->slug,
		'meta_query' => array(
			array(
				'key'     => '_stock_status',
				'value'   => 'instock',
			)
		),
	'post__not_in' => array($post->ID),
	);
		
	query_posts($args);

	if (have_posts()) :
	echo '<section class="related products"><h2 class="center">Похожие товары</h2>';			
	echo '<ul class="products columns-3">';
	while (have_posts()) : the_post(); ?>
	
		<li <?php wc_product_class(); ?>><span>
			<?php do_action('woocommerce_before_shop_loop_item');
			do_action('woocommerce_before_shop_loop_item_title');
			do_action('woocommerce_shop_loop_item_title');
			do_action('woocommerce_after_shop_loop_item_title');
			do_action('woocommerce_after_shop_loop_item'); ?>
		</span></li>
	
	<?php endwhile; 
	echo '</ul></section>';
	endif; wp_reset_query();
}

Изменение состава Похожих товаров одной функцией

// Произвольные похожие товары

add_filter( 'woocommerce_related_products', 'bbloomer_related_products_by_same_title', 9999, 3 ); 
 
function bbloomer_related_products_by_same_title( $related_posts, $product_id, $args ) {
   	$product = wc_get_product( $product_id );

   	$klass = get_the_terms( $product->get_ID(), 'pa_klass' );
   	$predmet = get_the_terms( $product->get_ID(), 'pa_predmet' );
	//$izdatelstvo = get_the_terms( $product->get_ID(), 'pa_izdatelstvo' );

   	$related_posts = get_posts( array(
		'post_type' => 'product',
		'fields' => 'ids',
		'posts_per_page' => 10,
		'exclude' => array( $product_id ),
		'tax_query' => array(
			array(
				'taxonomy' => 'pa_klass',
				'field'    => 'slug',
				'terms'    => $klass[0]->slug
			),
			array(
				'taxonomy' => 'pa_predmet',
				'field'    => 'slug',
				'terms'    => $predmet[0]->slug
			),
			// array(
			// 	'taxonomy' => 'pa_izdatelstvo',
			// 	'field'    => 'slug',
			// 	'terms'    => $izdatelstvo[0]->slug
			// )
		)
   	));
   	return $related_posts;
}

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Фильтры Woocommerce

Фильтры Woocommerce

В базовую комплектацию Woocommerce входит набор виджетов для фильтрации товаров. Но данные виджеты необходимо несколько доработать. WooCommerce Навигация по слоям В этом виджете необходимо задать атрибут товара по которому будет Читать далее »

/ /
Обзор плагинов по фильтрации товаров WC

Обзор плагинов по фильтрации товаров WC

В данном обзоре мы будем приводить сильные и слабые стороны различных плагинов по созданию фильтрации товаров WC. Причем рассмотрим как платные, так и бесплатные решения. WooCommerce Products Filter (50 000) Читать далее »

/
Скидки Woocommerce

Скидки Woocommerce

Добавляем и настраиваем в woocommerce различные системы скидок. Стандартная скидка Woocommerce Можно включить «акционную» цену на товар, к ней можно добавить дату окончания скидки. У товара появляется лэйбл «Распродажа», можно Читать далее »

Добавить комментарий

12 комментариев

  1. mur

    а как можно исключить определенные категории из похожих товаров

    1. maker1447

      Я думаю так: в запрос $related_posts = get_posts( apply_filters(‘woocommerce_product_related_posts’, array(
      попытаться добавить: либо ‘exclude’ => категорию woocommerce которая не нужна, либо еще вот вариант попался:

      $args[‘tax_query’] = array(
      array(
      ‘taxonomy’ => ‘category’,
      ‘terms’ => array(‘cat’, ‘dog’),
      ‘field’ => ‘slug’,
      ‘operator’ => ‘NOT IN’,
      ),
      );
      query_posts($args);

    2. maker1447

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

  2. Николай

    Есть такой прикол, я поставил вывод 6 похожих. Но если к товару присвоена только 1 категория, выводится почему-то 5, если больше 1, то 6, подскажите как исправить

    1. maker1447

      А в категории всего сколько товаров? больше 5шт?

  3. Николай

    теперь в версии вукомерца 2.6.8 всё по другому в файлике related.php, данный способ ещё можно реализовать?

    1. maker1447

      Не готов утверждать со 100% уверенностью, но должен работать и на последней версии. У меня на сайтах работает.

      1. Егор

        Ясное дело работает, вы же это в шаблоне прописали!

        А сейчас в related.php это встречается только здесь:
        if ( ! $related = $product->get_related( $posts_per_page ) ) {
        return;
        }
        Что, ясен пень, не дает ничего

  4. Рэй

    Подскажите, как поменять выдачу Related products в теме MediaCenter для WP? Хотя бы где искать файл, отвечающий за выдачу? Нигде не нашел.. У меня цель, чтобы похожие товары показывались не из категорий, как это по умолчанию, а из подкатегорий. Срок Техподдержки уже прошел, поэтому официально вопрос негде задать.

  5. Анна

    Здравствуйте, а как выбрать похожие товары по одному конкретному атрибуту

    1. Alexandr

      Добрый день! Сам не пробовал. Нашел вот такой плагин Woo Related Products (6000+ установок). Судя по количеству установок, должен работать нормально. И функционал вывода похожих товаров по атрибутам в описании есть.

  6. Александр

    А вот за это особые, как говориться, респект и уважуха!!!
    Благодарю!

«Правильные» похожие товары в woocommerce
Fancybox
Рекомендации для васFancyboxOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.