WooCommerce - Отображение дочерних категорий товаров из определенного родителя
Я хочу изменить следующий фрагмент кода:
<?php if ( (!$theretailer_theme_options['category_listing']) || ($theretailer_theme_options['category_listing'] == 0) ) { ?>
<!-- Показывать только первую категорию -->
<?php $gbtr_product_cats = strip_tags($product->get_categories('|||', '', '')); // Категории без ссылок, разделенные ||| ?>
<h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
<?php } ?>
Пример: http://tjwillems.nl/priveekollektie/product-category/artists/reinier-bosch/
Красный заголовок под изображением товара должен показывать только дочерние категории 'artist'. Например, только 'Reinier Bosch', а не 'Lighting'.
Может кто-нибудь помочь?
С уважением, Том

Функция WooCommerce get_categories()
объявлена в файле abstract-wc-product.php
, так как она основана на функции WordPress get_the_term_list()
, и нет возможности получить только определенную ветвь категории. Это абсолютно не то же самое, что функция WordPress get_categories()
, что видно по её использованию: $product->get_categories()
. Помимо очевидной разницы в аргументах, которые можно использовать, вы можете углубиться в это, прочитав и сравнив связанную информацию.
Пример дерева таксономии категорий:
product_cat
|
|––cat1
| |––child1.1
| |––child1.2
| |––child1.3
|
|––cat2
|––child2.1
|––child2.2
|––child2.3
В вашем случае ветвями будут »artist« и »art« вместо »cat1« и »cat2«. Цель — получить только одну релевантную ветвь категории для отображения в заголовке. По крайней мере, этого добивается приведенный ниже код.
Как я уже сказал выше, если вы хотите получить только термины из определенной ветви категории/таксономии, вам придется сделать это другим способом. Вам нужно использовать get_terms()
и wp_get_post_terms()
, а затем пересечь результаты.
// категория товара WooCommerce
$taxonomies = array( 'product_cat' );
// получим массив с ID всех терминов, связанных с постом
$post_tids = wp_get_post_terms($post->ID, 'product_cat', array("fields" => "ids"));
// необходимо изменить ID родительской ветви соответственно
$id_branch_parent = '111';
$args = array(
'fields' => 'ids',
'child_of' => $id_branch_parent
);
// получим массив с ID всех терминов ветви
$branch_tids = get_terms( $taxonomies, $args );
// пересечем термины поста и ветви для получения общих ID
$pnb_tids = array_intersect($post_tids, $branch_tids);
// в случае нескольких ID необходимо пройтись по ним в цикле
foreach ( $pnb_tids as $tid ) {
// получим информацию о термине по ID
$tobj = get_term_by('id', $tid, 'product_cat');
// сохраним названия терминов в массив
$pnb_name_arr[] = $tobj->name;
}
// объединим массив названий — это результат, который нужно вывести
$pnb_term_list = implode(' – ', $pnb_name_arr);
Это должно дать желаемый результат, но код не тестировался.

Спасибо за ваш ответ! Думаю, нужно немного подправить код, чтобы он заработал... Теперь я получаю такую фатальную ошибку... PHP — не моя сильная сторона :-(
Fatal error: Cannot use object of type stdClass as array in /var/www/vhosts/tjwillems.nl/httpdocs/priveekollektie/wp-content/themes/priveekollektie/woocommerce/content-product.php on line 111
Эта строка кода находится на 111 строке: $pnb_name_arr[] = $tobj['name'];

@tjwillems Всегда пожалуйста! Если ответ правильный, отметьте его галочкой, чтобы другие пользователи, которые увидят этот вопрос позже, знали решение.

Вы можете закомментировать эту часть
<h3><a href="<?php the_permalink(); ?>"><?php list($firstpart) = explode('|||', $gbtr_product_cats); echo $firstpart; ?></a></h3>
Добавьте в html ....
Также вы можете использовать CSS чтобы скрыть h3, например
<style> .product_item h3 {display: none !important;} </style>
Вы можете добавить это в ваш css.
Сделав это, 'красный' текст исчезнет, и останется только другой текст.

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

Вот самый простой способ отобразить дочерние категории товаров из определенной родительской категории:
$parent_id = 12; // ID родительской категории
// Получаем дочерние категории по ID родителя
$get_child_category = get_terms('product_cat',array('child_of' => $parent_id));
// Фильтруем товары по дочерней категории
foreach($get_child_category as $child_category){
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
'product_cat' => $child_category->slug,
'order' => 'DESC',
);
}
