【WordPress】リッチリザルト対応の自動パンくずリスト生成

最終更新日: 公開日: 2021年01月

このところ,リッチリザルトの投稿が続いている.

そこで今更ではあるが「パンくずリスト」についても書いてみる.

折角なので WordPress を使っている場合に自動でパンくずリストを生成する方法を書いてみよう.

microdata 形式のパンくずリスト

まず,パンくずリストを microdata 方式で普通に書くと以下のようになる.

参考:パンくずリスト | Google 検索セントラル | Google Developers

前の記事の「リッチリザルトの ロゴ への対応」のパンくずリストは以下のようになっている.

<ol class="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">
  <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
    <a href="/" itemprop="item">
      <span itemprop="name">レクタス</span>
    </a>
    <meta itemprop="position" content="1" />
  </li>
  <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
    <a href="https://www.rectus.co.jp/archives/category/blog/htmlcss" itemprop="item">
      <span itemprop="name">HTML&amp;CSS</span>
    </a>
    <meta itemprop="position" content="2" />
  </li>
  <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
    <a href="" itemprop="item">
      <span itemprop="name">リッチリザルトの ロゴ への対応</span>
    </a>
    <meta itemprop="position" content="3" />
  </li>
</ol>

【WordPress】複数カテゴリ対応パンくずリスト自動生成サンプルコード

自動でパンくずリストを作るための関数の説明

以下の4つの関数を functions.php に挿入する.

get_current_term は 【WordPress】アーカイブページで現在のカテゴリ・タグの情報を簡単に取得する方法 のページから頂きました.
ありがとうございます.

getBC は通常ページのパンくずリストを作る関数
getCateBC はカテゴリページのパンくずリストを作る関数
my_breadcrumb はパンくずリストを表示する関数

複数カテゴリにも対応

折角スクリプトにするので,投稿した記事が複数のカテゴリに含まれる場合は複数のパンくずリストが表示されるようにしている.
このページのようにパンくずリストが縦に並ぶ.

複数種類のページに対応

投稿記事だけでなく,カテゴリページ,年月ページ,タグページ,検索結果ページ,404ページにも対応している.

カテゴリページに親子関係がある場合,それも表示するようにしている.

パンくずリスト自動生成サンプルコード

CSS は省いているので自サイトに応じて適宜適用してほしい.
以下の関数を functions.php に挿入.

プログラムを一部修正.(2021/02/04)

function get_current_term(){
  $id;
  $tax_slug;
  if (is_category()) {
    $tax_slug = "category";
    $id = get_query_var('cat');
  } else if(is_tag()) {
    $tax_slug = "post_tag";
    $id = get_query_var('tag_id');
  } else if(is_tax()) {
    $tax_slug = get_query_var('taxonomy');
    $term_slug = get_query_var('term');
    $term = get_term_by("slug", $term_slug, $tax_slug);
    $id = $term->term_id;
  }
  return get_term($id,$tax_slug);
}
function getBC($cat_id, $inLevel) {
  $cat_list = array();
  $stBCMain = '';
  while ($cat_id != 0) {
    $cat = get_category($cat_id);
    $cat_link = get_category_link($cat_id);
    if ($cat->parent == 0) { break; }
    array_unshift($cat_list, '<a href="' . $cat_link . '" itemprop="item"><span itemprop="name">' . $cat->name . '</span></a>');
$cat_id = $cat->parent;
  }
  foreach($cat_list as $value){
    $stBCMain .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">'. $value .'<meta itemprop="position" content="' . $inLevel++ . '" /></li>';
  }
  return array($stBCMain, $inLevel);
}
function getCateBC($cat_id, $inLevel) {
  $cat_list = array();
  $stBCMain = '';
  while ($cat_id != 0) {
    $cat = get_category($cat_id);
    $cat_link = get_category_link($cat_id);
    array_unshift($cat_list, '<a href="' . $cat_link . '" itemprop="item"><span itemprop="name">' . $cat->name . '</span></a>');
    if ($cat_id->category_parent == 0) { break; }
    $cat_id = $cat_id->category_parent;
  }
  foreach($cat_list as $value){
    $stBCMain .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">'. $value .'<meta itemprop="position" content="' . $inLevel++ . '" /></li>';
  }
  return array($stBCMain, $inLevel);
}
function my_breadcrumb() {
  $inLevel = 1;
  $stBCHead = '<div><ol class="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">';
  // ホーム > と表示
  $stBCHead .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><a href="/" itemprop="item"><span itemprop="name">ホーム</span></a><meta itemprop="position" content="' . $inLevel++ . '" /></li>';
  // ページでの階層表示
  $stBCFoot = '</ol></div>';
  $stListE = '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"><a href="" itemprop="item"><span itemprop="name">%s</span></a><meta itemprop="position" content="%s" /></li>';
  if (is_single()) {
    // 通常ページ
    $cat_id = 0;
    $cats = get_the_category();
    $cat_num = count($cats);
    for ($i = 0;$i < $cat_num;$i++) {
      if (isset($cats[$i]->term_id)) {
        $cat_id = $cats[$i]->term_id;
      } else {
        break;
      }
      list($stBCMain, $inNewLevel) = getBC($cat_id, $inLevel);
      $stBCCur = sprintf($stListE, get_the_title(), $inNewLevel);
      echo $stBCHead . $stBCMain . $stBCCur . $stBCFoot . "\n";
    }
  } else {
    $stBCMain = '';
    if (is_archive()) {
      // アーカイブページ
      $id = get_current_term();
      if (0 < $id->parent) {
        // カテゴリで親がある場合
        $id = get_category($id->parent);
        list($stBCMain, $inNewLevel) = getCateBC($id, $inLevel);
      } else {
        $inNewLevel = $inLevel;
      };
      $stBCCur = sprintf($stListE, get_the_archive_title(), $inNewLevel);
    } else if (is_search()) {
      $stBCCur = sprintf($stListE, "検索: " . get_search_query(), 2);
    } else if (is_404()) {
      $stBCCur = sprintf($stListE, "ページが見つかりません", 2);
    }
    echo $stBCHead . $stBCMain . $stBCCur . $stBCFoot . "\n";
  }
}

「ホーム」と書いてある部分は企業の場合は自社の名前にするとよいだろう.

使い方としては

  • single.php
  • category.php
  • date.php
  • tag.php
  • search.php
  • 404.php

に以下のような記述を挿入する.
挿入した場所にパンくずリストが表示される.

<?php
my_breadcrumb();
?>

リッチリザルトテスト

埋め込んだ後は下記URLでテストするのを忘れないようにする.
リッチリザルトテスト(google)

 タグ: , , , , , ,  
 

Contact

ご質問等ありましたら,下のフォームからお願いします.

 
   
Apache Chrome Chrome 拡張機能 CSS Git Google HTML javascript PageSpeed Insights PHP python SEO Windows WordPress xyzzy Youtube z-index アナリティクス ウェビナー エディタ サーチコンソール サーバー管理 スライダー セミナー タグマネージャー テレワーク デザイン データベース ネットワーク フォーム ページ閲覧解析 マーケティング リッチリザルト レスポンシブ レスポンシブ対応 ログ解析 ローカル環境構築 営業 実装
contact
Pagetop