[Hugo] ページネーションを追加する
2016-08-16
ブログ一覧ページの追加
このサイトはhugo-uno
というベーステーマを元に作成している。しかし、このテーマはトップページに最新の記事を10個だけ表示するようになっていた。また、index.html#blog
というハッシュを付けた場合に一覧を表示するようになっている(カバーページと一覧ページを同一のhtmlで切り替えて表示するようになている)。
これを下記のように変更したいのだが、これがなかなかわかりにくくて、特に下記の★の2つはだいぶ調べるのに時間がかかった。最終的には対応できたのでこれを記事にしておきたいと思う。
- rootのindex.htmlはカバーページ専用とする。
- この変更についてはこの記事では説明しない。変更点はmm-git/hugo参照。
layouts/index.html
,static/js/main.js
あたりを変更している。
- この変更についてはこの記事では説明しない。変更点はmm-git/hugo参照。
blog
、work
といったセクションごとに、記事の一覧を作成する。★blog
は5記事毎にページを切り替えるようにする。★work
は同一ページに全一覧を載せる。
blog一覧ページの作成
まず最初のハマりポイント。あるセクションごの一覧ページを作成する場合、下記のようにする。(わかれば簡単なのだが・・)
layouts/section
フォルダにセクション名.html
というファイルを作成する。layouts/セクション名
フォルダに、summary.html
というファイルを作成する。- ファイル変更後、hugo serverを起動させて確認する。
http://baseurl/セクション名/
で一覧が表示される。
※blog
セクションの場合、layouts/blog/summary.html
、layouts/section/blog.html
を作成
layouts/section/blog.html
layouts/section/blog.html
1:
2<section id="main">
3 {{ $paginator := .Paginate (where .Data.Pages "Type" "blog") 5 }}
4
5 <div class="article_list">
6 {{ range $paginator.Pages }}
7 {{ .Render "summary" }}
8 {{ end }}
9 :
10 </div>
11</section>
12:
- 上記は、blog.htmlの一部。記事一覧とページ機能の部分のみ抜粋。
- このファイルを元にして、
public/blog/index.html
が作成される。public/blog/index.html
は一覧の1ページ目のhtmlファイルとなっている。
- 2つめのハマりポイント。あるセクションごとに、かつ5ページごとにページ一覧作成するには、3行目の
.Paginate
関数のようにする。.Paginate
関数の結果を$paginator
に代入しておくのがポイント。html
のどこかに.Paginate
があれば、public/blog/page/
にページごとのindex.html
が作成される。public/blog/page/1/index.html
、public/blog/page/2/index.html
..のようにindex.html
が作成される。public/blog/page/1/index.html
については、public/blog/index.html
へリダイレクトされるようになっている。
- 6〜7行目で、各記事のサマリーを作成している。
$paginator
には.Paginate
関数で絞られた最大5記事のデータが配列で入っている。$paginator.Pages
でループさせることで、各記事のサマリを作成している。.Render "summary"
により、layouts/blog/summary.html
の内容をここに出力する。
layouts/blog/summary.html
layouts/blog/summary.html
1<article class="summary_post summary_link" onClick="document.location.href = '{{ .Permalink }}'">
2<header>
3<h2 class="summary-title">{{ .Title }} {{ if .Draft }}:: DRAFT{{end}} </h2>
4<div class="post-meta">{{ .Date.Format "2006-01-02" }} - Read in {{ .ReadingTime }} Min </div>
5</header>
6<div class="summary">
7 {{ .Description }}
8</div>
9<footer>
10</footer>
11</article>
- 記事の内容にアクセスするには、
.Permalink
、.Title
などの変数を用いる。- Hugo - Template Variablesの
Page Variables
に一覧がある。
- Hugo - Template Variablesの
public フォルダの出力例
public
└──blog
├── index.html
├── index.xml
└── page
├── 1
│ └── index.html
└── 2
└── index.html
work一覧ページの作成
blog
のページ一覧と同様に下記ファイルを作成する。
layouts/section/work.html
layouts/work/summary.html
layouts/section/work.html
layouts/section/work.html
1:
2<section id="main">
3 <div class="article_list">
4 {{ range .Data.Pages }}
5 {{ if eq .Type "work" }}
6 {{ .Render "summary"}}
7 {{ end }}
8 {{ end }}
9 </div>
10</section>
11:
- 上記は、work.htmlの一部。記事一覧とページ機能の部分のみ抜粋。
- このファイルを元にして、
public/work/index.html
が作成される。 - 4〜6行目で、各記事のサマリーを作成している。
.Data.Pages
で全ての記事をループさせ、そのうちタイプがwork
のものだけ、各記事のサマリを作成している。.Render "summary"
により、layouts/work/summary.html
の内容をここに出力する。
layouts/work/summary.html
layouts/work/summary.html
1<article class="summary_post summary_link sumary_work" onClick="document.location.href = '{{ .Permalink }}'">
2<header>
3</header>
4<footer>
5</footer>
6<div class="post_image_frame">
7 {{ if .Params.landscape }}
8 <img src="{{ .Params.image }}" class="post_image post_image_landscape">
9 {{ else }}
10 <img src="{{ .Params.image }}" class="post_image">
11 {{ end }}
12</div>
13</article>
blog
一覧では、記事のタイトル、説明文を表示していたが、work
では画像のみを表示している。- 本サイトではwork記事の.mdファイルフロントマターに、
image
とlandscape
を設定するようにしている。 - 記事のフロントマターは、
.Params.image
のようにすることでアクセスできる。 - 上記のようにすることで、記事のフロントマターで設定した画像が記事一覧に表示される。
public フォルダの出力例
public
└──work
├── index.html
└── index.xml