WordPress Breadcrumbs in den Suchergebnissen

Lesezeit: 7 Minuten

In WordPress verwende ich derzeit Das SEO-Plugin von Yoast anzuzeigen Semmelbrösel für meine Seiten und Beiträge, was beim Besuch einer bestimmten Seite gut funktioniert.

Hier ist die Funktion, die ich verwende, um die Breadcrumbs in meinen WordPress-Vorlagen anzuzeigen:

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

Zum Beispiel beim Surfen zu Team Members das ist ein Kind von About Us Ich bekomme:

Home > About Us > Team Members

Ich möchte jedoch in der Suchergebnisschleife dieselben Breadcrumbs (für die einzelnen Seiten und Beiträge) anzeigen können.

Bisher, was bei der Suche angezeigt wird Members ist:

Ihre Suchergebnisse:

Team Members 
Home > Search > Members

Members Area 
Home > Search > Members

Aber ich möchte keine Breadcrumbs für die Suchergebnisseite, ich möchte sie für die einzelnen Seiten und Beiträge, die als Ergebnis der Suche nach einem Schlüsselwort angezeigt werden.

Zum Beispiel Stellen Sie sich vor, ich habe erneut gesucht Members Folgendes möchte ich angezeigt bekommen:

Ihre Suchergebnisse:

Team Members 
Home > About Us > Team Members

Members Area 
Home > Members Area

Es ist mir egal, ob dies in das SEO-Plugin integriert ist oder nicht, aber bisher ist es die beste Lösung, die ich gefunden habe, um Breadcrumbs in WordPress anzuzeigen!

Auch falls jemand es braucht, hier ist mein search.php Datei: http://pastebin.com/0qjb2954

Benutzer-Avatar
HomAfromPTZ

Versuche dies. Das ist mein eigenes funktionierendes Snippet, das Breadcrumbs in der Suchschleife anzeigt.

/*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*/

Benutzer-Avatar
Yavor

Versuchen Sie, diese Codezeile über der Yoast-Breadcrumb-Funktion in Ihre search.php-Datei einzufügen:

WPSEO_Breadcrumbs::$instance = NULL;

Dies wäre, glaube ich, Zeile 22, und stellen Sie auch sicher, dass Sie die Yoast-Breadcrumb-Funktion aus Ihrer Frage verwenden, nicht die neue Funktion breadcrumb(), die jetzt da ist.

Bitte lassen Sie mich wissen, ob das funktioniert!

Vollständige Erklärung:

Die Breadcrumbs-Funktionalität des Yoast-Plugins wird beim Laden der Seite erstellt, basierend auf der aktuellen Seite als untergeordnetes Element. Damit es das richtige Kind und die richtigen Eltern lädt, müssen Sie es zurücksetzen, bevor Sie die Funktion ausführen. Es gibt keine eingebaute Reset-Funktion, aber das Setzen der statischen $instance auf NULL sollte das Plugin veranlassen, seine Daten basierend auf dem aktuellen globalen Post-Objekt neu zu generieren, das während der Schleife gesetzt wird.

  • @Giles hast du das getestet?

    – Jawor

    16. Oktober 2014 um 17:33 Uhr

  • Das scheint unmöglich zu sein. Auch nach dem Zurücksetzen der Instanz verwendet das Plugin is_singular(), um festzustellen, ob die aktuelle Seite ein Beitrag ist oder nicht, und diese Funktion kann nicht überschrieben werden. Obwohl also nach dem Zurücksetzen der Instanz der richtige Beitrag geladen wird, wird basierend auf dem Typ der aktuellen Seite (Beitrag/Archiv/Kategorie/usw.) die falsche Art von Breadcrumb zur Anzeige ausgewählt.

    – Jawor

    19. Oktober 2014 um 4:07 Uhr

  • 5 Jahre später, funktioniert immer noch wie ein Zauber. Danke Javor!

    – Devin Walker

    8. August 2019 um 23:29 Uhr

Aufbauend auf Yavors Antwort habe ich einen Weg gefunden. Zerbrich mir da schon seit Stunden den Kopf. Sie können die Sicherung jedoch außerhalb der Schleife platzieren und wiederherstellen. Hier ist es:

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;

Es täuscht die Abfrage vor, um sie einzigartig zu machen, sodass die neu aktualisierten Breadcrumbs denken, dass dies nicht die Suchseite ist, sondern ein einzelner Beitrag oder eine einzelne Seite oder was auch immer Sie als Ihre Suchergebnisse anzeigen.

Benutzer-Avatar
davidcondrey

Die Verwendung eines Plugins zur Generierung von Breadcrumbs ist nicht unbedingt erforderlich. Hier ist eine einfache PHP-Funktion, die Sie zu Ihrer Datei functions.php hinzufügen können:

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>";
}

zusammen mit etwas CSS, um es zu gestalten, passen Sie es nach Ihren Wünschen an

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

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

Sie können diese Breadcrumbs dann auf jeder beliebigen Seite implementieren, einschließlich Ihrer searchpage.php-Datei oder der Datei, die Sie verwenden, um Suchergebnisse mit diesem Aufruf anzuzeigen

<?php breadcrumbs(); ?>

Die Suchseiten haben a Bedingte Funktion das kann verwendet werden. Sie könnten das immer auf das Laden der Breadcrumbs anwenden. Hier ist ein Beispiel:

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

Es hängt auch davon ab, wo Sie die Breadcrumbs laden, aber das sollte normalerweise funktionieren, es sei denn, Ihr Thema ist sehr einzigartig.

1371370cookie-checkWordPress Breadcrumbs in den Suchergebnissen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy