Breadcrumbs and taxonomy archives are the two parts of a small WordPress site nobody looks at after launch. Rank Math or Yoast turns breadcrumbs on, the theme prints its own trail, WordPress makes a category and tag archive for every term you have ever typed, and two years later you have a hundred thin archive URLs and a BreadcrumbList that doesn't match what people see on the page.
None of this will sink a site on its own. Together, though, it means Google spends crawl time on pages that compete with your real posts, and your breadcrumb markup sends mixed signals about how the site is organised. This post is the cleanup I run on small sites. It isn't a Schema.org tutorial.
2026 reality check: Google still reads BreadcrumbList, and it still shapes how your URL path looks in results, especially on desktop and in some surfaces where the breadcrumb label replaces the raw URL. Thin taxonomy archives still waste crawl budget and still get flagged as "Crawled – currently not indexed" in bulk. Both problems are boring, and both are still real.
Part 1: BreadcrumbList hygiene
One source of breadcrumbs, not three
The most common problem is duplicates. The theme outputs a breadcrumb trail with microdata, Rank Math or Yoast outputs BreadcrumbList JSON-LD, and sometimes a page builder or WooCommerce adds a third. Google then sees two or three trails that disagree.
How to check: open a post, view the source, and search for BreadcrumbList. Then paste the URL into the Rich Results Test. If you see more than one BreadcrumbList item, pick one source:
- Rank Math: Settings → General → Breadcrumbs, then place the shortcode or block in your theme. Turn off the theme's own breadcrumbs.
- Yoast: Settings → Advanced → Breadcrumbs. Yoast adds BreadcrumbList to its schema graph. Use its function or block for the visible trail and turn off the theme's.
- Theme-only: if you keep the theme's trail, make sure its markup is valid. Otherwise output it without markup and let the SEO plugin handle the schema.
The visible trail must match the JSON-LD
Markup should describe what users see. Mismatches I see all the time:
- The visible trail says
Home > Guides > Post, but the JSON-LD saysHome > Uncategorized > Post, because the plugin uses the first category alphabetically. - A post sits in three categories, and the breadcrumb changes depending on which category was assigned first.
- Labels are different: the visible trail says "Blog", while the schema uses the page slug "blog-2".
Fix: set a primary category on every post (both Rank Math and Yoast let you do this in the category box). Rename or remove "Uncategorized". Give breadcrumb labels short human names that match your navigation.
Every item URL should be indexable and canonical
Each item in a BreadcrumbList should point to a URL that returns 200 and canonicalises to itself. Common problems:
- A middle crumb points to a category archive you've set to noindex, or to a URL that redirects.
- The "Blog" crumb points to
/?page_id=12instead of/blog/. - The trail mixes
httpandhttps, orwwwand non-www.
If a crumb points to a URL you don't want indexed, either change the trail (skip that level) or make that level a real, useful hub page. When several URLs serve the same content, the rules from fixing duplicate content with canonical tags apply here too: every crumb should use the one canonical version.
Keep the trail short and logical
Home > Category > Post is enough for most small sites. Don't fake depth with Home > Blog > 2026 > October > SEO > Post. The last crumb can be the post title (Google ignores whether it has a link). Make sure the number of positions in the JSON-LD matches the number of crumbs people see.
Part 2: thin category and tag archives
Why archives compete with posts
WordPress creates /category/x/ and /tag/y/ automatically. On a site with 40 posts and 120 tags, most tag archives list one or two posts with the same excerpts. Google sees lots of near-duplicate pages, and for some queries a tag archive outranks (or cannibalises) the post it lists.
Spot it in Google Search Console: Performance → Pages, filter by /tag/ or /category/. Look for archive URLs getting impressions for queries that a specific post should own. Then check Pages → "Crawled – currently not indexed" for a pile of taxonomy URLs.
A simple noindex decision rule
For each taxonomy term, ask:
- Does it have at least 5–6 genuinely related posts? If not, it's thin.
- Would someone search for this term and be happy landing on the archive? "WordPress SEO guides" maybe; "misc" or "tips2" no.
- Does it have unique intro text? A 100–200 word description that explains the topic and links to the best posts turns an archive into a real hub.
Then:
-
Categories that pass: keep them indexed, add a description, and link to them from your menu or
/blog/. -
Tags: for most small sites, noindex all tag archives (Rank Math: Titles & Meta → Tags; Yoast: Settings → Taxonomies → Tags → "Show tags in search results" off). Keep
followso links still pass through. - Thin categories: merge them. Move the posts into a stronger category and 301 the old archive URL to it. Noindex is the fallback, not the first choice.
- Empty terms: delete them.
Also remove noindexed archives from your XML sitemap. Both plugins do this automatically when you noindex a taxonomy type, but check anyway.
Pagination on archives
/category/seo/page/2/ should canonicalise to itself, not to page 1. Pointing every page at page 1 hides the posts on deeper pages. Keep paginated pages indexable if the category is indexable. Google no longer uses rel=next/prev, so the plain links between pages are what count. If a category runs to 15 pages, that's usually a sign to split it into subtopics or link to the deep posts from a hub, not to noindex pages 2 onwards.
Date, author, and format archives on a one-author blog are pure duplication. Turn them off or noindex them.
Tidy the links you share
When you share archive or hub links in newsletters or social posts, a clean short link (I use a free URL shortener) keeps tracking parameters off your canonical URLs, so you don't create more variants for Google to sort out.
The 10-minute recap
- One breadcrumb source; theme trail off if the plugin handles it.
- Primary category set on every post; "Uncategorized" gone.
- Visible trail = JSON-LD trail, same labels and same depth.
- Every crumb URL returns 200, is canonical, and is indexable.
- Tag archives noindexed (follow kept) unless they're real hubs.
- Thin categories merged with a 301; empty terms deleted.
- Indexable categories have unique intro text.
- Paginated archives canonicalise to themselves.
- Date, author, and format archives off on single-author sites.
- Noindexed taxonomies are out of the sitemap.
More small-site checklists are on my blog, and free utilities are on the tools page.
Top comments (0)