From 3dff7c8c7a04a413437f2f09e3a1252ae6f1be92 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 25 Feb 2026 17:35:20 +0100 Subject: [PATCH] Fix menu pageRef resolution in multidimensional setups Fixes #14566 --- hugolib/menu_test.go | 34 ++++++++++++++++++++++++++++++++++ hugolib/site.go | 8 ++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/hugolib/menu_test.go b/hugolib/menu_test.go index 2b9e5d9fb..20d862caa 100644 --- a/hugolib/menu_test.go +++ b/hugolib/menu_test.go @@ -604,6 +604,40 @@ title: p3 b.AssertFileContent("public/index.html", `p2s1`) } +// Issue 14566 +func TestMenusPageRefSitesMatrix(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +baseURL = "http://example.com/" +defaultContentVersionInSubdir = true +[versions] +[versions.v1] +[versions.v2] + +[[menus.main]] +name = "Home" +pageRef = "/" +weight = 1 + +-- layouts/home.html -- +{{ range .Site.Menus.main }} +{{ .Name }}|{{ .URL }}|{{ .Page.Path }}|{{ .Page.Site.Version.Name }} +{{ end }} +` + + b := Test(t, files) + + b.AssertFileContent("public/v1/index.html", ` +Home|/v1/|/|v1 +`) + + b.AssertFileContent("public/v2/index.html", ` +Home|/v2/|/|v2 +`) +} + // Issue 13161 func TestMenuNameAndTitleFallback(t *testing.T) { t.Parallel() diff --git a/hugolib/site.go b/hugolib/site.go index 94e4cf566..07fe41d2a 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1403,8 +1403,12 @@ func (s *Site) assembleMenus() (navigation.Menus, error) { // add menu entries from config to flat hash for name, menu := range s.conf.Menus.Config { - for _, me := range menu { - if types.IsNil(me.Page) && me.PageRef != "" { + for _, x := range menu { + // Shallow copy the menu entry, so we can set the URL and page without modifying the config. + c := *x + me := &c + + if me.PageRef != "" { // Try to resolve the page. me.Page, _ = s.getPage(nil, me.PageRef) } -- 2.39.5