You are viewing beta documentation for Navigation 4.x.
Menus
Menu Fields
Navigation provides menu-level custom fields — values stored on the Menu element, separate from individual node fields.
Use menu fields when you need content attached to the menu itself: mega-menu panels, promo blocks, footer taglines, or global CTA copy that is not tied to a single link.
Configure the field layout
- Edit a menu in Navigation → Menus.
- Open the Menu Fields tab and add fields to the layout (same as any Craft field layout).
- Save the menu settings.
The layout is stored in project config. Values are edited per site on the Menu Content tab in the menu builder or on the menu settings screen.
Read menu fields in templates
Fetch the menu element and read field handles directly:
{% set menu = craft.navigation.menu('mainMenu').one() %}
{% if menu %}
{{ menu.promoHeading }}
{% endif %}When looping nodes, batch-load menus with withMenu() on the node query so each node has its parent menu hydrated:
{% set nodes = craft.navigation.nodes()
.handle('mainMenu')
.withMenu()
.all() %}
{% set menu = nodes[0].menu ?? null %}See Performance & Caching for when withMenu() affects caching.
Menu element vs menu settings
| API | Returns | Use for |
|---|---|---|
craft.navigation.menu('handle').one() | Menu element | Field values |
craft.navigation.getMenuByHandle('handle') | Menu element | Same as menu().one() |
Navigation::$plugin->getMenus()->getMenuByHandle('handle') (PHP) | MenuSettings | CP metadata (limits, propagation, permissions) |
Use craft.navigation.menu('handle').one() for field values in templates.
Last updated: July 3, 2026, 1:21:57 PM