Home›WordPress SEO audit›Validate a permalink change

WordPress · Permalinks and redirects

WordPress Permalink Changes: Validate URLs, Redirects and Canonicals

Changing WordPress permalinks breaks old URLs unless every one redirects. Export the old URLs, crawl them after the change, and confirm each returns one 301 to the right page.

3 old URL sources2 crawls after the change1 hop per old URL8 checks24 item checklist

WordPress · Permalink structure, 301 redirects and canonical URLs

A permalink change rewrites every URL on the site in one click. WordPress redirects some old URLs automatically, but not all, and it says nothing about the ones it missed. The broken URLs surface weeks later as 404s in Search Console, lost backlinks and a traffic drop.

The safe version takes three steps: save every old URL before the change, crawl that list after the change, and confirm each one lands on the right page in a single 301 redirect.

What can go wrong

Each kind of permalink change breaks a different set of URLs. Knowing which one you made tells you where to look first.

ChangeWhat breaks
Date-based to Post nameOld /2021/05/post/ URLs 404 if WordPress's guess fails, especially for custom structures
Category base changedEvery /category/x/ URL 404s without a wildcard redirect
Single slug editedOld URL 404s unless a redirect plugin caught the slug change
WooCommerce product base changed/product/ URLs and /product-category/ URLs break together
Custom post type rewrite slug changedArchive and single URLs both move, and permalinks need a flush
Repeated changes over the yearsRedirects stack: A to B to C, wasting crawl and diluting signals

Even when redirects work, three things often stay on the old URLs: internal links in post content, canonical tags cached by a plugin, and the XML sitemap until it regenerates.

Before the change: build the old URL list

The redirect check is only as good as the list of old URLs you test. Combine three sources so nothing is missed.

CrawlEvery 200 URL linked on the live site
Search ConsoleURLs with traffic but no internal links
BacklinksExternal link targets you can't edit
  1. Crawl the live site. Run SiteAud!tLint and export every 200 URL. This is also your baseline audit.
  2. Export from Search Console. Performance report, Pages tab, last 16 months. This catches URLs that get traffic but aren't linked internally anymore.
  3. Export backlink targets. Pull them from Backlink Audit. External links to old URLs are the ones you can't edit, so their redirects matter most.
  4. Merge and dedupe into one list. Keep it, since you'll crawl it again after the change.
  5. Check existing redirects. Crawl the list once now. Any URL already redirecting will become a redirect chain after the change, so note it.
  6. Use staging first if you can. Make the change there and run the steps below before touching production.

After the change: what to check

  1. Flush permalinks by opening Settings > Permalinks, and purge every cache.
  2. Crawl the old URL list. Upload it as a URL list rather than crawling from the homepage, since nothing links to the old URLs anymore.
  3. Crawl the site normally and compare it against the baseline in Audit Comparison.
CheckExpected result
Old URL status301, never 302, 404 or 200
Redirect hopsExactly one hop to the final URL
Redirect targetThe matching new page, not the homepage or a category
New URL status200, indexable
Canonical on new URLSelf-referencing, new URL
Internal linksPoint straight to new URLs, no redirects in between
XML sitemapLists only new URLs
hreflang and schema URLsUpdated to new URLs, if used

How to identify the scope

Group failures by old URL pattern. The pattern tells you whether you're missing one rule or a handful of individual redirects.

Every /category/ URL failsCategory baseOne missing wildcard redirect, not 200 individual rules.
Only some posts failSlugs and parentsLook for edited slugs, special characters, or a parent page that also moved.
Only /product/ URLs failWooCommerceThe product base changed, so check /product-category/ too.
Old URLs hop twice or moreRedirect chainsEarlier changes stacked on top of this one.

How to validate the fix

  1. Add the missing rules. For a base change, use a regex rule such as /category/(.*)$ to /blog/$1 in your host or the Redirection plugin.
  2. Flatten chains. Point every old redirect directly at the final URL.
  3. Update internal links with a database search-replace, so links don't rely on redirects.
  4. Recrawl the old URL list. Target: 100% return one 301 to a 200 page.
  5. Recrawl the site and compare. Target: zero new 404s, zero internal redirects, no change in indexable URL count.
  6. Submit the new sitemap and monitor Search Console's Not found report for two to four weeks.
100%Old URLs returning one 301 to a 200 page
0New 404s and internal redirects
±0Change in indexable URL count

Downloadable checklist

Tick items as you go, then download the list as CSV for a spreadsheet or ticket, or print it and save as PDF. Your ticks are included in the download.

Common mistakes

  • Testing a few URLs by hand. WordPress's automatic redirect works for the posts you check and fails for the ones you don't. Test the full list.
  • Using 302 redirects. Some plugins default to temporary redirects. Set 301.
  • Redirecting everything to the homepage. Google treats it as a soft 404, and the link value is lost.
  • Forgetting the category base. Post redirects work, while every category archive 404s.
  • Leaving internal links on old URLs. Every click and crawl goes through a redirect hop.
  • Changing the structure twice. Each change adds a hop to old redirects unless you flatten them.
  • Deactivating the redirect plugin later. Its rules disappear with it. Move permanent rules to the server or host level.
  • Not flushing permalinks after registering a custom post type or changing a rewrite slug, which causes 404s even though the settings look correct.

Two crawls, one list

Changing a permalink setting takes ten seconds. Proving every old URL still works takes one saved list and two crawls. Do the second part, and the change costs you nothing.