Yoast Breadcrumbs是一款很出色的面包屑插件,它可以在文章、分类、归档、搜索等页面显示导航,SEO 的效果也非常好。

装上该插件后,搜索引擎也有很好的理解和展示, 下面是我上一篇文章的 Google 搜索结果:

Snip20130928_3

我博客上安装的是作者的另外一款很有名的插件 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(); ?>

大功告成。