Categories and tags look like the same feature wearing two names. They both sit in the sidebar of the WordPress editor, they both group your posts, and they both spin up little archive pages when someone clicks one. So most people use them interchangeably, sprinkle a dozen tags on every post for good measure, and move on.
That habit quietly builds a problem. The last content audit we ran was on a blog with about forty published posts and just over thirteen hundred tags — nearly every tag used exactly once, and every one of them a separate, crawlable, near-empty archive page that Google had dutifully found. The actual articles were fine. The site’s crawl footprint was mostly ghost pages.
Categories and tags aren’t decoration, and they aren’t the same tool. One is the skeleton of your site’s structure; the other is a cross-cutting index. Use them for what they’re actually for and your navigation gets clearer and your SEO gets cleaner at the same time. Here’s how they really differ, how many of each you should have, and how to fix a taxonomy that’s already out of hand.
Categories and Tags Are Not Two Flavors of the Same Thing
Under the hood, WordPress treats these as two separate taxonomies — category and post_tag — and it registers them with deliberately different settings. That difference isn’t cosmetic. It changes what each one is good for.
A category is the table of contents
Categories are hierarchical. WordPress registers the category taxonomy with 'hierarchical' => true, which is why you can nest them: a parent “Recipes” category with “Desserts” and “Mains” underneath it. They’re meant to answer the broad question “what section of the site is this?” — the same job the chapters of a book do.
They’re also mandatory. Every post gets at least one category whether you pick one or not. If you publish without choosing, WordPress assigns the site’s default category (that’s the “Uncategorized” bucket on a fresh install, controlled by the default_category option). You can rename the default, and you should, but you can’t have a post with zero categories.
A tag is a cross-cutting index
Tags are flat — the post_tag taxonomy is registered with 'hierarchical' => false, so there’s no parent-and-child structure. A tag describes a specific topic, person, ingredient, or concept that might show up across many different sections. Think of the index at the back of a book: “sourdough,” “gluten-free,” “30-minute” — details that cut across chapters rather than defining them.
And unlike categories, tags are completely optional. A post with no tags is perfectly valid. That single asymmetry — categories required and structural, tags optional and descriptive — is the whole distinction, and it’s the thing to hold onto when you decide where something belongs.
A category is a section of your site — broad, planned, few. A tag is a detail that appears across sections — specific, reused, and only worth creating if more than one post will share it. If a tag will only ever apply to a single post, it shouldn’t exist.
The SEO Problem Nobody Warns You About
Here is where the “just tag everything” habit turns expensive. Both taxonomies are registered as public, which means every category and every tag you create gets its own real URL — a term archive page listing the posts filed under it. Fifty tags means fifty archive pages. Thirteen hundred tags means thirteen hundred of them.
Every term is a real, crawlable page
A tag used once produces an archive page with exactly one post on it — and that page’s actual content is mostly a truncated copy of a post that already lives at its own URL. Multiply that by a few hundred single-use tags and you’ve generated a large pile of thin, near-duplicate pages whose only content is excerpts from elsewhere on your own site. None of it was written on purpose. It’s a side effect of clicking “Add New Tag” too freely.
Category archives have the same mechanic, but because you keep categories few and broad, each one lists many posts and reads like a genuine section page. The math only turns against you when a taxonomy has far more terms than it has posts to fill them.
There is no “duplicate content penalty,” but there is a real cost
It’s worth being precise, because this gets overstated constantly. Google’s own documentation is clear that ordinary duplicate or near-duplicate URLs don’t trigger a manual penalty — the search engine simply picks one version it considers canonical and consolidates the signals onto it. So a stack of thin tag archives won’t get your site “penalized” in the punitive sense people imagine.
What it does cost you is subtler and still worth avoiding. A search engine trying to understand your site’s structure now has to wade through a thousand lookalike pages to find the handful that matter, and ranking signals get spread across more URLs than they should be. On a genuinely large or rapidly-changing site, there’s a crawl-budget cost on top of that — Google notes crawl budget mainly matters for very large sites (roughly a million-plus pages) or ones that change constantly, so a small blog doesn’t need to obsess over it. But the structural clarity problem applies at any size: the fix isn’t to fear tags, it’s to stop manufacturing pages you never intended to publish.
Taxonomy archives are the pages you never write but always publish. A clean, deliberate set of categories and reused tags gives both readers and search engines a legible map of your site. A sprawling, single-use tag cloud gives them a maze of near-empty pages that muddies your site’s structure and, on large sites, dilutes the crawl budget your best content is competing for.
How Many of Each Should You Actually Have?
There’s no magic number carved into WordPress, but the shape of a healthy taxonomy is consistent across almost every site: a small, stable set of categories and a larger set of tags where each tag is genuinely shared by several posts.
Categories: plan them like chapters
Most blogs are well served by somewhere between five and fifteen categories, and a small site often needs fewer. Pick them the way you’d outline a table of contents — before you have hundreds of posts, ideally — and let them describe the major areas your site covers. If you find yourself wanting thirty categories, most of those are probably tags in disguise.
Nesting is available because categories are hierarchical, but use it sparingly. One level of parent-and-child is plenty for the vast majority of sites; deeper trees tend to confuse readers more than they help. And resist filing a single post under five categories at once — if everything is in every section, the sections stop meaning anything.
Tags: only the ones you’ll reuse
The test for a tag is simple: will more than one post ever carry it? A tag that connects your five articles about “email deliverability” is doing real work — it builds a genuine hub of related content a reader can browse. A tag invented on the spot for one post, never to be used again, only creates a thin archive page and clutters your tag list. Before you add a tag, glance at whether it already exists; reuse beats invention every time.
Some sites run beautifully with no tags at all, leaning entirely on well-chosen categories. That’s a completely valid choice. Tags earn their keep only when you have enough content for cross-cutting themes to emerge, and even then, a curated few beat a sprawling many.
Categories
Hierarchical · required on every post · broad sections · few (5–15) · planned like a table of contents · can nest parent/child.
Tags
Flat · optional · specific cross-cutting details · many, but each reused · an index, not a structure · never single-use.
Fixing a Taxonomy That’s Already a Mess
If you’re reading this on a site that already has three hundred tags, don’t panic and don’t start clicking delete one term at a time in the admin. WP-CLI makes an audit and cleanup fast, and it does the reassignment safely so you don’t orphan any posts.
Audit what you actually have
Start by listing every term with its post count. The count column is the whole story — anything at 1 or 0 is a candidate for merging or removal:
wp term list category --fields=term_id,name,slug,count --format=table
wp term list post_tag --fields=term_id,name,slug,count --format=table
Sort by that count and the pattern usually jumps out immediately: a handful of tags doing real work at the top, and a long tail of single-use tags underneath. That tail is what you’re cleaning up.
Merge, delete, and reassign without orphaning posts
To consolidate two overlapping tags, reassign the posts and then remove the empty term. You can move a post’s terms with wp post term, and delete a term once nothing points at it:
# Remove a stray tag from a post, add the canonical one
wp post term remove 512 post_tag old-tag-slug
wp post term add 512 post_tag canonical-tag-slug
# Delete an empty or single-use term entirely
wp term delete post_tag 87
Deleting a term never deletes the posts filed under it — it just removes the association, so the posts stay exactly where they are at their own URLs. For categories, remember the required-category rule: if you delete the only category a post has, WordPress falls back to the default category rather than leaving it uncategorized in a broken way. Set a sensible default first with wp option update default_category <term_id> so that fallback lands somewhere reasonable.
Decide what the surviving archives should do
Once the term list is lean, the remaining archive pages are mostly legitimate — real sections and real shared-topic hubs. For any that you’d still rather keep out of search results, the cleanest control is an SEO plugin. Core WordPress has no per-taxonomy noindex switch; that’s a plugin function. Yoast, Rank Math, and similar tools let you set tag archives (or specific terms) to noindex while leaving your category archives indexable, which is a common and sensible default. If you also want tidy, consistent titles and descriptions on the archives you do keep indexable, that’s exactly the kind of bulk metadata job amplifi.meta was built for — it writes SEO titles and meta descriptions across every page type, term archives included, in one pass.
A Few Habits That Keep It Clean
Cleanup is a one-time chore; staying clean is a habit. A handful of small rules prevent the tag sprawl from ever coming back.
Reuse before you invent
Every time you’re about to add a tag, check whether a near-identical one already exists. “email-deliverability,” “email delivery,” and “deliverability” as three separate tags each collect a fraction of the posts they should. Pick one spelling, one form, and reuse it. The WordPress tag box autocompletes existing tags as you type — trust it instead of typing a fresh variant.
Keep categories stable
Your category list should change rarely. If you’re adding a new category every few posts, they’ve drifted from being sections into being tags. Renaming a category changes its archive URL, which then needs a redirect to avoid a dead link, so treat the category structure as something you set deliberately and revise only when the site genuinely grows a new area. When you do change a category slug, add a 301 redirect from the old archive URL to the new one.
Let your structure feed your internal links
A well-kept category and tag structure isn’t just navigation — it’s a ready-made map of which posts relate to which. Those relationships are exactly what you want to surface as internal links between articles, and a clean taxonomy makes them obvious instead of buried.
Frequently Asked Questions
A tidy taxonomy is one of the cheapest SEO wins on any WordPress site — it costs nothing but a little discipline and an afternoon of cleanup. Start by listing your tags by post count and see how many are pulling their weight.
Built by amplifi.studio — see also The Pages Google Never Finds: A WordPress Internal Linking Guide.