ブログやマニュアルサイトを読んでいる時に、「今自分が、サイト全体の中のどの階層のページを見ているのか?」が分からなくなった経験はありませんか?
そんな時に、読者の迷子を防いでくれる強力なナビゲーションが パンくずリスト (Breadcrumbs) です。

HOME > カテゴリー名 > 記事のタイトル

今回は、Hugoの変数を活用して、このパンくずリストをそれぞれのページに合わせて自動生成・表示させるテンプレートの作り方を解説します!

1. パンくずリストの実装方法

Hugoでは、.Parent 変数を使うことで、親ページ(一つ上の階層)をたどることができます。
これを利用して、トップページにたどり着くまで遡っていけば、パンくずリストが作れます。

テンプレートのコード (breadcrumbs.html)

今回は、どのページでも使い回せるように Partial Template(部品) として作ります。
layouts/partials/breadcrumbs.html というファイルを作って、以下のコードを書いてみましょう。

<nav class="breadcrumbs" aria-label="breadcrumb">
  <ol>
    {{/* 1. ホームへのリンク */}}
    <li>
      <a href="{{ .Site.BaseURL }}">HOME</a>
    </li>

    {{/* 2. 親ページがあれば表示 */}}
    {{ template "breadcrumbnav" (dict "p1" . "p2" .) }}
  </ol>
</nav>

{{/* 再帰的に親をたどるテンプレート定義 */}}
{{ define "breadcrumbnav" }}
  {{ if .p1.Parent }}
    {{/* 親がホームじゃない場合のみ処理続行(ホームは既に表示したので) */}}
    {{ if not .p1.Parent.IsHome }}
      {{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 )  }}
    {{ end }}
  {{ end }}

  {{/* 自分の表示(ただしホームは除く) */}}
  {{ if not .p1.IsHome }}
    <li>
      <span class="divider">&gt;</span>
      {{ if eq .p1 .p2 }}
        {{/* 今見ているページ(リンクなし) */}}
        <span aria-current="page">{{ .p1.Title }}</span>
      {{ else }}
        {{/* 親ページへのリンク */}}
        <a href="{{ .p1.RelPermalink }}">{{ .p1.Title }}</a>
      {{ end }}
    </li>
  {{ end }}
{{ end }}

ちょっと複雑に見えますが、やっていることは「親ページの親ページの…」と順番に親を探して、上から順に表示しているだけです。

2. テンプレートでの使い方

作った部品は、page.html(記事ページ)や list.html(一覧ページ)で呼び出します。
「記事の読み終わりに、次のアクションとしてサイト内を巡回してほしい」という場合は、記事本文の下に置くのがオススメです。

{{ define "main" }}
  
  ...

  <!-- 記事本文 -->
  <div class="content">
    {{ .Content }}
  </div>

  <!-- パンくずリストを表示 -->
  {{ partial "breadcrumbs.html" . }}

  <!-- 関連記事など -->
  ...
{{ end }}

partial 関数を使うと、さっき作った breadcrumbs.html をそこに「埋め込む」ことができます。
これで、どのページを開いても自動的に正しいパンくずが表示されるようになります!

3. スタイルを整える (CSS)

最後に、見栄えを整えましょう。横一列(1行)に並べるためのCSSです。

.breadcrumbs {
  margin-top: 30px;
  margin-bottom: 20px;
  font-size: 0.9rem;
  color: #666;
  overflow-x: auto;   /* スマホなどで長くなっても横スクロールできるように */
  white-space: nowrap; /* 勝手に折り返されないようにする(1行で表示) */
}

.breadcrumbs ol {
  list-style: none; /* リストの「・」を消す */
  padding: 0;
  margin: 0;
  display: flex;    /* 横並びにする */
  flex-wrap: nowrap; /* 折り返しを禁止する */
}

.breadcrumbs li {
  display: inline-flex;
  align-items: center;
}

.breadcrumbs .divider {
  margin: 0 8px; /* 区切り文字の隙間 */
  color: #ccc;
}

これで、1行にスッキリ収まるスマートな表示の完成です!


パンくずリストで読者にサイト内の現在地を伝えよう

パンくずリスト(Breadcrumbs)は、読者が「いまサイトのどこにいるのか」を直感的に把握できるだけでなく、上の階層(カテゴリー一覧ページなど)へすぐ戻ることができる重要なナビゲーション要素です。
breadcrumbs.html というPartial Template(部品)として一度作ってしまえば、記事ページにも一覧ページにも自由に呼び出して使い回すことができます!🗺️