Schema and search appearance guide
Fix WordPress Breadcrumb Schema That Shows the Wrong Hierarchy
Decide the path a reader should see, trace the wrong trail to its category, parent page, or competing component, and make the visible breadcrumbs and the markup agree.
On this page
When breadcrumb markup shows the wrong hierarchy, first decide which path a reader should see, then find what produced the wrong one. In WordPress, check three causes first: a post in several categories, a page with no parent set, or two components printing different trails. Fix that source, then check that the visible trail and the BreadcrumbList markup show the same path on every template.
Choose the path readers should see
Google’s breadcrumb documentation, checked September 27, 2026, says: “We recommend providing breadcrumbs that represent a typical user path to a page, instead of mirroring the URL structure.” So the question is not what the URL says but how a reader would get there.
For a fictional business, garden.example, a post on pruning tomatoes might sit in both the Vegetables and Summer Tasks categories. An illustrative decision: most readers browse by plant, so the path is Home, Vegetables, Pruning Tomatoes. Write that decision down for each section of the site before changing anything. Otherwise you will fix one post and create the same argument on the next.
The same documentation also says that if there are several ways to reach a page, “you can specify multiple breadcrumb trails for a single page.” That is a markup option, but a single clear trail is easier to keep consistent with what readers see.
Find where the wrong path comes from
| Symptom | Likely source | Where to look |
|---|---|---|
| A post shows the wrong category | The post has several categories and the tool picked another | The post’s Categories panel |
| A post shows “Uncategorized” | No category was chosen, so WordPress used the default | Categories panel; Settings, Writing |
| A page shows Home, then the page, with nothing between | No parent page set | The page’s Parent setting |
| A category shows no parent | The category has no parent category | Posts, Categories |
| The visible trail and the markup differ | Two components: the theme’s trail and a plugin’s markup | View source and the theme settings |
Two BreadcrumbList blocks with different paths |
Two plugins, or theme Microdata plus plugin JSON-LD | The structured data inventory |
The last two rows need an inventory of what the page prints. The schema_inventory.py script in the structured data audit lists every top-level JSON-LD object, including any top-level BreadcrumbList; one nested inside another object’s properties will not appear. Also search the page source for itemtype or typeof next to BreadcrumbList, which is how Microdata and RDFa trails from themes appear.
Compare the visible trail with the markup
Open a post signed out. Write down the visible trail. Then find the BreadcrumbList in the page source and write down each ListItem’s position and name. They should match item for item. Google’s documentation says each item needs a position and a name, and every item except the last needs an item URL; the last one may omit it.
Know which component owns each part. In WP Visibility 2.10.3, the Schema module, on by default, prints a BreadcrumbList on every page except search results and the 404 page, whether or not you show a visible trail, and even with the Breadcrumbs module off. The visible trail only appears where you place the [wpvis_breadcrumbs] shortcode, which works while the Breadcrumbs module is on (the default), and both are built from the same trail, so they normally match. Add a visible breadcrumb trail covers placement. Google’s structured data general guidelines, checked September 27, 2026, say not to mark up content that is not visible to readers, so pair the markup with a visible trail on each template.
That design has one more consequence to check. If your theme prints its own visible trail with a different rule for choosing the category, readers see one path while the markup describes another. Either replace the theme’s trail with the shortcode, or remove WP Visibility’s breadcrumb markup so the theme owns both the trail and the markup. Turning off WP Visibility’s Breadcrumbs module does not remove its markup. Turning off the Schema module does, along with all of WP Visibility’s other JSON-LD; to remove only the breadcrumb, a developer can return an empty value from the wpvis_schema_piece_breadcrumb filter. WordPress 7.0 also added a core Breadcrumbs block, according to its developer note, checked September 27, 2026; the WP Visibility doc advises using one visible trail or the other, not both.
Fix the hierarchy at its source
Work through the causes you found:
- Several categories. WP Visibility’s trail uses the first category WordPress returns for the post, and 2.10.3 has no primary category picker. The dependable fix is to keep each post in one category and use tags for secondary groupings. If you need several categories and a chosen trail, a developer can adjust the items through the
wpvis_breadcrumbsfilter. If you use a different breadcrumb tool, check its own documentation for how it chooses a category. - Uncategorized. Choose a real category for the post, and change the Default Post Category under Settings, Writing so new posts do not land there. WordPress assigns that default to any post saved without a category, according to its Writing settings documentation, checked September 27, 2026.
- Pages. Set the page’s Parent in the editor’s settings sidebar (WordPress documentation, checked September 27, 2026). The trail then lists the parent pages. With pretty permalinks, a child page’s address includes its parent’s slug (
get_page_uri()reference, checked September 27, 2026), so changing a parent changes the address. Check redirects for published pages before you move them. - Nested categories. If Vegetables should sit under Garden Guides, set the parent category under Posts, Categories (Categories screen documentation, checked September 27, 2026). The trail follows the category’s parents.
- Competing components. Pick one owner for breadcrumbs. Turn off the other at its source, rather than hiding its output with CSS. A trail hidden with CSS is still in the HTML, and hiding a visible trail does not remove any markup.
After each change, clear any page cache, reload the post signed out, and compare the visible trail and the markup again.
Validate the paths across templates
A fix for posts can leave other templates wrong. Check one URL of each type:
| Template | Expected trail (illustrative) |
|---|---|
| Post | Home, Garden Guides, Vegetables, Pruning Tomatoes |
| Page | Home, Services, Garden Design |
| Child page | Home, Services, Garden Design, Small Gardens |
| Category | Home, Garden Guides, Vegetables |
| Tag | Home, the tag name |
| Custom post type entry | Home, the archive if it has one, its term or parent entries, the entry |
Run each URL through the Rich Results Test and check that it detects the breadcrumbs with no errors. The breadcrumb documentation says the feature “is available on desktop in all regions and languages where Google Search is available,” so look for breadcrumbs in desktop search results, not on a phone. Valid markup makes a page eligible; Google does not guarantee a breadcrumb will be shown, as its structured data general guidelines, checked September 27, 2026, state.
If your trails reflect a site structure you are unhappy with, that is a navigation problem rather than a markup problem. The WordPress SEO field guide covers site structure; a topic hub can give a group of posts a clearer home.
Breadcrumb checklist
- The intended path written down for each section of the site.
- The wrong path traced to categories, parent pages, or a competing component.
- One component owns breadcrumbs; the visible trail and the markup match item for item.
- Posts in one category where possible; the default category is not Uncategorized.
- Parent pages and parent categories set; redirects checked for moved pages.
- One URL per template validated in the Rich Results Test.
