自定义分类术语分层导航

时间:2021-01-26 作者:leemon

我正在建立一个产品目录网站,我创建了一个product 自定义帖子类型和相关product_type 分类学我添加了一些产品并创建了以下内容product_type 条款:

当用户访问目录时,我想给他看一个product_type 按级别导航术语。也就是说,当他进入主目录页时,我只想让他看到第一级术语:Books, Toys 和一个名为All 单击时显示所有产品。

enter image description here

例如,当用户单击某个根术语时,Books, 除了根术语之外,我还想显示它的子术语,即:Classics, Fantasy, Mystery 和一个名为All 单击时显示Books 学期

enter image description here

同样,当用户单击Toys 根术语,除了根术语外,我还想显示其子术语,即:Puzzles, Dolls, Cars 和一个名为All 单击时显示Toys 学期

enter image description here

我使用以下递归函数按层次获取所有术语:

function get_taxonomy_hierarchy( $taxonomy, $parent = 0 ) {
    $taxonomy = is_array( $taxonomy ) ? array_shift( $taxonomy ) : $taxonomy;
    $terms = get_terms( $taxonomy, array( \'parent\' => $parent ) );
    $children = array();
    foreach ( $terms as $term ){
        $term->children = get_taxonomy_hierarchy( $taxonomy, $term->term_id );
        $children[ $term->term_id ] = $term;
    }
    return $children;
}
但我在努力处理All 所有这些结构中的链接,因为它们本身不是实际的术语。任何想法都将不胜感激。

1 个回复
最合适的回答,由SO网友:leemon 整理而成

我自己设法找到了解决办法。此代码将在分类法模板中使用。

PHP:

function show_taxonomy_navigation( $post_type = \'post\', $taxonomy = \'category\', $parent = 0 ) {
    $html = get_taxonomy_hierarchy( $post_type, $taxonomy, $parent );
    echo $html;
}

function get_taxonomy_hierarchy( $post_type, $taxonomy, $parent = 0, $depth = 0 ) {
    $taxonomy = is_array( $taxonomy ) ? array_shift( $taxonomy ) : $taxonomy;
    $html = \'\';
    // get the id of the currently queried term
    $current_term_id = get_queried_object_id();
    $args = array(
        \'taxonomy\' => $taxonomy,
        \'parent\'   => $parent,
        \'order_by\' => \'name\',
    );
    // Get the child terms of $parent
    $terms = get_terms( $args );
    if ( $terms ) {
        if ( $depth == 0 ) {
            $html .= \'<nav class="taxonomy-navigation">\';
        }
        $ul_classes = [];
        $ul_classes[] = \'terms\';
        $html .= \'<ul class="\' . esc_attr( implode( \' \', array_filter( $ul_classes ) ) ) . \'">\';
        // Add \'All\' link
        $all_link = ( $parent > 0 ) ? get_term_link( $parent ) : get_post_type_archive_link( $post_type );
        $html .= \'<li><a href="\' . $all_link . \'">\' . esc_html__( \'All\', \'my-taxonomy-navigation\' ) . \'</a></li>\';
        foreach ( $terms as $term ) {
            $li_classes = [];
            $li_classes[] = \'term-item\';
            // Add class if term corresponds to the currently queried term
            $li_classes[] = ( $term->term_id == $current_term_id ) ? \'current-term\' : null;
            // Add class if term is a parent of the currently queried term
            $li_classes[] = ( term_is_ancestor_of( $term->term_id, $current_term_id, $taxonomy ) ) ? \'current-term-parent\' : \'\';
            $html .= \'<li class="\' . esc_attr( implode( \' \', array_filter( $li_classes ) ) ) . \'">\';
            $html .= \'<a href="\' . get_term_link( $term->term_id ) . \'">\' . $term->name . \'</a>\';
            // Recursively go deeper in the hierarchy
            $html .= get_taxonomy_hierarchy( $post_type, $taxonomy, $term->term_id, $depth + 1 );
            $html .= \'</a>\';
            $html .= \'</li>\';
        }
        $html .= \'</ul>\';
        if ( $depth == 0 ) {
            $html .= \'</nav>\';
        }
    }
    return $html;
}

CSS:

.taxonomy-navigation ul.terms {
    position: relative;
    list-style: none;
    text-align: center;
}

.taxonomy-navigation ul.terms li {
    display: inline-block;
    margin: 0;
    padding: 0 15px;
}

.taxonomy-navigation ul.terms li.current-term > a,
.taxonomy-navigation ul.terms li.current-term-parent > a {
    font-weight: 700;
}

.taxonomy-navigation ul.terms li ul.terms {
    display: none;
    position: absolute;
    top: auto;
    left: 0;
    right: 0;
    margin: 0 auto;
}

.taxonomy-navigation ul.terms li.current-term > ul.terms,
.taxonomy-navigation ul.terms li.current-term-parent > ul.terms {
    display: block;
}

相关推荐

get taxonomies from terms

我有两种帖子类型文档、新闻项目以及每种帖子类型的类别,文档--PDF、Word、Excel、新闻项目--文章、版本,但它们共享相同的标记。文档—BOSS、EFF、CDF—新闻项目—BOSS、EFF、CDF—如何检索其帖子(或帖子计数。无论帖子类型如何)具有指定标记的类别列表,例如。BOSS--PDF(2),版本(1)CDF——文章(1),Excel(1)