Hugo Pager.PageGroups 方法详解:对分页集合按分组渲染
Hugo Pager.PageGroups 方法详解对分页集合按分组渲染【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugoPageGroups是 Hugo 中Pager对象提供的方法用于在分页pagination场景下获取当前分页器pager的页面分组page.PagesGroup。它专为「先分组、再分页」的渲染模式设计当你在列表页模板中先用GroupByDate、GroupBy等分组方法对页面集合分组再调用.Paginate分页时每个分页器内保存的不再是扁平页面列表而是PagesGroup分组结构。通过PageGroups你可以直接在模板中遍历分组键如年份、月份与分组内的页面构建出「按年份/月份分块的博客归档页」这类经典布局。读完本文你将掌握PageGroups的返回类型与适用条件、它与Pages方法的互斥关系、与全部分组方法GroupByDate、GroupBy、GroupByParam等的组合用法、底层分页器对分组数据的切分原理以及搭配内置分页导航模板的完整落地示例。方法签名与返回类型PageGroups方法的官方签名定义如下PAGER.PageGroups → page.PagesGroup适用对象分页器对象Pager即调用.Paginate或.Paginator后返回的对象。返回类型page.PagesGroup即一组PageGroup的列表。每个PageGroup由两部分组成——Key分组键通常是年份、月份等和Pages该分组下的页面集合。该类型定义在 resources/page/pagegroup.go 中type PageGroup struct { // The key, typically a year or similar. Key any // The Pages in this group. Pages }从源码结构看Key的类型是any可以承载字符串如日期格式化的Jan 2006、整数、前端参数值等任意分组键Pages直接内嵌了页面集合因此模板中可以沿用Pages上的一切方法如.ByTitle、.Limit等对分组内页面做进一步处理。与 Pages 方法的互斥关系Pager上有两个「二选一」的取数方法Pages与PageGroups。两者不能同时返回非空结果具体行为由底层存储的分页元素类型决定。在 resources/page/pagination.go 的实现中可以看到这段关键逻辑// Pages returns the Pages on this page. // Note: If this return a non-empty result, then PageGroups() will return empty. func (p *Pager) Pages() Pages { ... if pages, ok : p.element().(Pages); ok { return pages } return paginatorEmptyPages } // PageGroups return Page groups for this page. // Note: If this return non-empty result, then Pages() will return empty. func (p *Pager) PageGroups() PagesGroup { ... if groups, ok : p.element().(PagesGroup); ok { return groups } return paginatorEmptyPageGroups }也就是说当你把「普通页面集合」传给.Paginate如.Paginate $pages每个分页器内部元素是Pages切片此时用Pages()取数PageGroups()返回空。当你把「分组结果」传给.Paginate如.Paginate ($pages.GroupByDate Jan 2006)每个分页器内部元素是PagesGroup此时用PageGroups()取数Pages()返回空。另外当分页器没有任何元素时例如对空集合分组后再分页两个方法都会返回预定义的空值paginatorEmptyPages/paginatorEmptyPageGroups模板中的range会安全地跳过不会报错——这一点由 hugolib/paginator_test.go 中的TestPaginatorEmptyPageGroups测试用例对应 Issue 10802验证对空集合执行GroupByPublishDate后再分页len $pag.Pages为 0页面正常渲染。使用前置条件分组方法官方文档明确指出PageGroups需要与任意的分组方法配合使用。Hugo 提供的分组方法全部定义在 resources/page/pagegroup.go 中返回类型统一为PagesGroup方法分组依据签名GroupByDate页面date字段默认取前端元数据中的datePAGES.GroupByDate LAYOUT [SORT]GroupByPublishDate页面publishDate字段PAGES.GroupByPublishDate LAYOUT [SORT]GroupByExpiryDate页面expireDate字段PAGES.GroupByExpiryDate LAYOUT [SORT]GroupByLastmod页面lastmod字段PAGES.GroupByLastmod LAYOUT [SORT]GroupByParam页面指定参数key的值PAGES.GroupByParam KEY [SORT]GroupByParamDate页面参数中的日期值PAGES.GroupByParamDate KEY LAYOUT [SORT]GroupBy页面任意字段或方法的值PAGES.GroupBy KEY [SORT]所有方法都支持可选的排序参数asc、desc、rev、reverse后三者等价于降序。日期类分组的默认顺序是降序最新的在前这一点在groupByDateField的实现中体现除非显式传入asc、rev或reverse否则分组前会先对页面集合执行Reverse()。分组键的本地化对于日期类分组LAYOUT参数使用与time.Format相同的 Go 时间布局字符串如Jan 2006、2006分组键会根据当前站点的语言和地区进行本地化。从 resources/page/pagegroup.go 的源码可以看到格式化器取自当前渲染站点的语言currentSite : firstPage.Site().Current() formatter : langs.GetTimeFormatter(currentSite.Language()) formatted : formatter.Format(date, format)这意味着多语言站点中同一篇内容在不同语言列表页上会得到对应语言的分组键例如英文站点显示January 2026中文站点显示2026年1月。官方示例按月分组的博客归档页PageGroups最典型的使用场景是按时间分组的归档列表。官方文档 PageGroups 给出的完整示例{{ $pages : where site.RegularPages Type posts }} {{ $paginator : .Paginate ($pages.GroupByDate Jan 2006) }} {{ range $paginator.PageGroups }} h2{{ .Key }}/h2 {{ range .Pages }} h3a href{{ .RelPermalink }}{{ .LinkTitle }}/a/h3 {{ end }} {{ end }} {{ partial pagination.html . }}这段模板的执行流程where site.RegularPages Type posts筛选出类型为posts的常规页面构建待分组集合$pages.GroupByDate Jan 2006按「年月」分组得到PagesGroup如Mar 2026、Feb 2026…….Paginate (...)对分组结果进行分页返回分页器对象range $paginator.PageGroups遍历当前分页器的分组外层输出分组键.Key如Mar 2026内层range .Pages输出该分组下的每篇文章标题与链接partial pagination.html .调用 Hugo 内置的分页导航模板渲染上一页/下一页及页码链接。分页器对分组的切分原理把分组结果交给.Paginate后Hugo 是如何按页大小切分分组的关键实现在 resources/page/pagination.go 的splitPageGroups函数中。其策略是先把所有分组「展平」成键值对序列再按页大小切成若干段最后在每段内重建分组结构。func splitPageGroups(pageGroups PagesGroup, size int) []paginatedElement { type keyPage struct { key any page Page } var ( split []paginatedElement flattened []keyPage ) for _, g : range pageGroups { for _, p : range g.Pages { flattened append(flattened, keyPage{g.Key, p}) } } ... }这意味着分页边界可能出现在某个分组内部如果pagerSize 5而某个月份有 8 篇文章那么该月份可能被拆到相邻两个分页器上每个分页器各自持有该月份的部分页面键相同但页面不同。因此分页器上的分组键并不保证完整覆盖该分组的全部页面——这正是按PageGroups逐页渲染时需要注意的行为。展平后的重建逻辑会保持组内页面相对顺序并按页大小重新聚合每遇到新的键值就新建一个PageGroup把后续同键页面追加进去见 resources/page/pagination.go。此外分页器内部的page()方法resources/page/pagination.go也支持从PagesGroup中按全局索引取页面用于计算NumberOfElements等派生数据因此你仍然可以正常使用Pager.NumberOfElements()等方法。多语言项目中的分组键本地化实践将PageGroups与多语言配置结合时分组键会自动跟随当前渲染语言。你可以在项目配置中为每种语言分别设置分页参数官方分页配置说明 configuration/pagination 给出的多语言示例[languages.en] contentDir content/en direction ltr label English locale en-US weight 1 [languages.en.pagination] disableAliases true pagerSize 10 path page [languages.de] contentDir content/de direction ltr label Deutsch locale de-DE weight 2 [languages.de.pagination] disableAliases true pagerSize 20 path blatt配合GroupByDate时不同语言站点会使用各自的地区格式器生成分组键模板无需任何改动即可输出本地化的年份/月份标题。与内置分页导航模板的配合PageGroups只负责渲染「当前页的分组内容」分页导航上一页、下一页、页码列表通常由 Hugo 内置模板partial pagination.html提供它支持两种格式{{ partial pagination.html . }} !-- default 格式 -- {{ partial pagination.html (dict page . format terse) }} !-- terse 格式 --default格式控件与页码槽位更多terse格式占用更少空间适合水平排列的紧凑导航。如需定制可将内置模板源码复制为layouts/_partials/pagination.html后自行修改。如果要完全自研导航也可以组合使用Pager的其他方法详见 methods/pager 下的各方法文档PageNumber()当前页码、TotalPages()总页数、HasPrev()/HasNext()、Prev()/Next()、First()/Last()、URL()分页器 URL等全部在 resources/page/pagination.go 中实现。常见误区与注意事项不要同时使用Pages与PageGroups二者按分页元素的类型互斥。对分组结果分页却调用Pages()或对普通集合分页却调用PageGroups()都会得到空结果。分组后不要在range中重复分页与普通分页一样同一列表页上首次调用分页方法的结果会被缓存重复调用不会按预期重新执行这是 Hugo 分页最常见的模板错误详见 templates/pagination 的缓存说明。分组键跨页拆分如前文源码分析所述当某分组元素数超过每页容量时该组可能被拆分到多个分页器每个分页器只包含该组的子集渲染时按当前分页器所见为准。空集合安全对空页面集合分组后再分页不会报错PageGroups()返回空分组range自然跳过参考测试 hugolib/paginator_test.go。分组键类型GroupBy/GroupByParam的键可以是任意类型字符串、整数等而日期类分组的键是本地化后的字符串模板中输出.Key时请按实际类型处理。小结PageGroups是 Hugo 分页体系中连接「分组」与「分页」两个特性的桥梁。它让你能够先按日期、参数或任意字段把文章集合组织成分组再对分组结果分页最终在每个分页器内按「分组键 → 分组内页面」的两级结构渲染内容。其底层实现resources/page/pagination.go 与 resources/page/pagegroup.go清晰展示了PagesGroup的类型结构、分页切分算法与空值安全策略。掌握了PageGroups你就能轻松实现博客按月归档、按标签分类的无限分页列表等常见实战布局。【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

npm 无法识别为 cmdlet?一文搞定 PATH 环境变量与 PowerShell 执行策略

npm 无法识别为 cmdlet?一文搞定 PATH 环境变量与 PowerShell 执行策略

1. 这个报错到底在说什么如果你刚装完 Node.js,兴冲冲打开终端敲下npm -v,结果迎面撞上一句红字:npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称,别慌,这不是你电脑坏了,也不是 No…

2026/9/20 20:47:24 阅读更多 →
电脑屏幕黑边怎么消除?分辨率、显卡缩放与驱动排查全攻略

电脑屏幕黑边怎么消除?分辨率、显卡缩放与驱动排查全攻略

电脑屏幕有黑边、画面撑不满,这几乎是每个折腾过显示器的人都遇到过的事。我第一次碰到是在给一台老台式机换了个 24 寸显示器之后,系统里分辨率明明写着 1920x1080,可屏幕左右两侧硬是各留了一条两指宽的黑边,看着特别别扭。当时…

2026/9/20 23:49:25 阅读更多 →
PTP协议故障诊断全攻略:从状态机到时延测量的排查路径

PTP协议故障诊断全攻略:从状态机到时延测量的排查路径

PTP协议精讲(3.13):故障处理与诊断——PTP的“健康卫士”做网络时间同步这一行,最怕的不是配置复杂,而是故障藏得深。PTP协议本身设计得很精巧,收敛也快,但一旦出了问题,排查起来比普…

2026/9/21 18:20:45 阅读更多 →

最新新闻

拒绝硬画:3步搞定初等函数图像渲染,性能提升5倍

拒绝硬画:3步搞定初等函数图像渲染,性能提升5倍

拒绝硬画:3步搞定初等函数图像渲染,性能提升5倍 官方文档里那些关于绘图库的API描述,动辄几十页,全是参数定义和数学公式,看完脑子还是浆糊。很多做数据可视化或者工程模拟的同行,一遇到 初等函数图像…

2026/9/21 23:49:35 阅读更多 →
告别只会背概念,这份蜡烛图保姆级教程带你搞定底层逻辑

告别只会背概念,这份蜡烛图保姆级教程带你搞定底层逻辑

告别只会背概念,这份蜡烛图保姆级教程带你搞定底层逻辑 看了一堆教程还是不会写项目?别急,问题往往出在你只记住了“长上影线是阻力”这种死板结论,却没搞懂K线背后的数据构成。今天这篇保姆级教程,不整虚的,直接拆解蜡烛图的底层原理,让你从代码层面…

2026/9/21 23:49:35 阅读更多 →
2016年2月日历图解原理:3个代码坑让你加班到凌晨

2016年2月日历图解原理:3个代码坑让你加班到凌晨

2016年2月日历图解原理:3个代码坑让你加班到凌晨 别再翻那几百页的官方文档了,抓不住重点就干瞪眼。今天用 图解原理 把2016年2月日历里的代码坑给你扒干净。…

2026/9/21 23:49:35 阅读更多 →
怎么学粤语入门到精通:解决版本升级后API全变了的性能优化实战

怎么学粤语入门到精通:解决版本升级后API全变了的性能优化实战

怎么学粤语入门到精通:解决版本升级后API全变了的性能优化实战 刚接手一个遗留的粤语语音识别模块,版本一升级,旧API全报404,接口文档里连个影子都找不到。这种“版本升级后 API…

2026/9/21 23:49:35 阅读更多 →
2012韦博英语价格表最佳实践与运维开发实战指南

2012韦博英语价格表最佳实践与运维开发实战指南

2012韦博英语价格表最佳实践与运维开发实战指南 很多刚入行的朋友,手里攥着几本语法书,背得滚瓜烂熟,一打开 IDE 就傻眼。不知道项目怎么搭,目录结构怎么理,更别提把代码跑起来变成真东西。这就是典型的“学会语法却不知怎么搭项目”。别慌,今…

2026/9/21 23:49:35 阅读更多 →
如何制作微信推送源码解析:3步搞定跑不通的代码

如何制作微信推送源码解析:3步搞定跑不通的代码

如何制作微信推送源码解析:3步搞定跑不通的代码 复制来的代码跑不通,是不是让你抓狂?报错信息像天书,调试半天没头绪。别急,今天咱们直接扒开【如何制作微信推送】的底层逻辑,用源码解析帮你理清思路。 一句话原理:回调机制与签名校验…

2026/9/21 23:48:35 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →