]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
tpl/tplimpl: Optionally exclude content from sitemap
authorJoe Mooring <joe.mooring@veriphor.com>
Mon, 1 Apr 2024 22:30:03 +0000 (15:30 -0700)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Tue, 2 Apr 2024 09:21:03 +0000 (11:21 +0200)
Define global inclusion/exclusion in site configuration, and override
via front matter. For example, to exclude a page from the sitemap:

    [sitemap]
    disable = true # default is false

Closes #653
Closes #12282

Co-authored-by: kolappannathan <kolappannathan@users.noreply.github.com>
Co-authored-by: felicianotech <FelicianoTech@gmail.com>
config/commonConfig.go
docs/data/docs.yaml
hugolib/config_test.go
hugolib/sitemap_test.go
tpl/tplimpl/embedded/templates/_default/sitemap.xml
tpl/tplimpl/tplimpl_integration_test.go

index 6ca061093c5e3072f18fdb0b07fec086b8f96981..6ae97c2a18528016ddbc83c46a6189ecf6c94937 100644 (file)
@@ -215,6 +215,8 @@ type SitemapConfig struct {
        Priority float64
        // The sitemap filename.
        Filename string
+       // Whether to disable page inclusion.
+       Disable bool
 }
 
 func DecodeSitemap(prototype SitemapConfig, input map[string]any) (SitemapConfig, error) {
index f9b5731f2b6cf5a048e2027bde068b096c3b5c3c..b522ffbef0c511c7da32774d1902a389364dac47 100644 (file)
@@ -1649,6 +1649,7 @@ config:
       disableInlineCSS: false
   sitemap:
     changeFreq: ""
+    disable: false
     filename: sitemap.xml
     priority: -1
   social: null
@@ -2797,8 +2798,8 @@ tpl:
             {{ $m.Set "Hugo" "Rocks!" }}
             {{ $m.Values | debug.Dump | safeHTML }}
           - |-
-            map[string]interface {}{
-              "Hugo": "Rocks!",
+            {
+              "Hugo": "Rocks!"
             }
       TestDeprecationErr:
         Aliases: null
index 22beea655e8fb6a6de0f8325152706c1a1d927bb..8acf8b36e48046a3ef1ef7f3bf6cc1a13439c5a3 100644 (file)
@@ -490,11 +490,10 @@ name = "menu-theme"
                        got := b.Configs.Base
 
                        if mergeStrategy == "none" {
-                               b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "", Priority: -1, Filename: "sitemap.xml"})
-
+                               b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "", Disable: false, Priority: -1, Filename: "sitemap.xml"})
                                b.AssertFileContent("public/sitemap.xml", "schemas/sitemap")
                        } else {
-                               b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "monthly", Priority: -1, Filename: "sitemap.xml"})
+                               b.Assert(got.Sitemap, qt.DeepEquals, config.SitemapConfig{ChangeFreq: "monthly", Disable: false, Priority: -1, Filename: "sitemap.xml"})
                                b.AssertFileContent("public/sitemap.xml", "<changefreq>monthly</changefreq>")
                        }
                })
index a5a94c67e75763e6e131ea703f68bd7f02c80902..1c2642468a25783e2a5e68a120bb741714c24fd5 100644 (file)
@@ -108,11 +108,12 @@ outputs: [ "html", "amp" ]
 
 func TestParseSitemap(t *testing.T) {
        t.Parallel()
-       expected := config.SitemapConfig{Priority: 3.0, Filename: "doo.xml", ChangeFreq: "3"}
+       expected := config.SitemapConfig{ChangeFreq: "3", Disable: true, Filename: "doo.xml", Priority: 3.0}
        input := map[string]any{
                "changefreq": "3",
-               "priority":   3.0,
+               "disable":    true,
                "filename":   "doo.xml",
+               "priority":   3.0,
                "unknown":    "ignore",
        }
        result, err := config.DecodeSitemap(config.SitemapConfig{}, input)
index b1e4b2d2d14261bdbd008f56fb39cebd98447713..de1f467d13dadfaa719ac18f742432998fc368cf 100644 (file)
@@ -1,7 +1,7 @@
 {{ 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 }}
+  {{ range where .Pages "Sitemap.Disable" "ne" true }}
     {{- if .Permalink -}}
   <url>
     <loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
index abda3af29a0d3db4805e1bac8def36684e9ed1a9..28d442e0d6368e61cab5fbbe640d821f75ff849e 100644 (file)
@@ -254,3 +254,54 @@ disable = false
                `s.src = '//' + "foo" + '.disqus.com/embed.js';`,
        )
 }
+
+func TestSitemap(t *testing.T) {
+       t.Parallel()
+
+       files := `
+-- hugo.toml --
+disableKinds = ['home','rss','section','taxonomy','term']
+[sitemap]
+disable = true
+-- content/p1.md --
+---
+title: p1
+sitemap:
+  p1_disable: foo
+---
+-- content/p2.md --
+---
+title: p2
+
+---
+-- layouts/_default/single.html --
+{{ .Title }}
+`
+
+       // Test A: Exclude all pages via site config.
+       b := hugolib.Test(t, files)
+       b.AssertFileContentExact("public/sitemap.xml",
+               "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n  xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\n  \n</urlset>\n",
+       )
+
+       // Test B: Include all pages via site config.
+       files_b := strings.ReplaceAll(files, "disable = true", "disable = false")
+       b = hugolib.Test(t, files_b)
+       b.AssertFileContentExact("public/sitemap.xml",
+               "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n  xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\n  <url>\n    <loc>/p1/</loc>\n  </url><url>\n    <loc>/p2/</loc>\n  </url>\n</urlset>\n",
+       )
+
+       // Test C: Exclude all pages via site config, but include p1 via front matter.
+       files_c := strings.ReplaceAll(files, "p1_disable: foo", "disable: false")
+       b = hugolib.Test(t, files_c)
+       b.AssertFileContentExact("public/sitemap.xml",
+               "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n  xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\n  <url>\n    <loc>/p1/</loc>\n  </url>\n</urlset>\n",
+       )
+
+       // Test D:  Include all pages via site config, but exclude p1 via front matter.
+       files_d := strings.ReplaceAll(files_b, "p1_disable: foo", "disable: true")
+       b = hugolib.Test(t, files_d)
+       b.AssertFileContentExact("public/sitemap.xml",
+               "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n  xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">\n  <url>\n    <loc>/p2/</loc>\n  </url>\n</urlset>\n",
+       )
+}