Open Google, search for a page deep inside a big site, and look at what sits above the blue headline. On a lot of results you won’t see a raw https://example.com/shop/tools/cordless/drill-x200 anymore. You’ll see a tidy little trail: Home › Tools › Cordless › Drill X200. That trail is a breadcrumb, and Google built it from structured data you either gave it on purpose or never thought about once.
The last catalog site we audited had about 400 product pages nested four levels deep, and Google was rendering the bare permalink slug for nearly every one of them in search. No trail, no context, just a slug. The pages ranked fine. They just looked orphaned in the results, like each one had fallen out of the site with no home to point back to. Adding one small block of markup fixed the whole catalog in a single crawl cycle.
Breadcrumbs are one of those rare SEO wins that help the reader and the search engine at the same time, cost almost nothing to add, and are genuinely hard to get wrong once you understand the three properties underneath them. Here’s how they work, how WordPress handles them (spoiler: it mostly doesn’t), and how to add them without shipping the broken markup that quietly disqualifies you from the rich result.
What a Breadcrumb Actually Is
A breadcrumb is a secondary navigation trail that shows where a page sits in your site’s hierarchy. It starts at the home page and steps down through each level until it reaches the page you’re on. Home › Blog › WordPress › This Article tells a visitor, at a glance, exactly how deep they are and gives them a one-click way back up any level.
That’s the human half. The half most people miss is that Google reads breadcrumbs too, and treats them as a signal about your site’s structure. Google’s own documentation puts it plainly: a breadcrumb trail “indicates the page’s position in the site hierarchy,” and Google Search uses breadcrumb markup in the body of a page to categorize the information from that page in search results. When Google trusts the trail, it can replace the ugly full URL in the search snippet with the readable breadcrumb path instead.
On mobile especially, that swap matters. A phone-width result truncates a long URL into an unreadable stub. The same result with a clean breadcrumb trail reads like a table of contents and tells the searcher they’re about to land somewhere organized. Same ranking, better-looking result, higher click-through — for a block of markup you write once.
The Structured Data Behind the Trail
The visible trail on your page is just styled links. What Google reads is a separate, invisible block of JSON-LD in the page’s markup using the schema.org BreadcrumbList type. The visible links and the structured data should describe the same path, but they’re two different things, and it’s the structured data that earns the rich result.
Three properties do all the work
A BreadcrumbList is an ordered list of ListItem entries, and each item needs just three things: a position (where it sits in the trail), a name (the visible label), and an item (the URL it links to). That’s the entire core of it. Everything else is optional. Here’s a two-level trail in the shape Google expects:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Blog",
"item": "https://example.com/blog/"
},
{
"@type": "ListItem",
"position": 2,
"name": "A WordPress Breadcrumbs Guide"
}
]
}
Position counts from one, not zero
The position value is 1-indexed. Your first breadcrumb is position: 1, the next is 2, and so on down the trail. This trips up developers who assume arrays start at zero. Google reads the positions to order the trail, so a list that starts at 0 or skips a number is a common reason a breadcrumb quietly fails to show.
The last item is different on purpose
Notice the final item in the example has no item URL. That’s deliberate. The last breadcrumb is the page the reader is already on, so linking it to itself is pointless. Google’s guidance and schema.org both allow the final ListItem to omit the URL, and many implementations do exactly that. If you’d rather keep every item uniform, you can point the last one at its own canonical URL instead — both are valid. What you shouldn’t do is leave a required property blank in the middle of the list.
Breadcrumbs are one of the few structured-data types that pay off twice. The visible trail cuts bounce rate by giving readers an obvious way to move up and around your site, and the BreadcrumbList markup can replace the raw URL in your search snippet with a clean, keyword-rich path. On a deep site — a shop, a docs library, a big blog — that’s the difference between a result that looks organized and one that looks abandoned.
WordPress Doesn’t Give You Breadcrumbs Out of the Box
Here’s the part that surprises people: WordPress core has no built-in breadcrumb feature. There’s no the_breadcrumb() template tag, no setting in the admin, nothing in the block editor that generates a trail with valid markup. We checked a current core install for this article and the function simply isn’t there. If your site shows breadcrumbs today, they’re coming from one of three places, not from WordPress itself.
Your theme might include them
Many commercial and framework themes — Astra, GeneratePress, Genesis-based themes, and plenty of others — ship their own breadcrumb function and a toggle in the customizer. This is the easiest route when it’s available: turn it on, pick where it appears, done. The catch is that theme breadcrumbs vary wildly in quality. Some output the full BreadcrumbList JSON-LD, some only render the visible links with no structured data at all, and a few emit markup that’s subtly malformed. If you rely on your theme’s breadcrumbs, test one URL in Google’s Rich Results Test to confirm the structured data is actually there.
An SEO plugin is the most common source
If you run Yoast, Rank Math, SEOPress, or All in One SEO, you already have a breadcrumb feature — you may just not have switched it on. These plugins are the most reliable option for most sites because they generate the visible trail and the matching BreadcrumbList structured data together, so the two never drift apart. Yoast exposes a yoast_breadcrumb() template function and a Gutenberg breadcrumb block; Rank Math has its own function and shortcode. We’ll cover the exact steps below.
Or you build it yourself
Developers who want full control can write a breadcrumb function in the theme’s functions.php and drop the structured data into the page head. It’s more work, and you take on responsibility for getting the positions and URLs right, but you get markup that does exactly what you want with no plugin overhead. This is the right call when you’re building a custom theme and already managing your own schema.
How to Add Breadcrumbs to WordPress
Pick the method that matches how your site is built. For most people the SEO plugin route is fastest and safest; developers and custom-theme owners will want the code approach.
With Yoast SEO
Yoast’s breadcrumb feature is built in but not always displayed. Go to Yoast SEO → Settings → Advanced → Breadcrumbs and enable them. That flips on the structured data immediately. To show the visible trail, you either insert the Yoast Breadcrumbs block in the block editor, or — if your theme doesn’t call them automatically — add the template tag near the top of your single.php and page.php files:
<?php
if ( function_exists( 'yoast_breadcrumb' ) ) {
yoast_breadcrumb( '<nav aria-label="Breadcrumb" class="breadcrumbs">', '</nav>' );
}
?>
Wrapping the check in function_exists() means the page won’t fatal-error if Yoast is ever deactivated. The aria-label="Breadcrumb" on a <nav> element is the accessibility convention screen readers expect for a breadcrumb trail — worth including every time.
With Rank Math
Rank Math works much the same way. Enable breadcrumbs under Rank Math → General Settings → Breadcrumbs, then display them with the [rank_math_breadcrumb] shortcode in a page or widget, or with the rank_math_the_breadcrumbs() function in a template file. Like Yoast, it outputs the visible trail and the BreadcrumbList JSON-LD as a pair.
Hand-rolled, for custom themes
If you’re building your own theme, the cleanest approach is to render the visible trail in your template and emit the JSON-LD separately. Keep the two in sync by generating both from the same array of trail items. The structured data doesn’t need to sit visually next to the links — Google reads it anywhere in the page markup — so a common pattern is to build the BreadcrumbList in a function hooked to wp_head and echo the visible <nav> in the template. Whatever you build, validate it before you trust it.
If you’d rather not hand-write breadcrumb markup for every template, amplifi.schema builds a valid BreadcrumbList automatically as part of the single, merged @graph it emits in your page head — alongside your Article, Product, or FAQ schema, with cross-references resolved. It’s free, MIT licensed, and part of the open-source amplifi.plugins suite.
The Mistakes That Break the Rich Result
A breadcrumb that renders fine on the page can still fail to produce a rich result if the structured data is wrong. These are the failures we see most often, and every one of them is avoidable.
The visible trail and the markup disagree
Google wants the breadcrumb structured data to reflect what’s actually visible on the page. If your visible trail reads Home › Guides › This Post but your JSON-LD lists a different path — an extra category, a stray archive level, names that don’t match — Google may ignore the markup or flag it. Generate both from the same source and this problem disappears, which is exactly why a plugin that emits them together is more reliable than stitching two systems together.
Broken or relative URLs in the item field
Each item should be a full, absolute, working URL. Relative paths, links to pages that 404, or URLs that redirect elsewhere all undermine the trail. If you changed your permalink structure or migrated domains and didn’t update your breadcrumb source, this is where it shows up.
Positions that start wrong or skip
As covered above, position is 1-indexed and must run in unbroken order. A trail numbered 0, 1, 2 or one that jumps from 1 to 3 is malformed. Hand-built breadcrumbs are the usual culprit here.
Never testing it
The single biggest mistake is shipping breadcrumbs and assuming they work. Google’s Rich Results Test takes a URL or a snippet and tells you immediately whether it detects a valid BreadcrumbList and flags any errors. Run it once per template type — a post, a page, a product, an archive — and you’ve covered your whole site. A breadcrumb you’ve never validated is a guess, not a feature.
Theme feature — easiest if your theme has it, but verify it emits real JSON-LD.
SEO plugin (Yoast, Rank Math) — most reliable for most sites; visible trail and markup ship together.
Hand-rolled code — full control for custom themes; you own the correctness.
Always — validate one URL per template in Google’s Rich Results Test before you trust it.
Do Breadcrumbs Actually Help Rankings?
It’s worth being honest about the size of the win. Breadcrumbs are not a magic ranking lever, and anyone who tells you adding them will move you up the results is overselling. What they do is more subtle and still valuable: they improve how your result looks in search, which tends to lift click-through rate, and they give Google clearer signals about how your pages relate to each other, which helps with how your site is understood and categorized.
They also help readers, and reader behavior feeds back into search over time. Someone who lands on a deep page and can instantly see where they are — and hop up a level to explore — is less likely to bounce straight back to the results. On a large, hierarchical site, breadcrumbs are close to mandatory for basic usability. On a flat five-page brochure site, they’re optional and often unnecessary. Match the effort to the shape of your site.
Frequently Asked Questions
Breadcrumbs are the easy half of structured data. If you want the rest — Article, Product, FAQ, and the BreadcrumbList that ties them together — amplifi.schema generates valid JSON-LD across your whole site.
Built by amplifi.studio — see also The Pages Google Never Finds: A WordPress Internal Linking Guide.