2019-10-21 04:22:28 -04:00
---
title: Menus
2023-05-22 10:43:12 -04:00
description: Create menus by defining entries, localizing each entry, and rendering the resulting data structure.
2019-10-21 04:22:28 -04:00
categories: [content management]
keywords: [menus]
menu:
docs:
2022-11-17 10:14:29 -05:00
parent: content-management
weight: 190
2019-10-21 04:22:28 -04:00
toc: true
2022-11-17 10:14:29 -05:00
weight: 190
aliases: [/extras/menus/]
2019-10-21 04:22:28 -04:00
---
2023-05-22 10:43:12 -04:00
## Overview
To create a menu for your site:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
1. Define the menu entries
2. [Localize] each entry
3. Render the menu with a [template]
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
Create multiple menus, either flat or nested. For example, create a main menu for the header, and a separate menu for the footer.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
There are three ways to define menu entries:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
1. Automatically
1. In front matter
1. In site configuration
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{% note %}}
Although you can use these methods in combination when defining a menu, the menu will be easier to conceptualize and maintain if you use one method throughout the site.
2019-10-21 04:22:28 -04:00
{{% /note %}}
2023-05-22 10:43:12 -04:00
## Define automatically
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
To automatically define menu entries for each top-level section of your site, enable the section pages menu in your site configuration.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "config" copy = false > }}
sectionPagesMenu = "main"
{{< / code-toggle > }}
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
This creates a menu structure that you can access with `site.Menus.main` in your templates. See [menu templates] for details.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
## Define in front matter
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
To add a page to the "main" menu:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "content/about.md" copy = false fm = true > }}
title = 'About'
menu = 'main'
2021-12-08 02:42:31 -05:00
{{< / code-toggle > }}
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
Access the entry with `site.Menus.main` in your templates. See [menu templates] for details.
To add a page to the "main" and "footer" menus:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "content/contact.md" copy = false fm = true > }}
title = 'Contact'
menu = ['main','footer']
2021-12-08 02:42:31 -05:00
{{< / code-toggle > }}
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
Access the entry with `site.Menus.main` and `site.Menus.footer` in your templates. See [menu templates] for details.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
### Properties {#properties-front-matter}
Use these properties when defining menu entries in front matter:
identifier
: (`string`) Required when two or more menu entries have the same `name` , or when localizing the `name` using translation tables. Must start with a letter, followed by letters, digits, or underscores.
name
: (`string`) The text to display when rendering the menu entry.
params
: (`map`) User-defined properties for the menu entry.
parent
: (`string`) The `identifier` of the parent menu entry. If `identifier` is not defined, use `name` . Required for child entries in a nested menu.
post
: (`string`) The HTML to append when rendering the menu entry.
pre
: (`string`) The HTML to prepend when rendering the menu entry.
title
: (`string`) The HTML `title` attribute of the rendered menu entry.
weight
: (`int`) A non-zero integer indicating the entry's position relative the root of the menu, or to its parent for a child entry. Lighter entries float to the top, while heavier entries sink to the bottom.
### Example {#example-front-matter}
This front matter menu entry demonstrates some of the available properties:
{{< code-toggle file = "content/products/software.md" copy = false fm = true > }}
title = 'Software'
[menu.main]
parent = 'Products'
weight = 20
pre = '< i class = "fa-solid fa-code" > < / i > '
[menu.main.params]
class = 'center'
2021-12-08 02:42:31 -05:00
{{< / code-toggle > }}
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
Access the entry with `site.Menus.main` in your templates. See [menu templates] for details.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
## Define in site configuration
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
To define entries for the "main" menu:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "config" copy = false > }}
2019-10-21 04:22:28 -04:00
[[menu.main]]
2023-05-22 10:43:12 -04:00
name = 'Home'
pageRef = '/'
weight = 10
2019-10-21 04:22:28 -04:00
[[menu.main]]
2023-05-22 10:43:12 -04:00
name = 'Products'
pageRef = '/products'
weight = 20
[[menu.main]]
name = 'Services'
pageRef = '/services'
weight = 30
{{< / code-toggle > }}
This creates a menu structure that you can access with `site.Menus.main` in your templates. See [menu templates] for details.
To define entries for the "footer" menu:
{{< code-toggle file = "config" copy = false > }}
[[menu.footer]]
name = 'Terms'
pageRef = '/terms'
weight = 10
[[menu.footer]]
name = 'Privacy'
pageRef = '/privacy'
weight = 20
2019-10-21 04:22:28 -04:00
{{< / code-toggle > }}
2023-05-22 10:43:12 -04:00
This creates a menu structure that you can access with `site.Menus.footer` in your templates. See [menu templates] for details.
### Properties {#properties-site-configuration}
2019-10-21 04:22:28 -04:00
{{% note %}}
2023-05-22 10:43:12 -04:00
The [properties available to entries defined in front matter] are also available to entries defined in site configuration.
[properties available to entries defined in front matter]: /content-management/menus/#properties-front-matter
2019-10-21 04:22:28 -04:00
{{% /note %}}
2023-05-22 10:43:12 -04:00
Each menu entry defined in site configuration requires two or more properties:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
- Specify `name` and `pageRef` for internal links
- Specify `name` and `url` for external links
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
pageRef
: (`string`) The file path of the target page, relative to the `content` directory. Omit language code and file extension. Required for *internal* links.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
Kind|pageRef
:--|:--
home|`/`
page|`/books/book-1`
section|`/books`
taxonomy|`/tags`
term|`/tags/foo`
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
url
: (`string`) Required for *external* links.
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
### Example {#example-site-configuration}
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
This nested menu demonstrates some of the available properties:
2019-10-21 04:22:28 -04:00
2023-05-22 10:43:12 -04:00
{{< code-toggle file = "config" copy = false > }}
[[menu.main]]
name = 'Products'
pageRef = '/products'
weight = 10
2021-01-20 06:47:49 -05:00
2023-05-22 10:43:12 -04:00
[[menu.main]]
name = 'Hardware'
pageRef = '/products/hardware'
parent = 'Products'
weight = 1
2021-01-20 06:47:49 -05:00
2023-05-22 10:43:12 -04:00
[[menu.main]]
name = 'Software'
pageRef = '/products/software'
parent = 'Products'
weight = 2
[[menu.main]]
name = 'Services'
pageRef = '/services'
weight = 20
2021-01-20 06:47:49 -05:00
[[menu.main]]
2023-05-22 10:43:12 -04:00
name = 'Hugo'
pre = '< i class = "fa fa-heart" > < / i > '
url = 'https://gohugo.io/'
weight = 30
[menu.main.params]
rel = 'external'
{{< / code-toggle > }}
This creates a menu structure that you can access with `site.Menus.main` in your templates. See [menu templates] for details.
## Localize
Hugo provides two methods to localize your menu entries. See [multilingual].
## Render
See [menu templates].
[localize]: /content-management/multilingual/#menus
[menu templates]: /templates/menu-templates/
[multilingual]: /content-management/multilingual/#menus
[template]: /templates/menu-templates/