WooCommerce - Отображение дочерних категорий товаров из определенного родителя

4 окт. 2013 г., 15:37:20
Просмотры: 15.2K
Голосов: 0

Я хочу изменить следующий фрагмент кода:

<?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'.

Может кто-нибудь помочь?

С уважением, Том

0
Все ответы на вопрос 3
4

Функция 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);

Это должно дать желаемый результат, но код не тестировался.

4 окт. 2013 г. 18:36:31
Комментарии

Спасибо за ваш ответ! Думаю, нужно немного подправить код, чтобы он заработал... Теперь я получаю такую фатальную ошибку... 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 tjwillems
5 окт. 2013 г. 01:46:24

@tjwillems: Я изменил код/строку

Nicolai Grossherr Nicolai Grossherr
5 окт. 2013 г. 12:21:42

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

Nicolai Grossherr Nicolai Grossherr
8 окт. 2013 г. 17:29:01

@ialocin, большое спасибо! Этот ответ мне помог. Просто вопрос: как мне получить URL дочерней категории?

input input
12 мар. 2014 г. 00:12:32
2

Вы можете закомментировать эту часть

    <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.

Сделав это, 'красный' текст исчезнет, и останется только другой текст.

4 окт. 2013 г. 15:58:48
Комментарии

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

Nicolai Grossherr Nicolai Grossherr
4 окт. 2013 г. 16:12:52

Дело не в том, что я хочу скрыть заголовки H3. Я хочу изменить функцию. Сейчас она отображает выбранную категорию по алфавиту. Но я хочу, чтобы она показывала дочерние категории определенного родителя... (сложно объяснить :) )

tjwillems tjwillems
4 окт. 2013 г. 17:41:26
0

Вот самый простой способ отобразить дочерние категории товаров из определенной родительской категории:

$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',
    );
}
6 авг. 2015 г. 07:15:46