Exclude pages of a category from Hugo's sitemap.xml

Hugo automatically generates a sitemap for your site. It ships with a built-in template file observing the v0.9 of the Sitemap Protocol.( Source) It is possible to exclude just certain pages from the sitemap.xml generated by Hugo. You can follow @TacticallyCreative’s suggestion in the Hugo forum, and

This did work pretty well, but I would have had to set all pages of a specific category private: true and none else. So let us adapt the approach to look for a given category. Naturally, the also works for a tag analogously.

Here is my layouts/_default/sitemap.xml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{{ 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 not (in .Params.categories "the family blog") }}
    <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="{{ .Lang }}"
                href="{{ .Permalink }}"
        />{{ end }}
        <xhtml:link
                rel="alternate"
                hreflang="{{ .Lang }}"
                href="{{ .Permalink }}"
        />{{ end }}
    </url>
    {{ end }}{{ end }}
</urlset>

The important bit here is the if not (...) clause in line 4: Only pages not having the category “the family blog” will appear in the sitemap. Beyond that, it is the original template.

Note that from now on, you and I will no longer get updates to that template automatically by Hugo.