How-to get the get_category_parents() breadcrumbs trail without link on last item

Just a question : I want to use get_category_parents() to display a breadcrumb on a category archive page, but with no link on the current displayed category (SEO purposes, because they say that’s a link to itself. I’m not sure search engines are that stupid, but anyway).

Like this :

Read More

link_home » link_cat1 » link_subcat1 » nolink_subsubcat1

get_category_parents() is perfect for that, but there’s only two options : with links and without links.

What I want is links BUT on the last item.

The function is returning a string, not a object or array, so I cannot remove the last item.

I could do with regex by searching with the » separator and remove last link that way, but i’m pretty bad with regexes (if you know good references for that, i’m interested !).

I know the obvious answer is to create a custom function using get_ancestors() and a loop , then simply adding after the current category name.

But I wanted to know is there is some more simplier way, but just hooking get_category_parents() to not adding link to the last item ?

Thank you for any insight.

Regards
Simon

Related posts

Leave a Reply

4 comments

  1. I wouldn’t consider this any better/worse than Kaiser’s option, but just different. Why not use get_category_parents on the parent category and then (optionally) append the current category?

    I haven’t tested this, but something like the following should work:

    $cat_id=7;//current category's ID (e.g. 7)
    $separator='»';//The separator to use
    $category = get_category($cat_id);//$category is the current category object
    $parent_id = $category[0]->category_parent //category's parent ID
    $ancestors = get_category_parents($parent_id, true, $separator);
    

    Then optionally add the current category’s name:

     if($ancestors){
          $breadcrumb = $ancestors.$separator.' <span class="active-cat">'.single_cat_title().'</span>';
     }else{
          $breadcrumb = '<span class="active-cat">'.single_cat_title().'</span>';
     }
         echo $breadcrumb;
    

    EDIT:

    It turns out this almost exactly how WordPress produces the output: get_category_parents calls itself recursively (see here), so with this method you are essentially ‘stopping it early’, and manually completing it. There are no hooks that can achieve this effect however.

  2. Use native php functions

    It’s not that hard, if you take a in-depth look at string/array handling on php.net.

    // 1. Calls the category parents including their links
    // 2. Explodes the string to an array with limit -1 to avoid outputting the last element
    // 3. Loops through the array and echos the breadcrumbs
    // 3.a Shows the » only after the first breadcrumb
    foreach( explode( '//', get_category_parents( $cat, true, '//' ), -1 ) as $index => $breadcrumb )
        echo $index <= 0 ? $breadcrumb : " &raquo; {$breadcrumb}";
    // 4. Echo the current category with a leading »
    echo ' &raquo; <span class="breadcrumb-active-cat">'.single_cat_title().'</span>';
    

    Note: Not tested

  3. Though a bit old thread, I have come out with this:

    $catpars= get_category_parents($cat_id, true, ' &raquo; ');
    $catpars= preg_replace('/Ww+s*(W*)$/', '', $catpars);
    
  4. In a category page you can also do and it will leave current category from the breadcrumb and all its parent categories will be displayed.

       echo get_category_parents( get_queried_object()->parent, true, ' &rarr; ' );