1. プログラミング
  2. Hugo

【Hugo】セクションごとの記事数を集計する

各セクションの記事数を取得します。固定ページ扱いのセクションを対象外にした集計方法も紹介します。


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を使います。

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つのセクションが記事数集計から除外されることになります。

プログラミングの最新記事

  1. 一方向ハッシュ関数

  2. 暗号技術

  3. web3の流れに追いつこう

  4. WordPress開発環境

  5. 【Hugo】マークダウンファイルの中にHTMLコードを挿入する

PAGE TOP