WordPressで構造化データ用のパンくずを生成する

WordPressでschema.orgに基づく構造化データ用のパンくずコードを生成するためのコードをご紹介します。
こちらの関数を利用すると以下のようなhtmlを生成し、検索結果でパンくずが表示されるようになります。
(100%確実に…というわけでもなさそうですが)

■Googleの検索結果
img-breadcrumb

■生成されるhtml

<ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList”>
    <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem”>
        <a href="http://gimmicklog.main.jp" itemprop="item”>
            <span itemprop="name">TOP</span></a>
        <meta itemprop="position" content="1" />
    </li>
    <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem”>
        <a href="http://gimmicklog.main.jp/category/design/" itemprop="item”>
            <span itemprop="name">DESIGN</span></a>
        <meta itemprop="position" content="2" />
    </li>    
    <li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem”>
        <span itemprop="name">高品質で無料!商用フリー写真・動画素材まとめ</span>
        <meta itemprop="position" content="3" />    
    </li>
</ul>

構造化データに関してはこちらのサイト様が詳しく説明されています。
正しく実装されているか確認するためのGoogleの構造化データチェックツールはこちらです。

WordPressでの使い方

当サイトのような普通のブログサイトを想定して書いているので、カスタム投稿タイプなどを使っている場合は条件分岐を増やして上げる必要があります。

functions.php に関数を追加する

function breadcrumb_func(){
  global $post;
  $str ='';
  if(!is_home()&&!is_admin()){
    $str.= '<ul class="path" itemscope itemtype="http://schema.org/BreadcrumbList"><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">';
    $str.= '<a href="'.home_url().'" itemprop="item"><span itemprop="name">'.'TOP'.'</span></a><meta itemprop="position" content="1" /></li>';
    if( is_post_type_archive() ){
      $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.esc_html(get_post_type_object(get_post_type())->label ).'</span><meta itemprop="position" content="2" /></li>';
    } elseif(is_tax()){
      $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_post_type_archive_link( get_post_type() ).'" itemprop="item"><span itemprop="name">'.esc_html(get_post_type_object(get_post_type())->label ).'</span></a><meta itemprop="position" content="2" /></li>';
      $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.single_term_title( '' , false ).'</span><meta itemprop="position" content="3" /></li>';
    } elseif(is_tag()) {
        $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.single_tag_title( '' , false ).'</span><meta itemprop="position" content="2" /></li>';
    } elseif(is_category()) {
      $cat = get_queried_object();
      if($cat -> parent != 0){
        $ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ));
        foreach($ancestors as $ancestor){
          $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_category_link($ancestor).'" itemprop="item"><span itemprop="name">'.get_cat_name($ancestor).'</span></a><meta itemprop="position" content="2" /></li>';
        }
      }
      $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.$cat-> cat_name.'</span><meta itemprop="position" content="3" /></li>';
    } elseif(is_page()){
      if($post -> post_parent != 0 ){
        $ancestors = array_reverse(get_post_ancestors( $post->ID ));
        foreach($ancestors as $ancestor){
          $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'. get_permalink($ancestor).'" itemprop="item"><span itemprop="name">'.get_the_title($ancestor).'</span></a><meta itemprop="position" content="2" /></li>';
          $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.wp_title('', false).'</span><meta itemprop="position" content="3" /></li>';
        }
      } else {
      $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.wp_title('', false).'</span><meta itemprop="position" content="2" /></li>';
      }
    } elseif(is_single()){
      $categories = get_the_category($post->ID);
      $cat = $categories[0];
      if($cat -> parent != 0){
        $ancestors = array_reverse(get_ancestors( $cat -> cat_ID, 'category' ));
        foreach($ancestors as $ancestor){
          $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_category_link($ancestor).'" itemprop="item"><span itemprop="name">'.get_cat_name($ancestor).'</span></a><meta itemprop="position" content="2" /></li>';
        }
        $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_category_link($cat -> term_id).'" itemprop="item"><span itemprop="name">'.$categories[0]->cat_name.'</span></a><meta itemprop="position" content="3" /></li>';
        $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.wp_title('', false).'</span><meta itemprop="position" content="4" /></li>';
      } else {
        $str.='<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="'.get_category_link($cat -> term_id).'" itemprop="item"><span itemprop="name">'.$cat-> cat_name.'</span></a><meta itemprop="position" content="2" /></li>';
        $str.= '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">'.wp_title('', false).'</span><meta itemprop="position" content="3" /></li>';
      }
    }
    $str.= '</ul>'."\n";
  }
  return $str;
}
add_shortcode('breadcrumb', 'breadcrumb_func');

テンプレートに記述する方法

<php echo breadcrumb_func(); ?>

ショートコードで記述する方法

[breadcrumb]