Hugo主题多作者功能故障:作者页无法匹配多作者文章
解决Hugo多作者文章在作者页的匹配渲染问题
问题根源
你之前的写法存在两个核心问题:
- 变量被当作字符串字面量:在
if in $postauthors "$.Title"中,你用双引号包裹了$.Title,Hugo会将其视为纯文本字符串"$.Title",而非引用当前页面的标题变量(即实际作者名),因此永远无法匹配到目标作者。 - 未兼容单
author属性:代码仅处理了authors列表类型的属性,没有覆盖使用author单值的文章,导致这类文章无法出现在对应作者页中。
正确实现方案
我们可以统一将所有文章的作者信息转为数组格式,再判断当前作者是否在数组中,同时兼容author和authors两种写法:
方案代码
{{ $currentAuthor := .Title }} {{ range site.RegularPages }} {{/* 初始化作者数组,统一处理单author和多authors */}} {{ $postAuthors := slice }} {{ if isset .Params "author" }} {{ $postAuthors = $postAuthors | append .Params.author }} {{ end }} {{ if isset .Params "authors" }} {{ $postAuthors = $postAuthors | append .Params.authors }} {{ end }} {{/* 扁平化数组并去重,判断当前作者是否在列表中 */}} {{ if in ($postAuthors | flatten | uniq) $currentAuthor }} {{ .Render "post-list" }} {{ end }} {{ end }}
代码说明
- 获取当前作者名:用
$currentAuthor存储当前作者页的标题(即要匹配的作者名称)。 - 统一作者格式:对每篇文章创建空数组
$postAuthors,若文章有author单值则加入数组,有authors列表则追加整个列表。 - 数组处理:
flatten用于处理可能的嵌套数组(避免追加列表时产生多层结构),uniq用于去重(防止同一作者被重复添加)。 - 匹配判断:用
in函数检查当前作者名是否在处理后的作者数组中,匹配成功则渲染文章。
替代简洁写法(使用where过滤器)
如果希望代码更简洁,可以利用Hugo的where函数支持自定义判断逻辑:
{{ $currentAuthor := .Title }} {{ range where site.RegularPages "Params" (func(params) bool) }} {{ $postAuthors := slice }} {{ if isset params "author" }} {{ $postAuthors = $postAuthors | append params.author }} {{ end }} {{ if isset params "authors" }} {{ $postAuthors = $postAuthors | append params.authors }} {{ end }} {{ return in ($postAuthors | flatten) $currentAuthor }} {{ end }} {{ .Render "post-list" }} {{ end }}
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

