Hugo首页代码重复渲染同一分区内容问题排查
问题原因及解决办法
问题根源
你遇到的问题是因为Hugo的.Paginate方法会修改当前页面的全局分页状态:第一次调用.Paginate $post_pages后,页面的Paginator变量被设置为posts的分页对象;第二次调用.Paginate $project_pages时,Hugo会复用这个已有的分页状态,导致结果不符合预期。调换代码顺序后,全局状态被第二个分区覆盖,所以两个区块都显示第二个分区的内容。
解决方法
方法1:直接展示固定数量的条目(无需分页)
如果首页不需要给两个分区单独做分页,直接取前N条内容即可,避免调用.Paginate:
{{ define "main" }} <div class="homepage-content"> {{ .Content }} </div> <h1>Blog Posts:</h1> <div class="articles"> {{ $post_pages := where (where site.RegularPages "Section" "posts") "Params.hidden" "!=" true }} {{ range first 5 $post_pages }} <!-- 取前5条,可按需修改数量 --> {{ partial "post-summary.html" . }} {{ end }} </div> <h1>Projects:</h1> <div class="articles"> {{ $project_pages := where (where site.RegularPages "Section" "projects") "Params.hidden" "!=" true }} {{ range first 5 $project_pages }} {{ partial "post-summary.html" . }} {{ end }} </div> {{ end }}
注:用site.RegularPages代替site.Pages更准确,因为它只包含常规内容页面(排除首页、分类页等);同时用Section判断比Type更直接对应content下的文件夹。
方法2:使用独立分页对象(保留分页功能)
如果需要给两个分区单独做分页,要用Hugo的paginate函数(小写,不是方法)生成独立的分页对象,避免修改全局状态:
{{ define "main" }} <div class="homepage-content"> {{ .Content }} </div> <h1>Blog Posts:</h1> <div class="articles"> {{ $post_pages := where (where site.RegularPages "Section" "posts") "Params.hidden" "!=" true }} {{ $post_paginator := paginate $post_pages }} <!-- 生成独立的分页对象 --> {{ range $post_paginator.Pages }} {{ partial "post-summary.html" . }} {{ end }} {{ partial "pagination.html" $post_paginator }} <!-- 传入独立分页对象 --> </div> <h1>Projects:</h1> <div class="articles"> {{ $project_pages := where (where site.RegularPages "Section" "projects") "Params.hidden" "!=" true }} {{ $project_paginator := paginate $project_pages }} {{ range $project_paginator.Pages }} {{ partial "post-summary.html" . }} {{ end }} {{ partial "pagination.html" $project_paginator }} </div> {{ end }}
需要同步修改pagination.html,让它支持接收传入的分页对象参数:
<!-- 修改pagination.html --> {{ $paginator := . }} <!-- 原分页逻辑不变,将所有.Paginator替换为$paginator即可 -->
额外优化建议
- 可以把重复的筛选逻辑抽成局部模板或全局变量,减少代码冗余
params里的mainSections设置不影响当前问题的核心逻辑,无需调整
内容的提问来源于stack exchange,提问作者Hayden
相关产品推荐
相关产品推荐

