Skip to main content
Menus in Joomla
On this page
# Topics

Menus in Joomla

26 May 2026

Most people think of menus as navigation. In Joomla, that is only half the story. A menu item is also the place where Joomla defines a page: its URL, its layout, its modules, its access rules, and its SEO settings. Once you understand that, a lot of Joomla starts to make sense.

This article explains how Joomla menus really work. It covers the basics for website owners and editors, the practical setup for administrators, and the technical details for developers. You will learn how to create menus and menu items, how the Itemid drives almost every page, how access control fits in, and how to avoid the most common mistakes.

Menus do the routing, rendering and are the configuration layer behind every Joomla page

The goal is simple: help you understand Joomla menus well enough to use them with confidence.

1. The Basics

1.1 What is a Menu?

A menu is a container. It is a named group of menu items, identified by a menutype such as mainmenu, footer, or usermenu.

A menu on its own does not appear anywhere on the frontend. To show it to visitors, you publish a Menu module that points to the menutype.

A menu is a list. A menu item is a page.

1.2 What is a Menu Item?

A menu item is a single navigation entry. It is much more than a link. A menu item defines:

  • A URL (alias-based, SEF, or external).
  • The page type, such as Single Article, Category Blog, Login Form, or External URL.
  • The layout and its parameters.
  • The template style to use.
  • The access level and the language.
  • The page metadata: title, description, robots.
  • Which modules are shown on that page.

In Joomla, the menu item is the page.

1.3 Where Do I Find Menus?

In the Joomla 6 backend, you manage menus from several places:

System  → Menus → Menus              (containers)
System  → Menus → All Menu Items     (every item, across menus)
System  → Menus → Main Menu          (items inside Main Menu)
Modules → Menu                         (publish a menu on the frontend)

Administrator-side menus live in the same database table, but with a different client_id. We will come back to that later.

1.4 Menu vs Menu Item vs Menu Module

These three terms are often confused. They are not the same:

ConceptWhat it isVisible on the frontend?
Menu A named container (a menutype). No, on its own.
Menu Module A module that renders a menu. Yes.
Menu Item One link and page definition. Yes, if its menu is rendered.

You can also create hidden menus: menus with items, but no Menu module rendering them. This is very useful for clean routing without polluting the navigation.

1.5 The Joomla Menu Hierarchy

It helps to picture how menus fit together:

Menu (container, a menutype)
 └── Menu Item (link + page definition, has an Itemid)
      └── Page / View
           ├── Component  (the main content)
           ├── Modules    (sidebar, header, footer)
           └── Parameters (layout, metadata, template, ACL)

A menu is only a container. The menu item is where Joomla actually configures a page.

1.6 Menu Items Define Pages

This is the part newcomers miss most often:

  • An article does not automatically have a public page.
  • A component view does not automatically have a public page.
  • A menu item is what gives a piece of content a real page in the Joomla sense.

A category accessed without a menu item still renders, but Joomla has to guess an Itemid. That guess leads to fragile module assignments, wrong breadcrumbs, and unstable canonical URLs.

With a menu item, Joomla can confidently attach:

  • A routing entry and a canonical URL.
  • Module placements.
  • Metadata and a page heading.
  • A breadcrumb trail.
  • A template style override.
  • Layout parameters and a page class.

In Joomla, content is content. A page requires a menu item.

Back to top

2. Creating Menus and Menu Items

2.1 Creating a Menu

To create a new menu, go to:

System → Menus → Menus → New

Two fields are required:

  • Title: the human-readable name, for example "Footer Menu".
  • Menu Type: the machine name, for example footer. This value is used by modules and in the URL.

After saving, Joomla offers a one-click button to create the matching Menu module straight away.

2.2 Creating a Menu Item

To create a new menu item, go to:

System → Menus → Main Menu → New

The first decision is the Menu Item Type. Joomla opens a picker that is grouped by component:

Articles       → Single Article, Category Blog, Category List, Featured
Contacts       → Single Contact, Featured Contacts, List Contacts
Smart Search   → Search Form, Search Results
Tags           → Compact List, List All Tags, Tagged Items
Users Manager  → Login Form, Registration, Profile, Reset, Remind
System Links   → URL, External URL, Alias, Separator, Heading
Wrapper        → Iframe Wrapper

After choosing the type, you fill in the Details tab and the options that are specific to that type.

2.3 The Menu Item Edit Screen

The edit screen is split into tabs. Each tab controls a different part of the page:

TabWhat it controls
Details Title, alias, menu, parent, status, access, language, default page.
Type-specific Options that depend on the menu item type, such as Blog Layout or Article Options.
Link Type Browser title, link image, CSS class, anchor title.
Page Display Browser page title, page heading, page class suffix.
Metadata Meta description, robots, secure setting.
Module Assignment Which modules appear on this page.

2.4 Key Fields Explained

  • Title: what visitors click on, and also the default <h1> on the page.
  • Alias: the URL slug. Joomla generates this from the title if you leave it blank.
  • Parent: choose another item to nest under it.
  • Default Page: exactly one item per language can be the home page, marked with a yellow star.
  • Access: Public, Guest, Registered, Special, Super Users, or your own custom level.
  • Language: pin to a site language or leave it as "All".
  • Template Style: override the default template style per menu item.
  • Note: an internal label that is not shown anywhere on the frontend.
Back to top

3. Menu Item Types in Detail

3.1 Articles (com_content)

TypeUse it for
Single Article Pin one article to a clean URL.
Category Blog A leading, intro, and links layout for one category.
Category List A sortable and paginated table of articles.
List All Categories A tree of subcategories under a root.
Featured Articles The featured pool, often used as the homepage.
Archived Articles Items moved to Archived status.
Create Article A frontend submission form.

System Links are the underrated heroes of Joomla menus. They allow you to build clean, flexible navigation without creating new content.

TypeWhat it does
URL Internal Joomla query string, such as index.php?option=...
External URL A plain link to another site.
Alias Re-uses another menu item's page, with a different position.
Separator A non-clickable visual divider.
Heading A non-clickable parent, ideal for dropdowns.
Text Separator Like a Separator, but with a label.

The Alias type is especially useful: one canonical page, multiple navigation paths, no duplicate content.

3.3 Wrapper

The Wrapper menu item embeds another URL inside an iframe on a Joomla page. It is handy for legacy tools, but be careful with X-Frame-Options and modern Content Security Policy rules.

3.4 Users Manager

The Users Manager provides frontend-facing pages for the user lifecycle:

  • Login Form
  • Registration Form
  • User Profile
  • Edit Profile
  • Username Reminder
  • Password Reset

These are the public-facing equivalents of backend user actions.

3.5 Tags, Contacts, Smart Search, Newsfeeds

Each core component ships its own menu item types. The pattern is always the same: a list view, a single item view, and sometimes a form view. Custom components do the same through XML metadata files in components/com_xxx/tmpl/.

Back to top

4. The Itemid - Joomla's Hidden Context Engine

4.1 What is the Itemid?

Every frontend page Joomla renders is connected to a menu item through the Itemid URL parameter. The Itemid controls:

  • The active menu item highlight.
  • The module assignments: which modules appear.
  • The template style, if the menu item overrides it.
  • The page parameters: browser title, page class, robots.
  • The breadcrumbs.

The same article with two different Itemids becomes two different pages.

4.2 What Happens Without an Itemid?

If a URL has no Itemid, Joomla's router will try to guess one. That guess is sometimes wrong, which leads to:

  • The wrong menu item highlighted.
  • Modules appearing where they should not, or missing where they should appear.
  • Duplicate URLs for the same content.
  • Broken breadcrumbs.

When a page looks weird, the first thing to check is the Itemid.

4.3 Inspecting the Itemid

You can inspect the Itemid by appending &tp=1 to the URL (template positions), or by looking at the raw query string before SEF rewrites the URL. The Itemid is the last numeric ID in the URL:

index.php?option=com_content&view=article&id=42&Itemid=123
Back to top

5. Menu Items Control Modules

5.1 Module Assignment Options

For every module in Joomla, you choose where it should appear:

  • On all pages.
  • On no pages.
  • Only on the pages selected.
  • On all pages except those selected.

The "selected pages" are menu items. The relationship between modules and menu items lives in the #__modules_menu table.

5.2 Why This is Powerful

You can shape the entire layout per page without touching code:

Homepage slider           → only on the Home menu item
Sidebar with shop promo   → only on shop category items
Newsletter subscription   → everywhere except checkout
Login module              → only on the Login menu item

5.3 A Quick Rule of Thumb

If a module should appear in only one place, give that place its own menu item - even if the menu item is hidden.

Back to top

6. Hidden Menus

6.1 What is a Hidden Menu?

A hidden menu is a menu that has menu items but no Menu module rendering it. Visitors can still reach those URLs directly, but the items do not appear in any navigation.

6.2 When to Use a Hidden Menu

Hidden menus are useful for many real-world cases:

  • Campaign landing pages with their own modules.
  • "Thank you" and "Order confirmation" pages.
  • Internal tool pages with restricted access.
  • Search results pages.
  • Print or alternative-layout variants.
  • Workflow or step pages in multi-step forms.

6.3 The Trick

The hidden page still gets a proper Itemid, so:

  • Module assignment works as expected.
  • Metadata and page class work.
  • Routing and SEF URLs work.

You get all the benefits of a menu item, with none of the visual clutter in the navigation.

Back to top

7. Multilingual Menus

7.1 The Pattern

For a multilingual website, you typically create:

  • One menu per language, for example mainmenu-en and mainmenu-nl.
  • Associations between equivalent items across languages.
  • One Home menu item per language, all marked as default.

7.2 Associations

Open a menu item and go to the Associations tab:

System → Menus → All Menu Items → [item] → Associations

Linking equivalent items enables:

  • The Language Switcher module.
  • "Same page, different language" routing.
  • Correct hreflang tags.
  • Translated breadcrumbs.

The association is stored in the #__associations table with context = com_menus.item.

7.3 Common Multilingual Mistakes

  • Forgetting to set a Home menu item for every language.
  • Mixing "All" language items with language-specific ones.
  • Missing associations, so the language switcher drops users on the homepage.
  • Different alias structures in different languages.
Back to top

8. Access Control (ACL)

8.1 Two Layers of Visibility

Menu items have two distinct layers of access control. They are not the same:

LayerWhat it controls
Access Level Whether a user sees the menu item link.
Component or Item Permissions Whether the user can open the target.

A user who is not allowed to view an article does not get access just because the menu link is visible.

8.2 Practical Examples

  • A public website with a Member Area hidden behind the Registered access level.
  • A staff intranet with items only visible to Special.
  • An onboarding workflow gated to a custom "Onboarding" access level.
  • An "Edit profile" link visible only to logged-in users.

8.3 ACL Pitfalls in Menus

  • Hiding a menu item does not secure the URL. You also need to restrict the underlying content.
  • A menu item with Access = Public linking to a Registered article gives users a confusing 403 error.
  • Module assignments inherit access too. A "Logged-in users" module on a public menu item only renders for logged-in viewers.
Back to top

9. Routing and SEF

9.1 The Routing Pipeline

When a visitor opens a Joomla page, the system goes through several steps:

  1. The browser sends a request, for example /news/joomla-6-released.
  2. Joomla's router parses the URL.
  3. The router finds the matching menu item, for example a Category Blog for news.
  4. The Itemid is set, and then the component is resolved.
  5. Joomla builds the parameters, assigns the modules, and renders the template.

The menu item is the anchor for the entire resolution.

9.2 SEF and Menu Items

With SEF URLs enabled, the menu item's alias becomes a URL path segment. Nested menu items produce nested paths:

Main Menu → News           (alias: news)
            └── Category Blog  (alias: products)
                 └── Article   (alias: laptops)

URL: /news/products/laptops

A clean alias strategy keeps URLs short, predictable, and SEO-friendly.

9.3 Canonical Pages

If two menu items point to the same content, Joomla emits a canonical <link rel="canonical"> to the menu item it considers primary. When you refactor navigation, verify this carefully - canonicals can flip unexpectedly.

9.4 SEO Benefits at a Glance

A well-architected menu structure gives you, for free:

  • Clean URLs built from menu item aliases.
  • Hierarchical paths that mirror the site's information architecture.
  • Per-page metadata: browser title, description, and robots.
  • Breadcrumb trails generated from the menu tree.
  • Canonical tags that consolidate duplicate routes.
  • Hreflang signals through multilingual associations.
  • Topic clustering: children under a parent live under one URL path.

Bad menu architecture produces the opposite: duplicate content, ugly fallback URLs, conflicting canonicals, broken breadcrumbs, and hreflang mismatches.

A clean menu is the cheapest SEO win in Joomla.

Back to top

10. Administrator Menus

10.1 The Backend Menu is Just Data

The administrator menu is also stored in the #__menu table, but with client_id = 1 and menutype = main. You can edit it like any other menu:

System → Menus → Administrator Menus

10.2 A Client-friendly Backend

You can build a simplified administrator menu for clients with only the entries they actually use:

Content     → Articles | Categories | Featured | Media
Shop        → Products | Orders | Customers
Marketing   → Newsletter | Campaigns | Forms
Settings    → Users | Modules | Template

The result:

  • Less confusion for non-technical editors.
  • Fewer accidental clicks into core configuration.
  • Faster onboarding for new staff.
  • Lower support load for the agency.

10.3 Workflow Shortcuts

Concrete one-click entries that save editors a lot of clicks:

  • Add Article: index.php?option=com_content&task=article.add
  • Pending submissions: a filtered article list, state set to unpublished.
  • Today's orders: a component view pre-filtered for the date.
  • Newsletter campaigns: straight into the campaign component.

Each shortcut is a URL menu item type with the correct query string. No code, just configuration.

10.4 Role-based Admin Navigation

You can combine administrator menus with ACL so each user group sees its own backend:

GroupMenu shows
Editors Articles, Media, Categories, Tags.
Marketing Banners, SEO tools, Campaigns, Smart Search.
Shop managers Products, Orders, Customers, Coupons.
Developers Templates, Extensions, System tools, Plugins.
Super Users Everything (the default main menu).

The pattern is: one administrator menu per role, restricted by Access Level on each menu item.

10.5 Administrator Menu Items vs Frontend

Administrator menu items behave differently:

  • They do not create frontend pages.
  • They do not affect routing or SEO.
  • They do support ACL: items can be restricted per user group.
  • They do support icons and structure.

It is one of the most under-used features in Joomla.

Back to top

11. Under the Hood (Developer View)

11.1 The #__menu Table

Every menu item, frontend or backend, lives in the same table. The most important columns are:

id                -- primary key, used as the Itemid
menutype          -- which menu it belongs to
title             -- visible label
alias             -- SEF segment
path              -- full alias path (parent/child/grandchild)
link              -- the underlying index.php?option=... query
type              -- component | url | alias | separator | heading
published         -- 0 = unpublished, 1 = published, -2 = trashed
parent_id         -- nesting parent
level             -- depth in tree
component_id      -- linked component
access            -- ACL access level
template_style_id -- template style override
params            -- JSON blob with layout and meta options
lft, rgt          -- nested set values
home              -- 1 = default page (per language)
language          -- '*' or a specific language code
client_id         -- 0 = frontend, 1 = administrator
publish_up        -- scheduled publish
publish_down      -- scheduled unpublish

The params column carries all the per-item layout configuration as JSON: show title, page class suffix, robots, blog layout, and more.

11.2 The #__menu_types Table

The #__menu_types table stores the menu containers, one row per menu (mainmenu, footer, usermenu, and so on).

TableWhat it holdsJoined via
#__menu_types The menus themselves. menutype (a string).
#__menu The menu items. menutype matches.

Notice that the join is by string, not by ID. This is a deliberate Joomla quirk.

11.3 The #__modules_menu Table

This small but powerful table holds the relationship between modules and the menu items they appear on:

moduleid   -- which module
menuid     -- which menu item (Itemid)
             positive = "show on this item"
             negative = "show on all except these items"
             0        = "all pages"

This tiny table powers Joomla's entire per-page module strategy.

11.4 The Nested Set Model (lft and rgt)

Like categories, menu items use the Nested Set Model. Every item has lft and rgt values. A parent's range always wraps its children:

Main Menu Root         lft=1   rgt=10
├── Home               lft=2   rgt=3
└── News               lft=4   rgt=9
     ├── National       lft=5   rgt=6
     └── International  lft=7   rgt=8

To list all descendants of "News", you only need one query:

SELECT id, title
  FROM #__menu
 WHERE lft > 4 AND rgt < 9
 ORDER BY lft;

No recursion is needed. That is the trick.

11.5 The Rebuild Button

The All Menu Items screen has a Rebuild button in the toolbar:

System → Menus → All Menu Items → Rebuild

Rebuild recalculates the lft, rgt, level, and path columns from parent_id. Run it after:

  • Importing items through SQL.
  • A failed save.
  • A migration from another site.
  • Manual database edits that touched parent relations.

11.6 Useful SQL Snippets

List every published frontend menu item, in tree order:

SELECT id, menutype, title, alias, level, link
  FROM jos_menu
 WHERE client_id = 0
   AND published = 1
 ORDER BY lft;

Show which modules appear on which menu items:

SELECT m.id AS itemid, m.title AS page,
       mod.id AS moduleid, mod.title AS module
  FROM jos_menu m
  JOIN jos_modules_menu mm ON mm.menuid = m.id
  JOIN jos_modules mod     ON mod.id    = mm.moduleid
 WHERE m.client_id = 0
 ORDER BY m.lft;

Find orphaned module assignments that point to a deleted menu item:

SELECT mm.*
  FROM jos_modules_menu mm
  LEFT JOIN jos_menu m ON m.id = mm.menuid
 WHERE mm.menuid > 0 AND m.id IS NULL;

11.7 The PHP API

From PHP, you can work with menus through a clean API:

use Joomla\CMS\Factory;

$app  = Factory::getApplication();
$menu = $app->getMenu();        // SiteMenu or AdminMenu

$active = $menu->getActive();   // current menu item
$home   = $menu->getDefault();  // default page for current language
$item   = $menu->getItem(101);  // by id
$tree   = $menu->getTree();     // breadcrumb chain
$items  = $menu->getItems('menutype', 'mainmenu');

11.8 Events to Hook Into

Plugins can react to menu-related events:

EventWhen it fires
onAfterRoute After the router resolved a menu item.
onContentPrepare (context com_menus.item) Before rendering a menu item.
onExtensionAfterSave (context com_menus.item) After saving a menu item.
onExtensionAfterDelete After a menu item is deleted.
Back to top

12. Common Mistakes and Pitfalls

12.1 Too Many Top-level Items

A flat menubar with too many items is hard to scan:

Home  News  Blog  Events  About  Team  History  Contact  Search

A shallow tree with sensible grouping works much better:

Home    News    About    Contact
                 ├── Team
                 ├── History
                 └── Mission

12.2 No Default Home Item per Language

The symptoms are a blank homepage, a 404 on /, or the wrong language at the root. The fix is simple: every active language needs exactly one Home menu item, marked with the yellow star.

12.3 Hidden is Not Secure

Removing a menu module does not hide the underlying page. If the URL is sensitive, set the Access Level on both the menu item and the underlying content.

12.4 Alias Drift

Renaming a menu item often changes its alias, and so its URL. This has SEO consequences. If you must rename, set up a 301 redirect with com_redirect or a redirect plugin.

12.5 Duplicate Menu Items for the Same Content

If two menu items point to the same content, Joomla picks one as canonical. Which one is not always obvious. When you genuinely need two paths to the same content, use a System Link of type Alias instead of two separate items.

12.6 Forgetting Module Assignment

A module set to "Only on the pages selected" with no pages selected is invisible everywhere. This is a surprisingly common 30-minute bug.

12.7 Mixing client_id

Editing the wrong row in #__menu can break the administrator menu. Always filter by client_id when you work directly with the database.

Back to top

13. Best Practices

If you only remember a few things from this article, remember these:

  • Plan your menu structure before you create content. Menu items dictate URLs, modules, SEO, and ACL.
  • Treat every "kind of page" as a candidate for its own menu item, even a hidden one.
  • Keep aliases short, lowercase, hyphenated, and stable.
  • Use Headings and Separators to group long dropdowns.
  • Document hidden menus so future maintainers know they exist.
  • Run Rebuild after migrations or any direct database changes.
Back to top

14. Quick Reference

CREATE MENU         System → Menus → Menus → New
CREATE ITEM         System → Menus → [Menu Name] → New
RENDER ON FRONTEND  Publish a Menu module pointing at the menutype
SET HOMEPAGE        Mark an item as "Default" (yellow star) per language
ITEMID              The id column of #__menu - drives modules, SEO, layout
HIDE A PAGE         Put it in a menu without publishing a Menu module
RESTRICT            Access Level (on item AND on content)
MULTILINGUAL        One menu per language + Associations
ORDER               Drag-and-drop, or use Rebuild after SQL
RESET TREE          System → Menus → All Menu Items → Rebuild
MODULE PER PAGE     Module → Menu Assignment → Only on the pages selected
TEMPLATE OVERRIDE   Set Template Style on the menu item
SAME PAGE, MANY     Use System Links → Menu Item Alias
Back to top

15. Summary

In Joomla, a menu item is not just a link. It is a complete page definition that touches almost every layer of the system:

  • Routing: the URL and the canonical link.
  • Rendering: the layout, the template style, and the modules shown.
  • Configuration: page title, metadata, page class, and robots.
  • Access: who can see it and who can use it.
  • Language: its multilingual partner.
  • Context: the Itemid that ties everything together.

A well-planned menu structure saves time, prevents bugs, and makes a Joomla website easier to maintain for years. A bad menu structure creates problems that grow with the site: broken URLs, wrong modules, confusing canonicals, and SEO regressions.

If you are planning a new Joomla site, migrating from an older version, or you suspect that your current navigation causes problems, it pays to look at menus early. Master menu items and you master Joomla.

Back to top
Menus in Joomla
Peter Martin

Joomla en Linux specialist voor snelle, veilige en schaalbare websites.