ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Hugo 站点方法 Site.Pages 详解:获取当前语言全部页面的集合

Hugo 站点方法 Site.Pages 详解:获取当前语言全部页面的集合 开发工具前端CLI【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址https://gitcode.com/gh_mirrors/hu/hugo点击查看免费下载Site.Pages是 Hugo 模板中用于获取站点页面集合的核心方法它返回当前语言下所有页面包括主页、section 页、taxonomy 页、term 页与常规页面并按照 Hugo 内置的“默认排序规则”排列。本文以 Pages 方法文档 为主线结合 Hugo 源码hugolib/site.go、resources/page/pages_sort.go讲解其行为边界、默认排序规则、与RegularPages的取舍以及排序/分组等实战用法帮助你写出正确、高效的列表模板。方法签名与返回类型Pages是定义在Site对象上的方法模板中通过SITE.Pages调用在页面模板中通常写作.Site.Pages。其返回类型为page.Pages即[]page.Page的切片类型见 resources/page/pages.go可直接用于range遍历也可继续调用排序、筛选、分组等方法链。Front matter 中的元信息如下returnType: page.Pages signatures: [SITE.Pages]在源码层面hugolib/site.go 中的实现如下// Pages returns all pages. // This is for the current language only. func (s *Site) Pages() page.Pages { s.CheckReady() return s.pageMap.getPagesInSection( pageMapQueryPagesInSection{ Path: , KeyPart: global, Include: pagePredicates.ShouldListGlobal.BoolFunc(), Recursive: true, IncludeSelf: true, }, ) }从中可以看出三个关键行为仅限当前语言注释明确写有 “This is for the current language only”多语言站点中它不会跨语言返回页面递归 包含自身Recursive: true表示遍历整个内容树的全部层级IncludeSelf: true表示连“根节点”本身即主页也包含在内由谓词过滤Include使用pagePredicates.ShouldListGlobal只有通过该谓词的页面才会进入结果集。ShouldListGlobal 谓词做了什么ShouldListGlobal定义在 hugolib/content_map_page.go其实现为ShouldListGlobal: func(p *pageState) predicate.Match { return predicate.BoolMatch(p.m.shouldList(true)) },它调用页面元数据上的shouldList(true)来判断页面是否应被“全局列出”。从源码结构可以推断该谓词综合了页面类型、发布状态draft / future / expired、build配置等多项条件——这意味着处于草稿、未发布或已过期状态的页面默认不会出现在.Site.Pages的结果中除非在构建时显式启用对应状态。Site.Pages 到底包含哪些页面根据 Pages 方法文档返回集合包含以下全部页面种类页面种类说明主页home page站点根_index.md对应的页面Section 页面各内容分区如content/books/对应的_index.md页面Taxonomy 页面分类页如标签、类别Term 页面具体的分类条目页常规页面regular pages普通内容页如博客文章换言之Site.Pages是整个站点页面树的扁平化全集按当前语言过滤后而不是某个 section 的子集。如果你只想遍历博客文章这类常规页面官方文档明确指出In most cases you should use theRegularPagesmethod instead.这是因为博客、新闻流等最常见的列表场景只需要“常规页面”而Site.Pages会把主页、section 索引页等结构型页面一并带出需要额外过滤。与 RegularPages / Sections / AllPages 的对比同一组方法都定义在 hugolib/site.go 中方便对照RegularPages 方法文档只返回常规页面且同样按默认排序。其实现hugolib/site.go在ShouldListGlobal基础上额外叠加了KindPage谓词即ShouldListGlobal.And(pagePredicates.KindPage)Sections 方法文档只返回顶级section 页面AllPages见 AllPages 方法文档返回所有语言的页面已在 v0.156.0 中标记为 deprecated官方建议改用其他方式源码中通过hugo.Deprecate打印弃用提示见 hugolib/site.goAllRegularPages返回所有语言的常规页面未弃用。默认排序规则DefaultPageSortSite.Pages返回的集合“按默认排序顺序排列”。什么是默认排序源码 resources/page/pages_sort.go 给出了精确答案// DefaultPageSort is the default sort func for pages in Hugo: // Order by Ordinal, Weight, Date, LinkTitle and then full file path. DefaultPageSort func(p1, p2 Page) bool { o1, o2 : getOrdinals(p1, p2) if o1 ! o2 o1 ! -1 o2 ! -1 { return o1 o2 } // Weight0, as by the weight of the taxonomy entrie in the front matter. w01, w02 : getWeight0s(p1, p2) if w01 ! w02 w01 ! -1 w02 ! -1 { return w01 w02 } // ... 依次比较 Weight、Date、LinkTitle、完整路径 }默认排序的完整优先级注释总结为 “Order by Ordinal, Weight, Date, LinkTitle and then full file path”Ordinal序号页面在内容中的出现顺序两个页面都有明确序号时优先按此比较Weight0taxonomy 条目在 front matter 中的权重Weight权重front matter 中手动指定的weight权重为 0 的页面排在带权重页面之前Date日期按日期倒序新的在前见p1.Date().Unix() p2.Date().Unix()LinkTitle链接标题按LinkTitle使用语言感知的 collator 排序完整文件路径以上都相同时按规范化完整路径排序保证结果确定性。需要特别注意的是由于Site.Pages的默认排序中Date 是关键因子其返回顺序并不等同于目录结构的层级顺序也不保证与你在模板中看到的一致——因此依赖排序结果时最好显式调用排序方法而不是依赖默认行为。模板中的实战用法基础遍历渲染全部页面的标题与链接Pages 方法文档 给出的最小示例{{ range .Site.Pages }} h2a href{{ .RelPermalink }}{{ .LinkTitle }}/a/h2 {{ end }}.RelPermalink页面的相对永久链接.LinkTitle优先取 front matter 中的linkTitle未设置时回退到title。显式排序使用 Pages 的排序方法page.Pages提供了一整套排序方法定义在 resources/page/pages_sort.go常用如下方法行为ByWeight()按 front matterweight升序ByTitle()按标题语言感知 collator排序ByLinkTitle()按链接标题排序ByDate()/ByPublishDate()按日期排序日期字段不同ByExpiryDate()/ByLastmod()按过期日期 / 最后修改时间排序ByLength()按内容长度排序ByLanguage()按语言排序ByParam按自定义 front matter 参数排序Reverse()反转当前顺序Limit(n)只保留前 n 个见 pages_sort.go例如按标题排序输出{{ range .Site.Pages.ByTitle }} h2a href{{ .RelPermalink }}{{ .Title }}/a/h2 {{ end }}取最新 5 篇文章的经典写法RegularPagesByDateLimit{{ range first 5 (where .Site.RegularPages Type posts).ByDate.Reverse }} a href{{ .RelPermalink }}{{ .Title }}/a {{ end }}分组GroupBy 系列方法如果需要按参数、日期等维度分组输出可以使用 resources/page/pagegroup.go 中的GroupBy系列方法例如按年份分组归档{{ range .Site.Pages.GroupByDate 2006 }} h3{{ .Key }}/h3 {{ range .Pages }} a href{{ .RelPermalink }}{{ .Title }}/a {{ end }} {{ end }}GroupByDate、GroupByPublishDate、GroupByLastmod、GroupByParam、GroupByParamDate等方法签名均位于 pagegroup.go均支持传入排序方向asc/desc作为可选参数。最佳实践与常见误区列表页优先用RegularPages博客文章、新闻列表等场景应使用.Site.RegularPages见 RegularPages 方法文档避免混入主页、section 与 taxonomy 页面也避免额外的类型过滤不要依赖默认排序默认排序Ordinal → Weight → Date → LinkTitle → 路径较复杂且日期参与排序建议根据场景显式调用ByTitle、ByDate等方法保证输出可控多语言站点注意作用域.Site.Pages只返回当前语言页面跨语言场景请勿依赖AllPages已废弃见 AllPages 方法文档结果受发布状态影响draft、future、expired 页面默认不会出现在结果中调试时注意检查构建时的--buildDrafts等选项性能Site.Pages是全站级遍历查询Recursive: true在页面量极大的站点中应尽量避免在每次渲染中重复做重排序可考虑在缓存层或 section 范围内缩小数据面。小结Site.Pages是理解 Hugo 页面集合模型的入口它回答“当前语言下站点有哪些页面”返回按默认排序的全量集合。通过结合源码可以确认其行为边界仅当前语言、递归包含全部层级、受发布状态过滤并通过page.Pages丰富的排序与分组方法实现各种列表需求。对于大多数内容列表场景请优先使用RegularPages如需顶级分区导航则可参考 Sections 方法文档。相关实现可进一步阅读 hugolib/site.go 与 resources/page/pages_sort.go。赞分享开发工具前端CLI【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址https://gitcode.com/gh_mirrors/hu/hugo点击查看免费下载相关推荐Hugo 模板中 PAGER.Pages 方法详解分页器当前页页面集合的获取与实战Hugo 模板中 PAGER.Pages 方法详解分页器当前页页面集合的获取与实战 导读 PAGER.Pages 是 Hugo 模板系统中分页Paginat开发工具前端CLIHugo 多语言站点 AllTranslations 方法详解获取全部语言翻译页面并按语言权重排序Hugo 多语言站点 AllTranslations 方法详解获取全部语言翻译页面并按语言权重排序 导读 AllTranslations 是 Hugo 页面开发工具前端CLIHugo Page 方法详解RegularPagesRecursive 递归获取当前 Section 及全部子孙 Section 的常规页面Hugo Page 方法详解RegularPagesRecursive 递归获取当前 Section 及全部子孙 Section 的常规页面 RegularP开发工具前端CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表