サイトを長く運営して記事数が数十、数百と増えてくると、トップページやカテゴリーの一覧ページが果てしなく縦に長くなりすぎてしまい、読者にとって非常に見づらく(ロードも遅く)なってしまいます。
そこで必須となる機能が、**「ページネーション (Pagination)」**の導入です。一定の件数ごとに記事リストを複数のページに分割(分割表示)して管理します。

実装が完了すると一覧ページの末尾に、よく見かける ← Prev 1 2 3 Next → のようなナビゲーションリンクが自動生成されるようになります。


1. 設定ファイル (hugo.toml)

まずは、1ページに何件表示するかを決めます。
hugo.tomlpaginate という行を追加します(デフォルトは10件です)。

# hugo.toml
baseURL = '...'
title = '...'
theme = '...'

# 1ページあたりの記事数
paginate = 6

2. リストテンプレートの修正 (layouts/list.html)

一覧ページ (layouts/list.html) で、記事を取得する方法を変えます。
(※Hugo v0.145以前のバージョンでは layouts/_default/list.html を使用していました)
これまでは .Pages を使っていましたが、これを .Paginator.Pages に書き換えます。

<!-- layouts/list.html -->

<ul>
    <!-- 変更前: {{ range .Pages }} -->
    <!-- 変更後: -->
    {{ range .Paginator.Pages }}
    <li>
        <a href="{{ .RelPermalink }}">{{ .Title }}</a>
        <time>{{ .Date.Format "2006-01-02" }}</time>
    </li>
    {{ end }}
</ul>

<!-- ページ送りボタンを表示する場所 -->
{{ partial "pagination.html" . }}

たったこれだけで、Hugoが自動的に記事を分割してくれます!便利!


3. ページ送りボタンの作成 (Partial)

次に、ページ移動のためのリンク(Prev/Nextなど)を作る部品を作成します。
themes/my-tutorial-theme/layouts/partials/pagination.html を新規作成し、以下のコードを記述します。

<!-- layouts/partials/pagination.html -->
{{ if gt .Paginator.TotalPages 1 }}
<nav class="pagination">
    {{ if .Paginator.HasPrev }}
    <a class="pagination-link" href="{{ .Paginator.Prev.URL }}">← Prev</a>
    {{ else }}
    <span class="pagination-link disabled">← Prev</span>
    {{ end }}

    <span class="page-number">
        Page {{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }}
    </span>

    {{ if .Paginator.HasNext }}
    <a class="pagination-link" href="{{ .Paginator.Next.URL }}">Next →</a>
    {{ else }}
    <span class="pagination-link disabled">Next →</span>
    {{ end }}
</nav>

<style>
/* 簡易的なスタイル (CSSファイルに移動させるのがおすすめ) */
.pagination {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 1rem;
    margin-top: 2rem;
}
.pagination-link {
    padding: 0.5rem 1rem;
    border: 1px solid #ddd;
    border-radius: 4px;
    text-decoration: none;
    color: #333;
}
.pagination-link.disabled {
    color: #ccc;
    pointer-events: none;
    border-color: #eee;
}
.pagination-link:hover:not(.disabled) {
    background-color: #f5f5f5;
}
</style>
{{ end }}

ページネーションを設定してサイトの表示をスマートに保とう

一覧に表示する記事数が増加した際、すべての記事を一気に読み込ませてしまうと、表示速度(ロード時間)が長くなり読者の離脱に直結してしまいます。またスマホなどのモバイル環境ではスクロールが過大になってしまいます。

Hugoの .Paginator を使えば設定ファイルの件数(paginate)に従って一覧リストを動的に自動分割してくれるため、一覧機能を作る際はぜひ初めからページネーションを組み込んで、快適で分かりやすいリスト表示を設計しておきましょう!