Yoast Breadcrumbs是一款很出色的面包屑插件,它可以在文章、分类、归档、搜索等页面显示导航,SEO 的效果也非常好。
装上该插件后,搜索引擎也有很好的理解和展示, 下面是我上一篇文章的 Google 搜索结果:
我博客上安装的是作者的另外一款很有名的插件 WordPress SEO by Yoast,默认集成了Yoast Breadcrumbs的功能。
但是,该插件有一个不足的地方是,在文章页面中,仍然会在导航栏上显示标题,这样标题就在两处地方重复显示了,那么如何解决这个问题,下面我们介绍两种方法。
方法一
在 functions.php 文件中增加以下代码(来自 How to remove page title from breadcrumb):
<?php if (function_exists('yoast_breadcrumb')) { $opt = get_option("wpseo_internallinks"); $sep = ( isset($opt['breadcrumbs-sep']) && $opt['breadcrumbs-sep'] != '' ) ? $opt['breadcrumbs-sep'] : '»'; $breadcrumbs = yoast_breadcrumb('', '', false); $linksArr = split($sep, $breadcrumbs); array_pop($linksArr); echo '<nav id="breadcrumbs">'.implode($sep,$linksArr).'</nav>'; } ?>
这种方法比较暴力,它通过预设的分隔符将生成的内容切分,然后删除最后一个元素。最好配合 is_single
一起使用,否则会影响分类、归档等页面。
方法二
今天翻了下插件的代码,发现有提供一个 Filter 来控制导航中显示的链接(在文件 class-breadcrumbs.php 中):
function breadcrumb( $before = '', $after = '', $display = true ) { // ... 省略 $links = apply_filters( 'wpseo_breadcrumb_links', $links ); // ... 省略 }
$links 数组中的每一个元素都是导航栏中的每一个链接的描述:
* Each element of the links array can either have one of these keys: * "id" for post types; * "ptarchive" for a post type archive; * "term" for a taxonomy term. * If either of these 3 are set, the url and text are retrieved. If not, url and text have to be set. *
所以我们可以看元素是否包含 id 属性来判断,它是否是一个文章页面。
下面的实现的代码,放到 functions.php 文件中即可:
/* * Customize breadcrumb links */ function dangopress_customize_breadcrumb($links) { $my_links = array(); foreach ($links as $index => $value) { if (isset($value['id'])) { // find a single post, end.. $my_links[] = array('text' => '当前页面'); break; } $my_links[] = $value; } return $my_links; } add_filter('wpseo_breadcrumb_links', 'dangopress_customize_breadcrumb', 10, 1); function dangopress_breadcrumb() { if (!function_exists('yoast_breadcrumb') || is_home() || is_page()) return; yoast_breadcrumb('<div id="site-breadcrumbs">', '</div>'); }
然后在需要显示的地方加上:
<?php dangopress_breadcrumb(); ?>
大功告成。