web-dev-qa-db-ja.com

単一の投稿のカテゴリを階層的に取得する方法

質問は簡単です。
「スーパーキャット」の子である「親キャット」の子である「サブキャット」カテゴリ内にある「シングル投稿」という名前の投稿があるとします。私がする必要があるのは以下の順序で投稿ページ内のすべての関連カテゴリを表示することです:

super-cat > parent-cat > sub-cat > Single Post
1
Hamed Momeni
<?php 
    the_category( ' > ', 'multiple', $post->ID); 
    echo ' > ';
    the_title();
?> 

投稿がただ1つのカテゴリにある場合、これは正しく機能します。ただし、複数のカテゴリに属している場合、またはカテゴリの親も選択されている場合(あなたの場合は、投稿がスーパー猫と親猫にも含まれている場合)、これらのカテゴリは2回表示されます。
だから、これはおそらくあなたのためにそれをするつもりはないです。

私は ブレッドクラム型プラグイン のいくつかがこれを解決したかもしれないと思います。

1
Dominic

あなたは最初にカテゴリをソートする必要があります。

// get categories of post in sorted order
$categories = sortCategories(get_the_category());     

foreach($categories AS $category) {
    echo $category->name; // Plot category name
}
echo get_the_title(); // Plot post name

function sortCategories($categories) { // Sorting the category
    usort($categories, "cmpCategories");
    return $categories;
}

function cmpCategories($category_1,$category_2) { // Sort function
    foreach(get_categories(array("parent" => $category_1->cat_ID)) AS $sub) {
        if($category_2->cat_ID == $sub->cat_ID) return -1;
    }
    return 1;
}

これが助けになれば幸いです。

2
tobidude

これでうまくいくはずです。

$cats = get_the_category(); //retrieve cats for post

foreach ($cats as $cat) { //go thru to find child one - means cat which has specified parent id
    if ($cat->category_parent != 0) {
        $child = $cat->term_taxonomy_id;
    }
}
echo get_category_parents( $child, TRUE, ' > ' );

最初に特定の投稿のカテゴリを取得してから、最後の子を見つけ、次にget_category_parentsを使って親のツリー全体を取得します。

2
Roman

古い質問ですが、私にとってはGoogleでの最高の結果です。複数のカテゴリをサポートするブレッドクラムカテゴリをすばやく見つけることができなかったので、簡単にスタイリングできるように作成し、ulでラップしました。

// breadcrumb categorization
$cats = wp_get_post_categories( get_the_ID() );  //post id
foreach($cats as $c) {
    $ancestors = array_merge( array_reverse( get_ancestors( $c, 'category' ) ), [$c] );
    echo '<ul class="post-categories">';
    foreach($ancestors as $id){
        echo '<li><a href="' . esc_url( get_category_link( $id) ) . '">' . get_cat_name( $id ) . '</a></li>';
    }
    echo '</ul>';
}
0
Tom

これが私の実用的な解決策です。

$categories = get_the_category();

$ordering = array();
foreach( $categories as $index => $cat) {
    $ordering[$cat->parent] = $index;
}

$ordered_string = "";
$i = 0;
while( $ordering[$i] !== null ){
    $ordered_string .= '<li class="item-cat"><a href="'.get_category_link( $categories[$ordering[$i]]->term_id ).'">'.$categories[$ordering[$i]]->name.'</li>';

    $i = $categories[$ordering[$i]]->term_id;
}

echo $ordered_string;

それはブレッドクラムの準備が整った文字列をエコーし​​ます、そして少し修正することであなたは配列として配列されたカテゴリーを得ることができます。

0