HUGO 中文文档

  • 新闻
  • 文档
  • 主题
  • 社区
  • GitHub
gohugoio Star
  • 关于
    • 本节内容
    • 简介
    • 特性
    • 隐私
    • 安全
    • 许可证
  • 安装
    • 本节内容
    • macOS
    • Linux
    • Windows
    • BSD
  • 快速上手
    • 本节内容
    • 快速入门
    • 基本用法
    • 目录结构
    • 配置
    • 配置标记
    • 术语表
    • 配置构建
    • 外部学习资源
  • 快速参考
    • 本节内容
    • 表情符号
    • 函数
    • 方法
    • 页面集合
  • 内容管理
    • 本节内容
    • 组织
    • 页面包
    • 内容格式
    • Front matter (前置 matter)
    • 构建选项
    • 页面资源
    • 图片处理
    • 短代码
    • 相关内容
    • 章节
    • 内容类型
    • 原型
    • 分类法
    • 摘要
    • 链接和交叉引用
    • URL 管理
    • 菜单
    • 评论
    • 多语言
    • Markdown 属性
    • 语法高亮
    • 图表
    • 数学公式
    • 数据源
    • 内容适配器
  • 模板
    • 本节内容
    • 简介
    • 模板类型
    • 查找顺序
    • 基模板
    • 首页模板
    • 单个模板
    • 章节模板
    • 分类模板
    • 术语模板
    • 局部模板
    • 内容视图模板
    • 短代码模板
    • 站点地图模板
    • RSS 模板
    • 404 模板
    • robots.txt 模板
    • 菜单
    • 分页
    • 内嵌模板
    • 自定义输出格式
  • 函数
    • 本节内容
    • css
    • fmt
    • go 模板
    • hugo
    • js
    • lang
    • openapi3
    • os
    • urls
    • 全局
    • 加密
    • 反射
    • 变形
    • 变换
    • 哈希
    • 图像
    • 图表函数
    • 字符串
    • 安全函数
    • 局部模板函数
    • 数学
    • 数据
    • 时间
    • 模板
    • 比较
    • 类型转换
    • 编码
    • 调试
    • 资源
    • 路径
    • 集合
  • 方法
    • 本节内容
    • Duration
    • Menu
    • Page
    • Pager
    • Resource
    • Shortcode
    • Site
    • Taxonomy
    • Time
    • 菜单项
    • 页面
  • 渲染钩子
    • 本节内容
    • 简介
    • 块引用
    • 代码块
    • 标题
    • Images
    • 链接
    • Passthrough
    • 表格
  • Hugo 模块
    • 本节内容
    • 配置 Hugo 模块
    • 使用 Hugo 模块
    • 主题组件
  • Hugo 管道
    • 本节内容
    • 简介
    • 将 Sass 编译为 CSS
    • PostCSS
    • PostProcess
    • JavaScript 构建
    • 资源压缩
    • 连接资产
    • 指纹和 SRI 哈希
    • 从字符串创建资源
    • 从模板创建资源
  • 命令行界面
  • 故障排除
    • 本节内容
    • Audit
    • 日志记录
    • 检查
    • 弃用
    • 性能
    • FAQs
  • 开发者工具
    • 本节内容
    • 编辑器插件
    • 前端
    • Search
    • 迁移
    • 其他项目
  • 托管和部署
    • 本节内容
    • Hugo 部署
    • 使用 Rclone 部署
    • 使用 Rsync 部署
    • 在 21YunBox 上托管
    • 在 AWS Amplify 上托管
    • 在 Cloudflare Pages 上托管
    • 在 Firebase 上托管
    • 在 GitLab Pages 上托管
    • 在 Netlify 上托管
    • 在 Render 上托管
    • 托管在 Azure 静态 Web 应用上
    • 托管在 GitHub Pages 上
    • 托管在 KeyCDN 上
  • 贡献
    • 本节内容
    • 开发
    • 文档
    • 主题
  • 维护
CONTENT MANAGEMENT

内容适配器

创建内容适配器,以便在构建站点时动态添加内容。
New in v0.126.0

概述

内容适配器是一个模板,它在构建站点时动态创建页面。例如,可以使用内容适配器从远程数据源(例如 JSON、TOML、YAML 或 XML)创建页面。

与位于 layouts 目录中的模板不同,内容适配器位于 content 目录中,每个目录每个语言最多只有一个。当内容适配器创建页面时,页面的 逻辑路径 将相对于内容适配器。

content/
├── articles/
│   ├── _index.md
│   ├── article-1.md
│   └── article-2.md
├── books/
│   ├── _content.gotmpl  <-- 内容适配器
│   └── _index.md
└── films/
    ├── _content.gotmpl  <-- 内容适配器
    └── _index.md

每个内容适配器都命名为 _content.gotmpl,并使用与 layouts 目录中模板相同的 语法 。您可以在内容适配器中使用任何 模板函数 ,以及下面描述的方法。

方法

在内容适配器中使用这些方法。

AddPage

向站点添加页面。

content/books/_content.gotmpl
{{ $content := dict
  "mediaType" "text/markdown"
  "value" "《巴黎圣母院》是维克多·雨果所著。"
}}
{{ $page := dict
  "content" $content
  "kind" "page"
  "path" "the-hunchback-of-notre-dame"
  "title" "巴黎圣母院"
}}
{{ .AddPage $page }}
AddResource

向站点添加页面资源。

content/books/_content.gotmpl
{{ with resources.Get "images/a.jpg" }}
  {{ $content := dict
    "mediaType" .MediaType.Type
    "value" .
  }}
  {{ $resource := dict
    "content" $content
    "path" "the-hunchback-of-notre-dame/cover.jpg"
  }}
  {{ $.AddResource $resource }}
{{ end }}

然后使用类似以下内容检索新的页面资源:

layouts/_default/single.html
{{ with .Resources.Get "cover.jpg" }}
  <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}" alt="">
{{ end }}
Site

返回将向其添加页面的 Site 。

content/books/_content.gotmpl
{{ .Site.Title }}

请注意,从内容适配器调用时,返回的 Site 尚未完全构建;如果您尝试调用依赖于页面的方法,例如 .Site.Pages ,您将收到一条错误消息,提示“此方法不能在站点完全初始化之前调用”。

Store

返回一个持久性“备忘录”,用于存储和操作数据。这主要用于在设置 EnableAllLanguages 时在执行之间传输值。请参阅 示例 。

content/books/_content.gotmpl
{{ .Store.Set "key" "value" }}
{{ .Store.Get "key" }}
EnableAllLanguages

默认情况下,Hugo 会为 _content.gotmpl 文件定义的语言执行内容适配器。使用此方法可以为所有语言激活内容适配器。

content/books/_content.gotmpl
{{ .EnableAllLanguages }}
{{ $content := dict
  "mediaType" "text/markdown"
  "value" "《巴黎圣母院》是维克多·雨果所著。"
}}
{{ $page := dict
  "content" $content
  "kind" "page"
  "path" "the-hunchback-of-notre-dame"
  "title" "巴黎圣母院"
}}
{{ .AddPage $page }}

页面映射

在传递给 AddPage 方法的映射中设置任何 前题字段 ,不包括 markup 。无需设置 markup 字段,请按如下所述指定 content.mediaType 。

此表描述了最常传递给 AddPage 方法的字段。

键 描述 必填
content.mediaType 内容 媒体类型 。默认为 text/markdown 。请参阅 内容格式 获取示例。  
content.value 内容值(字符串)。  
dates.date 页面创建日期( time.Time 值)。  
dates.expiryDate 页面过期日期( time.Time 值)。  
dates.lastmod 页面上次修改日期( time.Time 值)。  
dates.publishDate 页面发布日期( time.Time 值)。  
kind 页面类型 。默认为 page 。  
params 页面参数映射。  
path 页面相对于内容适配器的 逻辑路径 。不要包含前导斜杠或文件扩展名。 ✔️
title 页面标题。  

虽然 path 是唯一必填字段,但我们也建议设置 title 。

设置 path 时,Hugo 会将给定的字符串转换为逻辑路径。例如,将 path 设置为 A B C 会生成 /section/a-b-c 的逻辑路径。

资源映射

使用以下字段构造传递给 AddResource 方法的映射。

键 描述 必填
content.mediaType 内容 媒体类型 。 ✔️
content.value 内容值(字符串或资源)。 ✔️
name 资源名称。  
params 资源参数映射。  
path 资源相对于内容适配器的 逻辑路径 。不要包含前导斜杠。 ✔️
title 资源标题。  

如果 content.value 是字符串,Hugo 将创建一个新资源。如果 content.value 是资源,Hugo 将从现有资源中获取值。

设置 path 时,Hugo 会将给定的字符串转换为逻辑路径。例如,将 path 设置为 A B C/cover.jpg 会生成 /section/a-b-c/cover.jpg 的逻辑路径。

示例

从远程数据创建页面,其中每个页面代表一篇书评。

步骤 1
创建内容结构。
content/
└── books/
    ├── _content.gotmpl  <-- 内容适配器
    └── _index.md
步骤 2
检查远程数据以确定如何将键值对映射到前题字段。

https://gohugo.io/shared/examples/data/books.json

步骤 3
创建内容适配器。
content/books/_content.gotmpl
{{/* 获取远程数据。 */}}
{{ $data := dict }}
{{ $url := "https://gohugo.io/shared/examples/data/books.json" }}
{{ with resources.GetRemote $url }}
  {{ with .Err }}
    {{ errorf "无法获取远程资源 %s: %s" $url . }}
  {{ else }}
    {{ $data = . | transform.Unmarshal }}
  {{ end }}
{{ else }}
  {{ errorf "无法获取远程资源 %s" $url }}
{{ end }}

{{/* 添加页面和页面资源。 */}}
{{ range $data }}

  {{/* 添加页面。 */}}
  {{ $content := dict "mediaType" "text/markdown" "value" .summary }}
  {{ $dates := dict "date" (time.AsTime .date) }}
  {{ $params := dict "author" .author "isbn" .isbn "rating" .rating "tags" .tags }}
  {{ $page := dict
    "content" $content
    "dates" $dates
    "kind" "page"
    "params" $params
    "path" .title
    "title" .title
  }}
  {{ $.AddPage $page }}

  {{/* 添加页面资源。 */}}
  {{ $item := . }}
  {{ with $url := $item.cover }}
    {{ with resources.GetRemote $url }}
      {{ with .Err }}
        {{ errorf "无法获取远程资源 %s: %s" $url . }}
      {{ else }}
        {{ $content := dict "mediaType" .MediaType.Type "value" .Content }}
        {{ $params := dict "alt" $item.title }}
        {{ $resource := dict
          "content" $content
          "params" $params
          "path" (printf "%s/cover.%s" $item.title .MediaType.SubType)
        }}
        {{ $.AddResource $resource }}
      {{ end }}
    {{ else }}
      {{ errorf "无法获取远程资源 %s" $url }}
    {{ end }}
  {{ end }}

{{ end }}
步骤 4
创建一个单个模板来呈现每篇书评。
layouts/books/single.html
{{ define "main" }}
  <h1>{{ .Title }}</h1>

  {{ with .Resources.GetMatch "cover.*" }}
    <img src="{{ .RelPermalink }}" width="{{ .Width }}" height="{{ .Height }}" alt="{{ .Params.alt }}">
  {{ end }}

  <p>作者:{{ .Params.author }}</p>

  <p>
    ISBN:{{ .Params.isbn }}<br>
    评分:{{ .Params.rating }}<br>
    评论日期:{{ .Date | time.Format ":date_long" }}
  </p>

  {{ with .GetTerms "tags" }}
    <p>标签:</p>
    <ul>
      {{ range . }}
        <li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
      {{ end }}
    </ul>
  {{ end }}

  {{ .Content }}
{{ end }}

多语言站点

使用多语言站点,您可以:

  1. 使用上面描述的 EnableAllLanguages 方法为所有语言创建一个内容适配器。
  2. 创建特定于每种语言的内容适配器。请参见下面的示例。

按文件名进行翻译

使用此站点配置:

hugo.
     
languages:
  de:
    weight: 2
  en:
    weight: 1
[languages]
  [languages.de]
    weight = 2
  [languages.en]
    weight = 1
{
   "languages": {
      "de": {
         "weight": 2
      },
      "en": {
         "weight": 1
      }
   }
}

在内容适配器的文件名中包含语言指示符。

content/
└── books/
    ├── _content.de.gotmpl
    ├── _content.en.gotmpl
    ├── _index.de.md
    └── _index.en.md

按内容目录进行翻译

使用此站点配置:

hugo.
     
languages:
  de:
    contentDir: content/de
    weight: 2
  en:
    contentDir: content/en
    weight: 1
[languages]
  [languages.de]
    contentDir = 'content/de'
    weight = 2
  [languages.en]
    contentDir = 'content/en'
    weight = 1
{
   "languages": {
      "de": {
         "contentDir": "content/de",
         "weight": 2
      },
      "en": {
         "contentDir": "content/en",
         "weight": 1
      }
   }
}

在每个目录中创建一个内容适配器:

content/
├── de/
│   └── books/
│       ├── _content.gotmpl
│       └── _index.md
└── en/
    └── books/
        ├── _content.gotmpl
        └── _index.md

页面冲突

当两个或多个页面的发布路径相同时,就会发生页面冲突。由于并发性,已发布页面的内容是不确定的。考虑以下示例:

content/
└── books/
    ├── _content.gotmpl  <-- 内容适配器
    ├── _index.md
    └── the-hunchback-of-notre-dame.md

如果内容适配器也创建 books/the-hunchback-of-notre-dame,则已发布页面的内容是不确定的。您无法定义处理顺序。

要检测页面冲突,请在构建站点时使用 --printPathWarnings 标志。

See also

  • Front matter (前置 matter)
  • Passthrough
  • 备选输出格式
  • 站点地图
  • 菜单

On this page

  • 概述
  • 方法
  • 页面映射
  • 资源映射
  • 示例
  • 多语言站点
  • 页面冲突
Last updated: January 10, 2025: 添加 gtm 谷歌代码管理 (6220bf5)
Improve this page
By the Hugo Authors
Hugo Logo
  • File an Issue
  • Get Help
  • @GoHugoIO
  • @spf13
  • @bepsays
 

Hugo Sponsors

Your Company?
 

The Hugo logos are copyright © Steve Francia 2013–2025.

The Hugo Gopher is based on an original work by Renée French.

  • 新闻
  • 文档
  • 主题
  • 社区
  • GitHub
  • 关于
  • 安装
  • 快速上手
  • 快速参考
  • 内容管理
  • 模板
  • 函数
  • 方法
  • 渲染钩子
  • Hugo 模块
  • Hugo 管道
  • 命令行界面
  • 故障排除
  • 开发者工具
  • 托管和部署
  • 贡献
  • 维护