7

In WordPress i'm currently using Yoast's SEO Plugin to display breadcrumbs for my pages and posts, which is working fine when visiting a specific page.

Here is the function i'm using to display the breadcrumbs inside of my WordPress templates:

<?php if ( function_exists('yoast_breadcrumb') ) {
    yoast_breadcrumb('<p id="breadcrumbs">','</p>');
} ?>

For example when browsing to Team Members which is a child of About Us I get:

Home > About Us > Team Members

However i'd like to be able to display the same breadcrumbs (for the individual pages and posts) inside the search results loop.

So far what displays when searching for Members is:

Your Search Results:

Team Members 
Home > Search > Members

Members Area 
Home > Search > Members

But I don't want breadcrumbs for the Search Results page, I want them for the individual pages and posts that are displayed as a result of searching for a keyword.

For example Imagine I searched again for Members I would like displayed the below:

Your Search Results:

Team Members 
Home > About Us > Team Members

Members Area 
Home > Members Area

I'm not fussed if this is or isn't integrated with the SEO plugin, however thus far it's the best solution I found to display breadcrumbs in WordPress!

Also incase abody requires it, here is my search.php file: http://pastebin.com/0qjb2954

5 Answers5

3

Try this. That's my own working snippet that shows breadcrumbs inside search loop.

/*Begin Loop */
<?php 
echo '<div class="b-search_result_list__item_breadcrumbs breadcrumbs">';

$current_type = get_post_type();
if ($current_type == 'page') {

    $parents = get_post_ancestors(get_the_ID());
    if($parents){

        for($i=count($parents)-1;$i>=0;$i--){
            echo '<span typeof="v:Breadcrumb">';
            echo '<a rel="v:url" property="v:title" title="'.get_the_title($parents[$i]).'" href="'.get_permalink($parents[$i]).'">'.get_the_title($parents[$i]).'</a>';
            echo '</span>';
        }
    }else{
        echo '<span typeof="v:Breadcrumb">';
        echo '<a rel="v:url" property="v:title" title="'.get_bloginfo('name').'" href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a>';
        echo '</span>';
    }
    echo '<span typeof="v:Breadcrumb">';
    echo '<span property="v:title">'.get_the_title().'</span>';
    echo '</span>';
}else{
    $current_obj = get_post_type_object($current_type);

        echo '<span typeof="v:Breadcrumb">';
        echo '<a rel="v:url" property="v:title" title="'.get_bloginfo('name').'" href="'.get_bloginfo('url').'">'.get_bloginfo('name').'</a>';
        echo '</span>';
        echo '<span typeof="v:Breadcrumb">';
        echo '<a rel="v:url" property="v:title" title="'.$current_obj->labels->name.'" href="'.get_post_type_archive_link( $current_type ).'">'.$current_obj->labels->name.'</a>';
        echo '</span>';

        $current_taxonomies = get_object_taxonomies($current_type);

        if($current_taxonomies){
            $current_terms = get_the_terms(get_the_ID(), $current_taxonomies[0]);

            if($current_terms){
                $current_term = array_shift($current_terms);

                echo '<span typeof="v:Breadcrumb">';
                    echo '<a rel="v:url" property="v:title" title="'.$current_term->name.'" href="'.get_term_link($current_term).'">'.$current_term->name.'</a>';
                echo '</span>';

                /*
                var_dump($current_obj->labels->name); // Archive name
                var_dump(get_post_type_archive_link( $current_type )); // Archive link
                var_dump($current_term->name);  // Term name
                var_dump(get_term_link($current_term)); // Term link
                var_dump(get_permalink()); // Post link 
                */
            }
        }
        echo '<span typeof="v:Breadcrumb">';
        echo '<span property="v:title">'.get_the_title().'</span>';
        echo '</span>';

}    

echo '</div>';
?>
/*End Loop*/
2

try adding this line of code above the yoast breadcrumb function in your search.php file:

WPSEO_Breadcrumbs::$instance = NULL;

This would be line 22 I believe, and also make sure to use the Yoast breadcrumb function from your question, not the new breadcrumb() function that's there now.

Please let me know if this works!

Full explanation:

The Yoast plugin breadcrumbs functionality is build on the page load, based on the current page as the child. To make it load the right child and parents, you'd need to reset it before you run the function. There is no built-in reset function, however setting the static $instance to NULL should cause the plugin to re-generate its data based on the current global post object which is set while you're looping.

Yavor
  • 671
  • 3
  • 9
  • @Giles did you test this out? – Yavor Oct 16 '14 at 17:33
  • 1
    Looks like this is impossible. Even after resetting the instance the plugin uses is_singular() to determine whether the current page is a post or not and this function cannot be overridden. So even though it's loading the right post after resetting the instance, it's picking the wrong type of breadcrumb to display based on type of the current page (post/archive/category/etc.) – Yavor Oct 19 '14 at 04:07
  • 5 years later, still works like a charm. Thanks Yavor! – Devin Walker Aug 08 '19 at 23:29
1

Building upon Yavor's answer I found a way. Been banging my head about it for hours. You can place the backup and restore otuside of the loop though. Here it is:

global $wp_query;
//backup
$old_singular_value = $wp_query->is_singular;
//change
$wp_query->is_singular = true;
//reset
WPSEO_Breadcrumbs::$instance = NULL;
//breadcrumbs
if (function_exists('yoast_breadcrumb')){
    yoast_breadcrumb('<p id="breadcrumbs">','</p>');
}
//restore
$wp_query->is_singular = $old_singular_value;

It fakes the query to make it singular so the newly-refreshed breadcrumbs thinks that this is not the search page but a single post or page or whatever you are displaying as your search results.

0

Using a plugin to generate breadcrumbs is not really necessary. Here's a simple PHP function you can add to your functions.php file:

function breadcrumbs() {
    global $post;
    echo "<ul id='breadcrumbs'>";
    if (!is_home()) {
        echo '<li><a href="' . get_option('home') . '">Home</a></li>';
        if (is_category() || is_single()) {
            echo "<li>" . the_category(' </li><li> ');
            if (is_single()) {
                echo "</li><li>" . the_title() . "</li>";
            }
        } elseif (is_page()) {
            if($post->post_parent){
                foreach ( get_post_ancestors( $post->ID ) as $ancestor ) {
                    echo '<li><a href="' . get_permalink($ancestor) . '" title="' . get_the_title($ancestor) . '">' . get_the_title($ancestor) . '</a></li>' .  get_the_title();
                }
            } else {
                echo "<li>" . get_the_title() . "</li>";
            }
        }
    } elseif (is_tag()) {
        single_tag_title();
    } elseif (is_day()) {
        echo "<li>Archive for " . the_time('F jS, Y') . "</li>";
    } elseif (is_month()) {
        echo "<li>Archive for " . the_time('F, Y') . "</li>";
    } elseif (is_year()) {
        echo "<li>Archive for " . the_time('Y') . "</li>";
    } elseif (is_author()) {
        echo "<li>Author Archive</li>";
    } elseif (isset($_GET['paged']) && !empty($_GET['paged'])) {
        echo "<li>Blog Archives</li>";
    } elseif (is_search()) {
        echo "<li>Search Results for" . the_search_query() . "</li>";
    }
    echo "</ul>";
}

along with some CSS to style it, customize as you desire

#breadcrumbs {
    list-style:none;
    margin:5px 0;
    overflow:hidden;
}

#breadcrumbs li{
    float:left;
}
#breadcrumbs li+li:before {
    content: '| ';
    padding:0 4px;
}

You can then implement those breadcrumbs on any page you like, including your searchpage.php file or whichever file you use to display search results with this call

<?php breadcrumbs(); ?>
davidcondrey
  • 34,416
  • 17
  • 114
  • 136
  • 1
    sorry just found a couple syntax errors but it should be all good now. haven't touched php in a couple weeks so let me know how it goes, should work fine though. – davidcondrey Oct 13 '14 at 09:01
  • 1
    search results will always only be 1 level past home wont it? – davidcondrey Oct 13 '14 at 09:15
  • Sure! But I don't need the breadcrumbs for the search results page I need breadcrumbs for the pages it finds upon searching for a keyword. For example see my question, I want the breadcrumbs for the page to come up along with the title, and an excerpt. –  Oct 13 '14 at 09:17
  • 1
    modified search portion of php code slightly.. not sure if its what your looking for or not. off to bed for me though. hope you figure it out. – davidcondrey Oct 13 '14 at 09:19
  • 1
    Cheers for your help buddy! I'm afraid it's not though. I'll re-edit my question shortly to give others a better chance of understanding me, aha. –  Oct 13 '14 at 09:22
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/62963/discussion-between-giles-and-dcc). –  Oct 13 '14 at 09:31
0

The search pages have a conditional function that can be used. You could always apply that to loading the breadcrumbs. Here is an example:

if ( ! is_search() ) {
    if ( function_exists('yoast_breadcrumb') ) {
        yoast_breadcrumb('<p id="breadcrumbs">','</p>');
    }
}

It depends where you are loading the breadcrumbs as well, but this should typically work unless your theme is very unique.

Ross Edman
  • 798
  • 5
  • 14