搜索结果中的WordPress面包屑


WordPress breadcrumbs in search results

在WordPress中,我目前正在使用Yoast的SEO插件来显示我的页面和帖子的面包屑,这在访问特定页面时运行良好。

以下是我用来显示WordPress模板中面包屑的功能:

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

例如,当浏览到About Us的子级Team Members时,我得到:

Home > About Us > Team Members

然而,我希望能够在搜索结果循环中显示相同的面包屑(针对各个页面和帖子)。

到目前为止,搜索Members时显示的是:

您的搜索结果:

Team Members 
Home > Search > Members
Members Area 
Home > Search > Members

但我不想在"搜索结果"页面上使用面包屑,我希望它们用于搜索关键字后显示的各个页面和帖子。

例如,想象一下,我再次搜索Members,我想显示以下内容:

您的搜索结果:

Team Members 
Home > About Us > Team Members
Members Area 
Home > Members Area

我并不担心这是否与SEO插件集成,但到目前为止,这是我发现的在WordPress中显示面包屑的最佳解决方案!

另外,如果上面需要,这里是我的search.php文件:http://pastebin.com/0qjb2954

试试这个。这是我自己的工作片段,显示了搜索循环中的面包屑。

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

尝试在search.php文件中的yoast breadcrumb函数上方添加这行代码:

WPSEO_Breadcrumbs::$instance = NULL;

我相信这将是第22行,也要确保使用问题中的Yoast breadcrumb函数,而不是现在的新breadcrump()函数。

请让我知道这是否有效!

完整解释:

Yoast插件breadcrumbs功能是在页面加载的基础上构建的,基于当前页面作为子页面。为了让它加载正确的子级和父级,您需要在运行该函数之前重置它。没有内置的重置函数,但是将静态$instance设置为NULL应该会导致插件根据当前全局post对象重新生成数据,该对象是在循环时设置的。

在Yavor的回答基础上,我找到了一种方法。我已经为此绞尽脑汁好几个小时了。不过,您可以将备份和恢复放在循环的另一边。这是:

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;

它伪造查询以使其单数,因此新刷新的面包屑会认为这不是搜索页面,而是一篇文章或一个页面,或者你显示为搜索结果的任何内容。

使用插件生成面包屑并不是真正必要的。这里有一个简单的PHP函数,你可以添加到你的functions.PHP文件:

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

再加上一些CSS来设计它的样式,根据您的需求进行定制

#breadcrumbs {
    list-style:none;
    margin:5px 0;
    overflow:hidden;
}
#breadcrumbs li{
    float:left;
}
#breadcrumbs li+li:before {
    content: '| ';
    padding:0 4px;
}

然后,您可以在任何您喜欢的页面上实现这些面包屑,包括您的searchpage.php文件或您使用此调用显示搜索结果的任何文件

<?php breadcrumbs(); ?>

搜索页面有一个可以使用的条件函数。你可以随时将其应用于加载面包屑。这里有一个例子:

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

这也取决于你在哪里加载面包屑,但除非你的主题非常独特,否则这通常会起作用。