The question is simple.
Imagine that I have a post named 'Single Post' which is inside the category 'sub-cat' which is a child of 'parent-cat' which is a child of 'super-cat'.
What I need to do is to display all the related categories within the post page in the following order:
super-cat > parent-cat > sub-cat > Single Post
The question is simple.
Imagine that I have a post named 'Single Post' which is inside the category 'sub-cat' which is a child of 'parent-cat' which is a child of 'super-cat'.
What I need to do is to display all the related categories within the post page in the following order:
super-cat > parent-cat > sub-cat > Single Post
Share
Improve this question
asked Nov 4, 2011 at 7:12
2hamed2hamed
3802 gold badges3 silver badges16 bronze badges
5 Answers
Reset to default 3<?php
the_category( ' > ', 'multiple', $post->ID);
echo ' > ';
the_title();
?>
This works correctly when the post is in just one category. But if it's in multiple categories, or if the category parents are also selected — in your case, if the post is also in super-cat and parent-cat — then it displays those categories twice.
So this is probably not going to do it for you.
I suspect some of the breadcrumb type plugins might have solved this though.
you need to sort the categories first.
// 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;
}
I hope this helped.
This should do the trick:
$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, ' > ' );
First we get categories for particular post, then we find last child and then with get_category_parents we get whole tree of its parents...
Here my working solution for that:
$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;
It echoes the string ready for the breadcrumb, and with a little modification yo can get the categories ordered as array.
Old question but top result on Google for me. I couldn't quickly find a breadcrumb categorization, supporting multiple categories, so I created one and wrapped it in a ul
for easy styling:
// 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>';
}