私はカスタム分類法「ポートフォリオカテゴリ」を持っていますが、私はポートフォリオ投稿のすべての階層カテゴリを表示する必要がありますが、例えば
投稿はtopcat -> childcat -> yetchildcat
の下にあります、私は投稿ページに 'topcat、childcat、yetchildcat'を表示したいのですが、get_the_terms only
return 'yetchildcat
'、どうやって全部入手できますか?
より一般的な関数があります:それはget_ancestors()
と呼ばれ、wp-includes/taxonomy.php
にあります
@ジェフ、
これをありがとう。あなたの壊れた$ 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;
}
get_category_parents()
には、より深いレベルの関数はありません( source を参照)。カテゴリオブジェクトのparent
フィールドをチェックし、それがなくなるまでその親を再帰的にチェックします。
だからあなたは(あなたが必要とする機能の量に応じて)単純なアナログを書くか書き直す必要があるでしょう。
get_the_terms
とget_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
私は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;
}