Похожие товары реализованы не совсем грамотно: если добавлять товарам метки (присущие большинству товаров, например 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;
}
[site-socialshare]
а как можно исключить определенные категории из похожих товаров
Я думаю так: в запрос $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);
Я наверное поторопился с ответом, ведь в вышеописанном решении мы делаем чтобы похожие товары выводились из той же категории что и товар. Поэтому исключать ее не имеет смысла.
Есть такой прикол, я поставил вывод 6 похожих. Но если к товару присвоена только 1 категория, выводится почему-то 5, если больше 1, то 6, подскажите как исправить
А в категории всего сколько товаров? больше 5шт?
теперь в версии вукомерца 2.6.8 всё по другому в файлике related.php, данный способ ещё можно реализовать?
Не готов утверждать со 100% уверенностью, но должен работать и на последней версии. У меня на сайтах работает.
Ясное дело работает, вы же это в шаблоне прописали!
А сейчас в related.php это встречается только здесь:
if ( ! $related = $product->get_related( $posts_per_page ) ) {
return;
}
Что, ясен пень, не дает ничего
Подскажите, как поменять выдачу Related products в теме MediaCenter для WP? Хотя бы где искать файл, отвечающий за выдачу? Нигде не нашел.. У меня цель, чтобы похожие товары показывались не из категорий, как это по умолчанию, а из подкатегорий. Срок Техподдержки уже прошел, поэтому официально вопрос негде задать.
Здравствуйте, а как выбрать похожие товары по одному конкретному атрибуту
Добрый день! Сам не пробовал. Нашел вот такой плагин Woo Related Products (6000+ установок). Судя по количеству установок, должен работать нормально. И функционал вывода похожих товаров по атрибутам в описании есть.
А вот за это особые, как говориться, респект и уважуха!!!
Благодарю!