web-dev-qa-db-ja.com

Get_category_parents()のように、カスタム分類法の親を取得する方法

私はカスタム分類法「ポートフォリオカテゴリ」を持っていますが、私はポートフォリオ投稿のすべての階層カテゴリを表示する必要がありますが、例えば

投稿はtopcat -> childcat -> yetchildcatの下にあります、私は投稿ページに 'topcat、childcat、yetchildcat'を表示したいのですが、get_the_terms only return 'yetchildcat'、どうやって全部入手できますか?

2
Edward

より一般的な関数があります:それはget_ancestors()と呼ばれ、wp-includes/taxonomy.phpにあります

2
scribu

@ジェフ、

これをありがとう。あなたの壊れた$ link関数を修正しました。デフォルトを変更して、区切り文字として """を含めました。

// 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;

}
1
Doug Brunner

get_category_parents()には、より深いレベルの関数はありません( source を参照)。カテゴリオブジェクトのparentフィールドをチェックし、それがなくなるまでその親を再帰的にチェックします。

だからあなたは(あなたが必要とする機能の量に応じて)単純なアナログを書くか書き直す必要があるでしょう。

0
Rarst

get_the_termsget_termは、用語のデータから親IDを取得します。そのため、その情報を使用して、分類ツリーを表示するカスタム関数を構築することができます。

私は実際に似たようなことに取り組んでいます - それがうまくいってきれいになったらすぐにコードをポストする予定です。

編集:私はやっとそれをやった...これは分類学の用語ページへのリンクで "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

0
LapinLove404

私はget_category_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;

}
0
Jeff