global

page

返回当前页面的 Page 对象,在任何上下文中都可访问。

签名
page
返回类型
page.Page

用法

在上下文接收 Page 对象的模板顶层,以下写法等价:

{{ .Params.foo }}
{{ .Page.Params.foo }}
{{ page.Params.foo }}

当上下文里没有 Page 对象时,可以使用全局 page 函数:

{{ page.Params.foo }}

Hugo 几乎总是将 Page 作为数据上下文传给顶层模板(例如 baseof.html)。唯一的例外是多主机(multihost)的 sitemap 模板。这意味着你可以在模板中用 . 访问当前页面。

然而,当模板深度嵌套在局部模板或渲染钩子中时,访问 Page 对象并不总是可行或方便。

使用全局 page 函数可以在任何模板的任何位置访问 Page 对象。

示例

以下示例演示使用全局 page 函数时常见的陷阱。

注意顶层上下文

全局 page 函数访问的是传入顶层模板的 Page 对象。

有这样的内容结构:

content/
├── posts/
│   ├── post-1.md
│   ├── post-2.md
│   └── post-3.md
└── _index.md      <-- title is "My Home Page"

以及 home 模板中的这段代码:

layouts/home.html
{{ range site.Sections }}
  {{ range .Pages }}
    {{ page.Title }}
  {{ end }}
{{ end }}

渲染输出将会是:

My Home Page
My Home Page
My Home Page

在上面的示例中,全局 page 函数访问的是传入 home 模板的 Page 对象,而不是被迭代页面的 Page 对象。

注意缓存

不要在以下位置使用全局 page 函数:

  • 短代码
  • 由短代码调用的局部模板
  • 被 partialCached 函数缓存的局部模板

Hugo 会缓存渲染后的短代码。如果在短代码中使用全局 page 函数,而页面内容要在两个或更多模板中渲染,那么缓存的短代码可能是不正确的。

看看这个 section 模板:

layouts/section.html
{{ range .Pages }}
  <h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
  {{ .Summary }}
{{ end }}

当你调用 Summary 方法时,Hugo 会渲染页面内容,其中包括短代码。此时,在短代码内部,全局 page 函数访问的是 section 页面的 Page 对象,而不是内容页面的。

如果 Hugo 先渲染 section 页面再渲染内容页面,缓存的已渲染短代码就会不正确。由于并发的原因,你无法控制渲染顺序。