В woocommerce существует иерархия товаров по категории (product_cat), но не всегда этого достаточно. Создадим в woocommerce дополнительную иерархию по бренду.
Сортировка по бренду
Первым делом создаем атрибут товара Бренд и сами бренды. Для того чтобы задать брендам изображение — используем плагин taxonomy term image master.
При желании добавляем в sidebar виджет WooCommerce layered nav, который содержит функционал фильтра по выбранному атрибуту (в нашем случае бренд).
Выводим имеющиеся бренды в категориях
// Выводим бренды товаров находящихся в категории
function tutsplus_product_brends( $args = array() ) {
if ( !is_search() ) {
$poductcatid = get_queried_object_id();
$args = array(
'numberposts' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $poductcatid
),
),
'post_type' => 'product'
);
$posts = get_posts( $args );
foreach($posts as $post){ setup_postdata($post);
$brends_id = wp_get_object_terms($post->ID, 'pa_brend');
foreach ($brends_id as $brend_id) :
$all_brends_ids[] = $brend_id->term_id;
endforeach;
$all_brends_unique = array_unique($all_brends_ids);
}
wp_reset_postdata();
if($all_brends_unique):
echo '<div id="brends">';
foreach ($all_brends_unique as $brend_id) :
$brend = get_term_by('id', $brend_id, 'brend');
if ( $brend->term_image ):
echo '<a href="' .get_tag_link($brend->term_id). '">';
echo wp_get_attachment_image( $brend->term_image, 'full' );
echo '</a>';
endif;
endforeach;
echo '</div>';
endif;
}
}
add_action( 'woocommerce_after_shop_loop', 'tutsplus_product_brends', 50 );
Выводим бренд в карточке товара
// вывод бренда в карточке товара
function proizvoditeli_woocommerce() {
global $post;
echo '<div id="brand">';
$brends_id = wp_get_object_terms($post->ID, 'pa_brend');
foreach ($brends_id as $brend_id) :
if ( $brend_id->term_image ):
echo '<a href="' .get_tag_link($brend_id->term_id). '">';
echo wp_get_attachment_image( $brend_id->term_image, 'full' );
echo '</a>';
endif;
endforeach;
echo '</div>';
}
add_action( 'the_woocommerce_single_title', 'proizvoditeli_woocommerce', 7 );
Таким образом из категории, либо из карточки товара. либо из произвольного меню мы попадаем в раздел бренда.
Категории Бренда
Находясь в разделе бренда нам нужно получить входящие в него категории. Для этого в области виджетов создаем следующий вызов:
<?php if ( is_tax('pa_brend') ) : ?>
<div class="widget">
<?php $termin = get_query_var( 'term' );
$args = array(
'posts_per_page' => -1,
'post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'pa_brend',
'field' => 'slug',
'terms' => $termin
),
),
);
$termposts = get_posts( $args );
foreach( $termposts as $termpost ){ setup_postdata($termpost);
$all_cat_objects = get_the_terms( $termpost, 'product_cat' );
if($all_cat_objects){
foreach($all_cat_objects as $cat_object) {
if($cat_object->count > 0) {
$all_cat_ids[] = $cat_object->term_id;
}
}
}
}
wp_reset_postdata();
if ( $cat_object->count > 0 ): ?>
<?php $cat_ids_unique = array_unique($all_cat_ids); ?>
<?php //print_r ($cat_ids_unique); ?>
<?php foreach($cat_ids_unique as $cat_id): ?>
<?php $category = get_term( $cat_id, 'category' ); //Получаем данные по термину таксономии ?>
<h2><a href="<?php echo site_url().'/product-category/'.$category->slug.'/?filter_brend='.$termin; ?>"><?php echo $category->name; ?></a></h2>
<?php endforeach; ?>
<?php endif; ?>
</div>
<?php endif; ?>
Данный код анализирует все товары в данном разделе (бренде), получает все категории к которым принадлежат товары и записывает их в уникальный массив, который в последствии мы и получаем, а также формирует специальную url-ссылку на результат фильтра по бренду.
Возврат в категорию
Можно сделать из карточки кнопку возврата в категорию (в сайтбаре, либо в специальном месте).
<?php $term_id = wp_get_object_terms($post->ID, 'product_cat');
$term_link = get_term_link($term_id[0], 'product_cat');
echo "<a href='". $term_link ."'>Назад к выбору</a>"; ?>
Если данная кнопка будет находится в сайтбаре можно обернуть ее проверкой
<?php if ( is_product() ) : ?>
<div class="widget">
</div>
<?php endif; ?>
Список брендов
Выводим полный список брендов с ссылками на архив бренда.
<?php $terms = get_terms( array(
'taxonomy' => 'pa_brend',
'hide_empty' => true,
'pad_counts'=> true,
'orderby' => 'count',
'exclude' => array(755, 666, 654, 667), //если необходимо некоторые исключаем
'order' => 'DESC',
'number' => 10,
'parent' => $term->term_id
)
); ?>
<?php if($terms) : ?>
<?php foreach($terms as $term) : ?>
<a href="<?php echo get_tag_link($term->term_id);?>">
<?php if ( $term->term_image ) { echo wp_get_attachment_image( $term->term_image, 'square' ); } ?>
</a>
<?php endforeach; ?>
<?php endif; ?>
А что делать, если все вышеперечисленное реализовано уже в теме, и нужно вывести только категории, в которых есть атрибут бренд?
1. Перебирать все товары по признаку атрибута.
2. Собрать в массив все категории товаров у которых этот атрибут есть.
3. Оставить в массиве категорий только уникальные значения (категории будут повторятся).
4. Вывести список категорий.