Use partials in your templates #
All partials for your Hugo project are located in a single layouts/partials
directory. For better organization, you can create multiple subdirectories within partials
as well:
layouts/
└── partials/
├── footer/
│ ├── scripts.html
│ └── site-footer.html
├── head/
│ ├── favicons.html
│ ├── metadata.html
│ └── prerender.html
└── header/
├── site-header.html
└── site-nav.html
All partials are called within your templates using the following pattern:
{{ partial "<PATH>/<PARTIAL>.html" . }}
As shown in the above example directory structure, you can nest your directories within partials
for better source organization. You only need to call the nested partial’s path relative to the partials
directory:
{{ partial "header/site-header.html" . }}
{{ partial "footer/scripts.html" . }}
Variable scoping #
The second argument in a partial call is the variable being passed down. The above examples are passing the .
, which tells the template receiving the partial to apply the current [context][context].
This means the partial will only be able to access those variables. The partial is isolated and cannot access the outer scope. From within the partial, $.Var
is equivalent to .Var
.
Returning a value from a partial #
In addition to outputting markup, partials can be used to return a value of any type. In order to return a value, a partial must include a lone return
statement at the end of the partial.
Example GetFeatured #
{{/* layouts/partials/GetFeatured.html */}}
{{ return first . (where site.RegularPages "Params.featured" true) }}
{{/* layouts/index.html */}}
{{ range partial "GetFeatured.html" 5 }}
[...]
{{ end }}
Example GetImage #
{{/* layouts/partials/GetImage.html */}}
{{ $image := false }}
{{ with .Params.gallery }}
{{ $image = index . 0 }}
{{ end }}
{{ with .Params.image }}
{{ $image = . }}
{{ end }}
{{ return $image }}
{{/* layouts/_default/single.html */}}
{{ with partial "GetImage.html" . }}
[...]
{{ end }}
Inline partials #
You can also define partials inline in the template. But remember that template namespace is global, so you need to make sure that the names are unique to avoid conflicts.
Value: {{ partial "my-inline-partial.html" . }}
{{ define "partials/my-inline-partial.html" }}
{{ $value := 32 }}
{{ return $value }}
{{ end }}
Cached partials #
The partialCached
template function provides significant performance gains for complex templates that don’t need to be re-rendered on every invocation. See [details][partialcached].
Examples #
header.html
#
The following header.html
partial template is used for
spf13.com:
<!DOCTYPE html>
<html class="no-js" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<head>
<meta charset="utf-8">
{{ partial "meta.html" . }}
<base href="{{ .Site.BaseURL }}">
<title> {{ .Title }} : spf13.com </title>
<link rel="canonical" href="{{ .Permalink }}">
{{ if .RSSLink }}<link href="{{ .RSSLink }}" rel="alternate" type="application/rss+xml" title="{{ .Title }}" />{{ end }}
{{ partial "head_includes.html" . }}
</head>
footer.html
#
The following footer.html
partial template is used for
spf13.com: