WordPress搜索结果中的面包屑

问题描述:

在WordPress中,我目前使用Yoast's SEO Plugin为我的网页和帖子显示breadcrumbs,在访问特定页面时工作正常。WordPress搜索结果中的面包屑

这里是我使用,以显示我的WordPress模板里面的面包屑功能:

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

例如浏览到Team Members这是当About Us一个孩子,我得到:

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中显示面包屑的最佳解决方案!

而且柜面abody需要它,这是我的search.php文件:http://pastebin.com/0qjb2954

使用插件生成面包屑是不是真的有必要。这里有一个简单的PHP功能,您可以添加到您的functions.php文件:一些CSS样式它,定制你的愿望

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

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

然后就可以实现在任何网页上的面包屑沿

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

你喜欢的,包括你的searchpage.php文件或文件为准您使用此调用

<?php breadcrumbs(); ?> 
+1

对不起,刚发现一些语法错误,但现在应该都很好。几个星期没有触及php,所以让我知道它是如何发生的,但应该工作得很好。 – davidcondrey 2014-10-13 09:01:29

+0

它的晚我能说什么..大声笑 – davidcondrey 2014-10-13 09:06:58

+0

从您的搜索结果中发布代码php文件 – davidcondrey 2014-10-13 09:12:44

尝试加入这一行上面的代码yoast面包屑功能我来显示搜索结果n您的search.php中的文件:

WPSEO_Breadcrumbs::$instance = NULL; 

这将是22行,我相信,也请务必使用Yoast面包屑功能,从你的问题,而不是新的面包屑()函数,现在的存在。

请让我知道这是否行得通!

充分说明:

的Yoast插件面包屑的功能是建立在页面加载,基于当前页为孩子上。为了使它载入正确的孩子和父母,您需要在运行该功能之前将其重置。没有内置的重置函数,但是将静态$实例设置为NULL应该会导致插件基于当前循环中设置的全局后对象重新生成其数据。

+0

@Giles你测试过了吗? – Yavor 2014-10-16 17:33:17

+1

看起来这是不可能的。即使在重置实例之后,插件使用is_singular()来确定当前页面是否为帖子,并且该函数不能被覆盖。因此,即使它在重置实例后加载正确的帖子,它也会根据当前页面的类型(post/archive/category/etc)选择错误类型的breadcrumb进行显示。 – Yavor 2014-10-19 04:07:52

搜索页面有conditional function可以使用。您始终可以将其应用于加载面包屑。这里有一个例子:

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

这取决于你在哪里加载的面包屑为好,但这通常应该工作,除非你的主题非常独特。

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

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

建立在Yavor的答案我找到了一种方法。几个小时以来,我一直在喋喋不休。您可以放置​​备份并恢复循环的otuside。那就是:

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; 

它假货这样新刷新的面包屑认为这是不是搜索网页,但单篇文章或页面或任何你正在显示的搜索结果的查询,使之奇。