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_category( ' > ', 'multiple', $post->ID); 
    echo ' > ';

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.


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...

  • doesn't work... – Towfiq Jan 25 '14 at 19:53

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.


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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.