Breadcrumb
3 minute read · Updated 28 August 2026 · Also called breadcrumb trail
A breadcrumb is a trail of links showing where a page sits in a site's hierarchy — Home › Glossary › Breadcrumb. It gives a reader their position and one click back to every level above.
For internal linking it does something specific: it guarantees that every ancestor page receives a लिंक from every page beneath it. Structural rather than editorial, so it complements contextual links rather than replacing them.
Three kinds, and only one is common
- Hierarchy-based — shows the page’s fixed position in the site structure. This is the one worth having, and the only one search engines can use.
- Path-based — shows the route this particular visitor took. Changes per session, duplicates the back button, and gives a crawler nothing.
- Attribute-based — shows the filters applied on a shop listing. Useful in the interface, but it generates URL combinations rather than describing a hierarchy.
Unless there is a specific reason otherwise, hierarchy-based is the answer.
What it does for SEO
Three things, in descending order of importance.
It makes the hierarchy machine-readable. A crawler can infer structure from URLs and menus, but a breadcrumb states it outright on every page.
It reduces क्लिक गहराई for category pages. Every deep page links up, so intermediate levels accumulate inbound links they would otherwise not get.
It can replace the URL in search results. With BreadcrumbList structured data, Google may display the trail instead of the raw address — more readable, and it shows the context before the click.
What it does not do is substitute for editorial linking. Breadcrumbs are boilerplate: identical logic on every page, so they distinguish nothing between pages.
Getting it right
- Mark it up.
BreadcrumbListin JSON-LD. Rank Math and Yoast both output it; the WordPress functionrank_math_the_breadcrumbs()or its Yoast equivalent handles the rendering. - The current page is not a link. Show it as plain text, or omit it.
- Keep it above the content. A breadcrumb in the footer is decoration.
- One trail per page. If a page sits in three categories, pick the primary one — multiple trails confuse both audiences.
- Do not put keywords in it. The labels are the category names. Anything else reads as manipulation and helps nobody navigate.
The structured data, concretely
BreadcrumbList is one of the simplest schema types there is: an ordered list of items, each with a position, a name and a URL. Google uses it to replace the URL line in search results with the trail.
Two rules decide whether it works. The markup must match what is visible on the page — inventing a deeper hierarchy in the JSON than the page actually shows is a structured-data violation. And the final item, the current page, should carry a name but no URL, or be omitted; both are accepted, inventing a self-link is not.
The Rich Results Test confirms it in seconds. Rank Math and Yoast both emit valid markup by default, so on a WordPress site this is usually a matter of checking rather than building.
What to do when a page has several parents
The common case on shops and blogs alike: an item belongs to three categories. A breadcrumb has to pick one, and the picking should be deliberate rather than alphabetical.
Both major WordPress SEO plugins support a primary category for exactly this. Set it, and set it to the category you would want to rank — because the breadcrumb is a link from every product or post to that category page, repeated across the whole archive. On a shop with two thousand products that is a substantial and entirely automatic redistribution of link equity.
Leaving it unset means the software chooses, usually by ID, and the redistribution happens anyway — just not where you would have sent it.
Accessibility, briefly
A breadcrumb is navigation, so it belongs in a <nav> with an accessible label — aria-label="Breadcrumb" — and the current page marked with aria-current="page". Screen reader users then get told what the region is instead of hearing an unexplained list of links.
The separators between items should be CSS rather than text characters. A › typed into the markup gets announced, which is noise; the same character as a ::after is silent.