如何获取自定义分类的父级,就像get_ategory_Parents()所做的那样?

时间:2011-04-04 作者:Edward

我有一个自定义分类法“portfolio category”,例如,我需要显示portfolio帖子的所有层次结构类别

该职位处于topcat -> childcat -> yetchildcat, 我想在贴子上显示“topcat,childcat,yetchildcat”,但是get_the_terms only 返回\'yetchildcat\', 我如何获得全部?

5 个回复
SO网友:scribu

还有一个更通用的函数:它被称为get_ancestors()wp-includes/taxonomy.php

SO网友:Doug Brunner

@杰夫,

谢谢你这么做。我修复了损坏的$链接函数。并将默认值更改为包含“»;”作为分隔符。

// my own function to wo what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = true, $separator = \' » \', $nicename = false, $visited = array()) {

$chain = \'\';

$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) { echo "fail";
    return $parent;
}

if ($nicename)

    $name = $parent -> slug;

else

    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {

    $visited[] = $parent -> parent;

    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

}

    if ( $link ) {
        // $chain .= \'<a href="\' . esc_url( get_category_link( $parent->term_id ) ) . \'" title="\' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . \'">\'.$name.\'</a>\' . $separator;
        $chain .= \'<a href="\' . esc_url( get_term_link( (int) $parent->term_id, $taxonomy ) ) . \'" title="\' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . \'">\'.$name.\'</a>\' . $separator;
    } else {
        $chain .= $name.$separator;
    }
    return $chain;

}

SO网友:Rarst

中没有更深层次的函数get_category_parents() (参见source). 只是检查一下parent 字段,然后递归检查其父对象,直到其耗尽。

因此,您需要编写简单的模拟或重写它(取决于您需要多少功能)。

SO网友:LapinLove404

get_the_termsget_term 在术语数据中检索父ID。因此,您可以使用该信息构建一个自定义函数,以显示分类树。

我实际上也在做类似的事情——我会在代码运行干净后尽快发布代码-D

编辑:我终于做到了。。。以下是获取“topcat->childcat->yetchildcat”的代码,并链接到分类术语页面:

$terms = get_the_terms( $post->id, \'portfolio category\' );
if ( $terms && ! is_wp_error( $terms ) ) { 
    foreach ( $terms as $term ) {
        $tree = \'<a href="\'.get_term_link($term->slug, \'portfolio category\').\'">\'.$term->name.\'</a>\';
        $parents = get_ancestors( $term->term_id, \'portfolio category\' );
        foreach ($parents as $parent) {
            $term = get_term($parent, \'portfolio category\');
            $tree = \'<a href="\'.get_term_link($term->slug, \'geo\').\'">\'.$term->name.\'</a> -> \'.$tree;
       }
    echo $tree;
}
我确信有可能生成更好/更干净的代码,但它似乎有效-D

SO网友:Jeff

我几乎完全基于get\\u category\\u parents()编写了一个递归函数,只是用基于术语的等价物替换了特定于类别的部分。希望它能帮助别人。

// my own function to wo what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = \'/\', $nicename = false, $visited = array()) {

$chain = \'\';

$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) { echo "fail";
    return $parent;
}

if ($nicename)

    $name = $parent -> slug;

else

    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {

    $visited[] = $parent -> parent;

    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

}

if ( $link ) {

    $chain .= \'<a href="\' . esc_url( get_term_link( (int) $parent->term_id, $taxonomy ) ) . \'" title="\' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . \'">\'.$name.\'</a>\' . $separator;
} else {
    $chain .= $name.$separator;
}
return $chain;

}

结束

相关推荐