組み込みのサイトマップでは単一ページ以外にもカテゴリーやタグの一覧、アーカイブページなどが含まれてしまうけど、今のところこのブログで含める必要性を感じない……そんなに価値があるコンテンツだろうか?

となったのでサイトマップテンプレートをカスタマイズすることにしました。

sitemap.xml を上書きする

Sitemap Templates | Hugo

To override the built-in sitemap.xml template, create a new file in either of these locations:

  • layouts/sitemap.xml
  • layouts/_default/sitemap.xml

とあるので、sitemap.xmllayouts/_default/ の下に作ります。すると、組み込みのサイトマップではなく作成したテンプレートでサイトマップを生成してくれます。

組み込みのサイトマップテンプレートは hugo/sitemap.xml にあるので、sitemap.xmlにとりあえずコピー。

サイトマップから除外する条件を追加

4行目にある{{ range .Data.Pages }}の後に条件を追加します。

{{ range .Data.Pages }}{{ if and (ne .Kind "taxonomy") (ne .Kind "term") (ne .Params.sitemap_ignore true) }}

Page Kinds については Section Page Templates | Hugoに説明があった。

  • taxonomy
  • term
  • frontmatter でsitemap_ignore: true を指定したページ

以上を除外するようにした。

そして23行目の反複処理が終わる{{ end }}{{ end }}{{ end }}にしてif文終了。

完成

{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  {{ range .Data.Pages }}{{ if and (ne .Kind "taxonomy") (ne .Kind "term") (ne .Params.sitemap_ignore true) }}
    {{- if .Permalink -}}
  <url>
    <loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
    <lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
    <changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
    <priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
    <xhtml:link
                rel="alternate"
                hreflang="{{ .Language.Lang }}"
                href="{{ .Permalink }}"
                />{{ end }}
    <xhtml:link
                rel="alternate"
                hreflang="{{ .Language.Lang }}"
                href="{{ .Permalink }}"
                />{{ end }}
  </url>
    {{- end -}}
  {{ end }}{{ end }}
</urlset>