Introduction
Duplicate content is one of the most common technical SEO problems on WordPress sites, and most site owners never created it on purpose. WordPress generates it automatically: every tag, category, author, date, and media upload gets its own URL, and many of those URLs show the same posts as your main pages.
In this tutorial, you will learn what duplicate content actually is, why it hurts your search visibility, how to find every duplicate page on your WordPress site, and how to fix each type using canonical tags, noindex, redirects, and settings inside Yoast SEO. No coding is required for most fixes, though we include safe code snippets where they help.
What is duplicate content?
Duplicate content means the same (or very similar) content is reachable at more than one URL. It comes in two forms:
- Internal duplicates: the same content appears on multiple URLs of your own site, such as a post that is visible at
/blog/my-post/,/tag/seo/,/author/alok/, and/2026/10/. - External duplicates: your content appears on other domains, either through syndication you agreed to or through scrapers that copied it.

This guide focuses mainly on internal duplicates because they are the ones you fully control and the ones that affect nearly every WordPress site.
Does Google penalize duplicate content?
No, not in the way most people fear. Google has stated repeatedly that there is no “duplicate content penalty” for ordinary sites. A manual action only applies to deliberately deceptive duplication, such as scraping other sites or spinning the same page across dozens of domains.
The real damage is quieter and still costly:
- Split ranking signals. When three URLs show the same content, backlinks, internal links, and engagement signals get divided among them. None of the three ranks as well as one consolidated page would.
- Google picks the canonical for you. If you do not tell Google which version is the original, it chooses one itself. It often picks the wrong one, such as a tag archive instead of your carefully written post.
- Wasted crawl budget. Googlebot spends time crawling near-identical pages instead of discovering your new or updated content. On large sites and WooCommerce stores, this can delay indexing by days or weeks.
- Diluted keyword targeting. Two of your own posts competing for the same query (keyword cannibalization) usually means both rank lower than a single merged page would.
So the goal is not to avoid a penalty. The goal is to make sure every piece of content has exactly one URL that Google treats as the original.
9 common causes of duplicate content in WordPress
Before you can fix duplicates, you need to know where WordPress creates them. The table below lists the usual suspects, with an example of the duplicate URL each one produces.
| # | Cause | Example duplicate URL | How common |
|---|---|---|---|
| 1 | Tag and category archives | /tag/wordpress-tips/ showing full post content | Very common |
| 2 | Date and author archives | /2026/10/, /author/admin/ | Very common |
| 3 | Paginated archives | /blog/page/2/, /category/seo/page/3/ | Very common |
| 4 | Media attachment pages | /sample-image/ (a page with just one image) | Very common |
| 5 | HTTP vs HTTPS, www vs non-www | http://example.com and https://www.example.com | Common on older sites |
| 6 | URL parameters | /post/?utm_source=newsletter, /shop/?orderby=price | Common, especially WooCommerce |
| 7 | Comment pagination and reply links | /post/comment-page-2/, /post/?replytocom=15 | Common |
| 8 | Trailing slash and capitalization variants | /about vs /about/, /About/ | Occasional |
| 9 | Overlapping posts (keyword cannibalization) | Two posts both titled “Best WordPress Caching Plugins” | Common on older blogs |
A closer look at the biggest offenders
Archives. If your theme shows full posts on archive pages instead of excerpts, every tag you add creates a page that is almost identical to your blog index. A post with five tags can appear in full on six or more URLs.
Attachment pages. Every image you upload gets its own URL. These pages contain almost no text, so Google sees hundreds of thin, near-identical pages. This is the single most overlooked duplicate content source on WordPress sites.
WooCommerce filters. Layered navigation, sorting, and product variations create thousands of parameter URLs (?filter_color=red&orderby=popularity) that show the same products in a different order.
Protocol and host mismatches. If your SSL certificate was added after launch and redirects were never set up, Google may still see up to four versions of every page.
How to find duplicate content on your WordPress site
You do not need a paid tool to start. Work through these five methods in order; the first two alone will catch most problems.
Method 1: Google Search Console Page indexing report
This is the most reliable source because it shows what Google itself has decided.
- Open Google Search Console and select your property.
- In the left menu, go to Indexing > Pages.
- Scroll to the Why pages aren’t indexed table and look for these three statuses:
- Duplicate without user-selected canonical – Google found duplicates and you never told it which one is the original. These need a fix.
- Duplicate, Google chose different canonical than user – you set a canonical, but Google disagreed and picked another URL. Usually means the pages are too similar or your internal links point to the other version.
- Alternate page with proper canonical tag – this one is fine. Google saw your canonical and respected it. No action needed.
- Click any status to see the affected URLs, then export the list.

Also use the URL Inspection tool on individual pages. It shows both the “User-declared canonical” and the “Google-selected canonical”. If they differ, that page needs attention.
Method 2: Google site: search operators
Type these searches into Google to spot duplicates quickly:
site:yourdomain.com "an exact sentence from your post"– shows every URL on your site containing that sentence.site:yourdomain.com inurl:tag– lists indexed tag archives.site:yourdomain.com inurl:attachmentorsite:yourdomain.com inurl:?attachment_id– finds indexed media pages.site:yourdomain.com inurl:page/– finds indexed paginated archives."an exact sentence from your post"(without the site: operator) – reveals external sites that copied your content.
Method 3: Yoast SEO’s built-in signals
If you use Yoast SEO, open Yoast SEO > Settings > Content types and Categories & tags. Any content type or taxonomy with Show in search results switched on is being indexed. Review each one and ask whether that archive deserves its own ranking. Yoast Premium also adds an Orphaned content and Cornerstone content filter in the post list, which helps you spot posts competing on the same topic.
Method 4: Site crawlers
For sites with more than a few hundred URLs, run a crawler:
- Screaming Frog SEO Spider (free up to 500 URLs) – use the Content > Duplicates tab for exact duplicates and the Near Duplicates filter (enable it under Configuration > Content > Duplicates) to catch pages that are 90% or more similar. Also check the Canonicals tab for missing or non-indexable canonicals.
- Siteliner (free for up to 250 pages) – gives you a duplicate-content percentage for every page and highlights the matching text.
- Ahrefs Site Audit, Semrush Site Audit, or Sitebulb – paid tools that flag duplicate titles, duplicate meta descriptions, duplicate H1s, and canonical issues in one report.
Method 5: Plagiarism checkers for external copies
Use Copyscape (paste your URL) or Grammarly’s plagiarism checker to find other sites that republished your content. For ongoing monitoring, set up a Google Alert for a distinctive sentence from each important article.
Quick audit checklist
- Export all “Duplicate” statuses from Search Console
- Run
site:searches for tag, attachment, author, and page/ URLs - List which archives Yoast is set to index
- Crawl the site and export duplicate titles and near-duplicate pages
- Check that every page loads only at one protocol and host
How to fix duplicate content in WordPress (step by step)
There are only three real tools for fixing duplicates, and choosing the right one matters:
| Fix | What it does | Use it when |
|---|---|---|
Canonical tag (rel="canonical") | Tells Google which URL is the original while keeping the duplicate accessible to visitors | The duplicate page is useful to people (filtered product list, paginated archive, print version) |
| Noindex meta tag | Keeps the page out of search results but still lets visitors and crawlers reach it | The page has no standalone search value (tag archives, date archives, thin author pages) |
| 301 redirect | Permanently sends visitors and link equity to one URL | The duplicate should not exist at all (HTTP version, attachment pages, a merged post) |
A quick rule: redirect what should not exist, noindex what visitors need but searchers do not, and canonicalize what both need.

Fix 1: Noindex tag, date, and format archives in Yoast SEO
Tag archives rarely deserve a spot in search results, and date archives almost never do.
- Go to Yoast SEO > Settings in your WordPress dashboard.
- Open Categories & tags in the left sidebar and click Tags.
- Turn off Show tags in search results. Yoast adds a
noindex, followtag to every tag archive. - Go to Advanced > Date archives and either disable date archives entirely or turn off Show date archives in search results.
- Do the same under Advanced > Format archives if your theme uses post formats.
- Click Save changes.
Keep categories indexed if they are well organized and have a useful intro description. If a category contains only one or two posts, noindex that single category by editing it under Posts > Categories, scrolling to the Yoast SEO box, opening Advanced, and setting Allow search engines to show this Category in search results? to No.
Fix 2: Handle author archives
- Single-author site: your author archive is an exact copy of your blog page. Go to Yoast SEO > Settings > Advanced > Author archives and disable author archives (Yoast then redirects them to the homepage) or turn off Show author archives in search results.
- Multi-author site: keep author archives indexed, but make each author profile unique with a full bio, photo, and social links. Yoast outputs Person schema automatically when the profile is complete.
Fix 3: Redirect media attachment pages
This is the fix with the biggest impact for most sites.
- Go to Yoast SEO > Settings > Advanced > Media pages.
- Switch the Enable media pages toggle to Off (Yoast’s recommended setting).
- Yoast now redirects every attachment URL to the image file itself, so the thin HTML page disappears.
If you prefer to redirect to the parent post instead of the raw image, add this to a small custom plugin or via a code snippets plugin:
add_action( 'template_redirect', function () {
if ( is_attachment() ) {
global $post;
$target = ( $post && $post->post_parent ) ? get_permalink( $post->post_parent ) : home_url( '/' );
wp_safe_redirect( $target, 301 );
exit;
}
} );Skip this fix on photography or portfolio sites where each image page has real captions, EXIF data, and descriptions.
Fix 4: Fix paginated archives correctly
Do not canonicalize page 2, 3, and 4 to page 1. Google treats this as a mistake and may ignore your canonicals site-wide. Instead:
- Let each paginated page keep a self-referencing canonical (Yoast does this by default).
- Yoast also adds
rel="next"andrel="prev"links. Google no longer uses them for indexing, but they do no harm and other engines still read them. - If you want paginated pages out of search results entirely, Yoast Premium is not needed; use this filter to noindex page 2 and beyond:
add_filter( 'wpseo_robots', function ( $robots ) {
if ( is_paged() ) {
return 'noindex, follow';
}
return $robots;
} );Fix 5: Force one protocol and one host (HTTPS + www or non-www)

- Go to Settings > General and make sure both WordPress Address (URL) and Site Address (URL) use the exact version you want, for example
https://www.example.com. - Add a server-level 301 redirect so every other variant lands on that version. On Apache, add this at the top of
.htaccess(back it up first):
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]On Nginx, use a return 301 https://www.example.com$request_uri; server block for the non-preferred hosts. Most managed hosts (Kinsta, WP Engine, SiteGround, Cloudways) offer a one-click “Force HTTPS” switch that does the same thing. 3. Fix mixed content with a plugin like Really Simple SSL or Better Search Replace so internal links do not point back to HTTP. 4. Add the preferred version as a property in Search Console and submit your sitemap there.
Fix 6: Clean up URL parameters
- Yoast SEO automatically sets the canonical of
/post/?utm_source=xto/post/, which handles tracking parameters. - For WooCommerce filters and sorting, Yoast’s canonical also points filtered views back to the clean category URL. Make sure your filter plugin does not override it.
- For search result pages (
/?s=keyword), Yoast noindexes them by default. Verify under Settings > Advanced > Special pages. - Remove
?replytocom=duplicates by going to Yoast SEO > Settings > Advanced > Crawl optimization and enabling Remove ?replytocom links (Premium feature) or simply disable threaded comments under Settings > Discussion. - Never use
robots.txtto block parameter URLs; Google cannot see the canonical tag on a blocked page.
Fix 7: Stop comment pagination
Go to Settings > Discussion and uncheck Break comments into pages. If you have posts with hundreds of comments and need pagination for speed, leave it on; WordPress sets a canonical to the main post automatically when Yoast is active.
Fix 8: Merge overlapping posts (keyword cannibalization)

- In Search Console, open Performance > Search results, filter by a query, and switch to the Pages tab. Two or more of your URLs appearing for the same query is cannibalization.
- Choose the winner: usually the post with more backlinks and traffic.
- Move any unique, valuable sections from the weaker post into the winner.
- Set the weaker post to Draft or Private (do not permanently delete it yet).
- Add a 301 redirect from the old URL to the winner. Yoast SEO Premium’s Redirects manager offers to create one automatically when you trash or change a slug. On the free version, use the Redirection plugin.
- Update internal links that pointed to the old post.
Fix 9: Set a canonical manually when you need one
For any individual post or page, open the editor, scroll to the Yoast SEO box, click Advanced, and paste the original URL into the Canonical URL field. Use this for:
- Content you republished from another site you own (point to the original).
- Landing-page variants used in ads.
- Printer-friendly or AMP-style alternates.
Yoast outputs a self-referencing canonical on every page by default, which is exactly what Google recommends, so you only need this field for exceptions.
Fix 10: Deal with scraped and syndicated content
- Go to Settings > Reading and set For each post in a feed, include to Excerpt. Scrapers that pull your RSS feed only get a summary.
- When you syndicate on purpose (Medium, LinkedIn, partner blogs), ask the partner to add a canonical tag pointing to your URL, or at minimum a noindex tag plus a link to the original. Publish on your site first and wait a few days before syndicating.
- If a site stole your content, send a polite takedown request to the owner, then to their host, then file a DMCA removal request with Google if they refuse.
How to prevent duplicate content going forward
Fixing duplicates once is good; setting up your site so they never return is better. Build these habits into your publishing workflow.
- Use excerpts on archive pages. In your theme or block editor template, display excerpts rather than full posts on category, tag, and blog index pages. In the Site Editor, edit the Query Loop block and switch the Post Content block to Post Excerpt.
- Limit tags. Use 3 to 5 tags per post at most and reuse existing tags. Avoid tags that apply to only one post; they become thin, duplicate archives.
- Write a unique intro for each indexed category. A 100 to 200 word description at the top of each category archive gives Google a reason to treat it as a distinct page. Add it under Posts > Categories > Edit > Description.
- Check for an existing post before writing a new one. Search your own site for the target keyword first. If a post already covers it, update that post instead of publishing a competitor.
- Keep the Yoast SEO settings from this guide locked in. After major theme or plugin changes, revisit Yoast SEO > Settings to confirm tags, date archives, author archives, and media pages are still configured correctly.
- Set up redirects whenever you change a URL. Yoast Premium does this automatically; otherwise, add one manually in the Redirection plugin before you change a slug, move a post to a new category, or change your permalink structure.
- Review Search Console monthly. Open the Page indexing report and watch the “Duplicate” statuses. A rising count means a new plugin, theme, or filter has started producing duplicate URLs.
- Be careful with staging sites. Make sure your staging or development copy is password protected or set to Discourage search engines under Settings > Reading. An indexed staging site duplicates your entire domain.
Frequently asked questions
Does WordPress create duplicate content by default?
Yes. Out of the box, WordPress generates tag, category, date, author, and attachment archives, plus paginated versions of each. None of these are harmful on their own, but without an SEO plugin to manage canonicals and indexing, many of them get indexed as near-duplicates of your main content.
Should I use noindex or canonical for duplicate pages?
Use canonical when the duplicate page is still useful to visitors and you want its link equity passed to the original. Use noindex when the page has no reason to appear in search at all. Never combine noindex with a canonical pointing elsewhere on the same page; Google treats that as a conflicting signal.
Will fixing duplicate content improve my rankings?
Usually, yes, but gradually. Consolidating signals into one URL typically shows results within 2 to 8 weeks as Google recrawls the affected pages. The biggest gains come on sites where important posts were competing with their own tag archives or where keyword cannibalization was splitting traffic.
Does Yoast SEO fix duplicate content automatically?
Partly. Yoast adds self-referencing canonicals to every page, canonicalizes parameter URLs, noindexes internal search results, and redirects attachment pages once you turn media pages off. You still need to decide which archives to noindex, set up HTTPS redirects, and merge overlapping posts yourself.
How long should I wait before checking results?
Give Google 1 to 2 weeks after making changes, then check the Page indexing report in Search Console. The count of “Duplicate without user-selected canonical” pages should fall. Use URL Inspection and click Request indexing on your most important pages to speed things up.
What about duplicate content across languages?
Translated pages are not duplicates, but Google needs hreflang tags to understand the relationship. Multilingual plugins such as WPML, Polylang, and TranslatePress add them automatically. Do not canonicalize translations to the original language version.
Can I use robots.txt to block duplicate pages?
Avoid it. A page blocked in robots.txt cannot be crawled, so Google never sees its canonical or noindex tag, and the URL can still appear in results with no description. Use noindex or canonical tags instead.
Conclusion
Duplicate content on WordPress is rarely a penalty problem, but it is almost always a lost-opportunity problem. Every archive, attachment page, and parameter URL that Google indexes alongside your real content pulls a little authority away from the page you want to rank.
The fix is a short, repeatable routine: find the duplicates in Search Console and with a crawler, decide for each type whether it should be redirected, noindexed, or canonicalized, apply the Yoast SEO settings covered above, and recheck Search Console after two weeks. Most sites can complete the entire cleanup in under an hour, and the result is a tighter site that Google crawls faster and ranks more confidently.
If you found this guide useful, you may also want to read our tutorials on setting up Yoast SEO correctly, creating a WordPress redirect without a plugin, and speeding up Google indexing for new posts.
Need help fixing duplicate content on your site?
Most of the fixes in this guide take under an hour. Some don’t: a WooCommerce store with thousands of filter URLs, a site that moved to HTTPS years ago without redirects, or a blog with dozens of posts competing for the same keywords. If that sounds like your site, the WPInterface team can do the cleanup for you.
| If your site needs… | Our service |
|---|---|
| A full audit and fix of duplicate content, canonicals, indexing and crawl issues | Technical SEO for WordPress |
| Yoast SEO set up correctly from the start, including the archive and media settings above | Premium SEO Services (Must-Have SEO Setup) |
| A move to HTTPS, a new domain or new permalinks with every redirect in place | WordPress Migration |
| Faster crawling and better Core Web Vitals once the duplicates are gone | Speed & Core Web Vitals Optimization |
| Ongoing monitoring so new duplicates, broken redirects and indexing drops get caught early | WordPress Care Plans |
Not sure which one fits? Tell us about your site, and we’ll recommend the right next step, or browse all WPInterface services.
Reactions
How did this make you feel?
Be the first to react
One reaction per visitor. Tap again to change or remove it.






Leave a reply