各セクションの記事数を取得します。固定ページ扱いのセクションを対象外にした集計方法も紹介します。
2021年2月15日
カテゴリー別の記事数を取得する
このブログではサイドバーに各カテゴリーに属する記事の数を表示しています。 この記事数をどのように取得しているかの解説です。
カテゴリー分けは「セクション」で行なっていますので、各セクションに所属する記事数をカウントすれば良いことになります。
コード
<ul>
{{- $except := slice "AAA" "BBB" }}
{{- range where .Site.Sections "Section" "not in" $except }}
<li>
<a href="/{{ .Section }}">
{{.Section }}
<span>
{{ len (where .Site.RegularPages "Section" "==" .Section ) }}
</span>
</a>
</li>
{{- end }}
</ul>
range
で.Site.Sections
を回します。
サイトにあるセクションが順番に.Section
に格納され、{{ range }} ~ {{ end }}
までが実行されます。
記事数をカウントしているのがlen
で、現在.Section
に入っているセクションと同じセクションの記事の数を取得しています。
特定のセクションを除きたい
例えば、固定ページとして作った「about」をこの集計作業から除きたい場合は、
{{- range where .Site.Sections "Section" "ne" "about" }}
のように、ne
(not equal)で除外してやることができます。これは、!=
でも同様に動作します。
複数のセクションを除きたい
除外したいセクションが複数ある場合は、not in
を使います。
true if a given field value isn’t included in a matching value; a matching value must be an array or a slice
参考:where | hugo
Hugoには、新しくスライス(配列)を定義する構文は用意されていないようなので、ひと手間加えてやる必要があります。
スライス(配列)を戻り値として返す「slice関数」を使用してスライス(配列)つくってから、それをnot in
に渡します。
{{- $except := slice "AAA" "BBB" }}
{{- range where .Site.Sections "Section" "not in" $except }}
この例では、「AAA」と「BBB」の2つのセクションが記事数集計から除外されることになります。