WooCommerce - Получить (прямые) родительские категории в последней категории - PullRequest
1 голос
/ 18 марта 2020

Я хочу отображать в качестве ссылок родительские категории (но не категории дедов) только при просмотре последней / самой глубокой категории. Чтобы быть более выразительным, когда я просматриваю категории, у меня есть некоторый код, который получает подкатегории / дочерние элементы текущей категории, в которой я нахожусь. Код такой:

function sub_cats( $args = array() ) { 
    $terms = get_terms([
        'taxonomy' => get_queried_object()->taxonomy,
        'parent'   => get_queried_object_id(),
    ]);
    foreach ( $terms as $term) {
        echo '<li>';   
            echo '<a href="' . get_term_link( $term ) . '">' . $term->name . '</a>';  
        echo '<li>';   
    }
}

Так как я достигаю последней / самой глубокой категории / child каждого дерева категорий, я не вижу других категорий для отображения. Теперь меня просят отобразить в виде ссылок только прямые родительские категории (не дедушки) последней / самой глубокой категории и только потом.

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

//Get current category

$term = get_queried_object();
$children = get_terms( $term->taxonomy, array(
    'parent'    => $term->term_id,
    'hide_empty' => false
) );

//If this category has children then get me the children
if($children) {    
     $terms = get_terms([
        'taxonomy' => get_queried_object()->taxonomy,
        'parent'   => get_queried_object_id(),
    ]);
    foreach ( $terms as $term) {
        echo '<li>';   
        echo '<a href="' . get_term_link( $term ) . '">' . $term->name . '</a>';  
        echo '<li>';   
    }
} else { //ELSE get me only the parent category -> HERE IS MY PROBLEM
    $caterms = get_terms( $product->ID, 'product_cat' );

    foreach ($caterms as $category) {
        if($category->parent == 0){
            echo '<li>';   
            echo '<a href="' . get_term_link( $category ) . '">' . $category->name . '</a>';  
            echo '<li>';  

        }
    } 
}

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Эта функция получает теги li, все категории товаров, от категорий самого первого / верхнего уровня до самых последних / нижнего уровня. Затем, когда вы переходите к нижним / самым глубоким категориям, вы получаете все категории одинакового (последнего / самого глубокого) уровня. Таким образом, дерево категорий не исчезает sh, когда вы попадаете в эти глубокие / последние категории.

function sub_cats( $args = array() ) { 
    $term       = get_queried_object(); //get current term
    $children   = get_terms( $term->taxonomy, array( //get term children
                'parent'        => $term->term_id,
                'hide_empty'    => false
                ) );

    if($children) {    
        $terms = get_terms(
            array(
                'taxonomy' => $term->taxonomy,
                'parent'   => $term->term_id,
            )
        );
        foreach ( $terms as $term) {
            echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';
                                    }
    } else {
        $term_children = get_terms(
                        'product_cat',
                                array(
                                    'parent' => $term->parent,
                                    )
                                    );
    if ( ! is_wp_error( $terms ) ) {
        foreach ( $term_children as $child ) {
        echo '<li><a href="' . get_term_link( $child ) . '">' . $child->name . '</a> 
    </li>';
                                            }
                                    }
        }
}

add_shortcode ('sub_cats', ' sub_cats' );

Отдельное спасибо Panos (VG) и @ Frits

0 голосов
/ 18 марта 2020

Вы можете просто использовать свойство parent внутри объекта term и получить термин непосредственно, используя get_term_by().

$term       = get_queried_object(); //get current term
$children   = get_terms( $term->taxonomy, array( //get term children
    'parent'        => $term->term_id,
    'hide_empty'    => false
) );

if($children) {    
    $terms = get_terms(
        array(
            'taxonomy' => $term->taxonomy,
            'parent'   => $term->term_id,
        )
    );
    foreach ( $terms as $term) {
        echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
} else {
    $parent_id      = $term->parent;
    $parent_term    = get_term_by('term_id', $parent_id); //get direct parent term
    echo '<li><a href="' . get_term_link( $parent_id ) . '">' . $parent_term->name . '</a></li>'; 
}
...