SEO

How to find and fix duplicate content in WordPress

What actually goes wrong

Google does not penalise a site for having the same content at two URLs. What it does is pick one and ignore the other — and it may not pick the one you wanted.

The real costs:

  • Split signals. Links to five versions of a page build five weak pages instead of one strong one.
  • The wrong URL ranks. A tag archive outranks the article it summarises.
  • Wasted crawling. Google spends its visit on near-identical copies.

Check this first: is your staging site indexed?

This is the version that does real damage, because a full copy of your site competes with you for your own brand — and it usually has no links, so Google may prefer it as the “original”.

# In Google, search each of these:
site:staging.yoursite.com
site:dev.yoursite.com
site:yoursite.com -inurl:www

If anything appears, fix it today:

  1. Password-protect it — HTTP auth is the only reliable block. A robots.txt disallow does not remove what is already indexed.
  2. Set it to noindexwp option update blog_public 0 on the staging install.
  3. Request removal in Search Console for the staging property, if you have one.

robots.txt and noindex do not do the same job. Blocking a URL in robots.txt stops Google crawling it — which means it never sees the noindex tag, so an already-indexed page stays indexed. To remove something: allow crawling, serve noindex, wait for the recrawl. Then block it if you like.

Where WordPress duplicates come from

SourceExampleFix
Protocol / host splithttp://, www., bare domain301 to one canonical form
Trailing slash/page and /page/301 — WordPress usually handles it
Tag and date archivesOne post on five archive pagesnoindex the thin ones
Tracking parameters?utm_source=…Self-canonical on the clean URL
Comment replies?replytocom=123Canonical, or disable threaded replies
Attachment pages/photo-name/ holding one imageRedirect to the parent post
Faceted navigation?filter_colour=red&orderby=priceCanonical to the base category
Staging copiesstaging.yoursite.comAuth + noindex — see above

Three tools, three jobs

Choosing wrongly here is why duplicate-content fixes so often fail.

UseWhenEffect
301 redirectThe URL should not exist separately at allMerges the pages. Visitors and signals both move.
Canonical tagVariants must keep working for peopleBoth stay reachable; one gets the credit.
noindexUseful to visitors, worthless in searchStays reachable, leaves the index.

The common error is a canonical where a redirect belonged. A canonical is a hint — Google can ignore it, and does when internal links contradict it. If a URL has no reason to exist, redirect it.

Find your real duplicates

Search Console → Pages is the authoritative list, because it is Google’s own view:

  • Duplicate without user-selected canonical — you never said which wins.
  • Duplicate, Google chose different canonical — you said, and it disagreed. Check your internal links: they are probably pointing at the version Google picked.
  • Alternate page with proper canonical tag — working as intended. No action.

To check a specific page:

# Does a parameterised URL canonical back to the clean one?
curl -s "https://yoursite.com/page/?utm_source=test" \
  | grep -oE '<link rel="canonical"[^>]*'

It should name the clean URL, not the one with the parameter.

The WooCommerce case

Layered navigation generates a combinatorial explosion — colour × size × sort order, each a URL serving a subset of the same category.

  • Canonical every filtered view to the base category.
  • Keep faceted URLs out of the sitemap.
  • Product variations rarely need separate indexable URLs. One strong product page beats twelve near-identical ones.
  • Watch ?orderby= — sort orders are the same products in a different sequence, and they multiply fast.

Pagination, honestly

Paginated archives are not duplicates — each page has different posts. Treat them normally:

  • Self-canonical each page to itself. Do not canonical page 2 to page 1 — that tells Google to ignore page 2’s content entirely.
  • rel="next" and rel="prev" do nothing. Google stopped using them for indexing years ago. Keeping them is harmless; adding them is not a fix.
  • Do not noindex page 2+ unless the archive is genuinely worthless — it can strand the posts only linked from there.

Keep it from coming back

  1. One canonical host and scheme, enforced by a single 301 hop.
  2. Staging always password-protected and noindexed — check after every refresh from live.
  3. Thin archives noindexed once, deliberately.
  4. A quarterly look at the Indexing report.

Common questions

Will I be penalised for duplicate content?

Not for the ordinary kind. Penalties are for scraped or auto-generated content published deliberately. Your archives and parameters are a signal-splitting problem, not a penalty risk.

Google ignored my canonical tag.

It is a hint, not a directive — and internal links, sitemap entries and redirects all vote too. If your links point at the version Google chose, it is following your behaviour rather than your tag.

Same product on my site and Amazon — is that duplicate content?

Across domains, yes, and marketplaces usually outrank you. The answer is unique descriptions on your own site, not a technical fix.

Should I noindex my category pages?

Only if they are bare lists. A category with a real description and depth is often a strong landing page — better improved than hidden.