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.
| Change | What breaks |
|---|---|
| Date-based to Post name | Old /2021/05/post/ URLs 404 if WordPress's guess fails, especially for custom structures |
| Category base changed | Every /category/x/ URL 404s without a wildcard redirect |
| Single slug edited | Old 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 changed | Archive and single URLs both move, and permalinks need a flush |
| Repeated changes over the years | Redirects 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.
- Crawl the live site. Run SiteAud!tLint and export every 200 URL. This is also your baseline audit.
- Export from Search Console. Performance report, Pages tab, last 16 months. This catches URLs that get traffic but aren't linked internally anymore.
- 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.
- Merge and dedupe into one list. Keep it, since you'll crawl it again after the change.
- Check existing redirects. Crawl the list once now. Any URL already redirecting will become a redirect chain after the change, so note it.
- Use staging first if you can. Make the change there and run the steps below before touching production.
After the change: what to check
- Flush permalinks by opening Settings > Permalinks, and purge every cache.
- 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.
- Crawl the site normally and compare it against the baseline in Audit Comparison.
| Check | Expected result |
|---|---|
| Old URL status | 301, never 302, 404 or 200 |
| Redirect hops | Exactly one hop to the final URL |
| Redirect target | The matching new page, not the homepage or a category |
| New URL status | 200, indexable |
| Canonical on new URL | Self-referencing, new URL |
| Internal links | Point straight to new URLs, no redirects in between |
| XML sitemap | Lists only new URLs |
| hreflang and schema URLs | Updated 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.
How to validate the fix
- 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.
- Flatten chains. Point every old redirect directly at the final URL.
- Update internal links with a database search-replace, so links don't rely on redirects.
- Recrawl the old URL list. Target: 100% return one 301 to a 200 page.
- Recrawl the site and compare. Target: zero new 404s, zero internal redirects, no change in indexable URL count.
- Submit the new sitemap and monitor Search Console's Not found report for two to four weeks.
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.
Related resources
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.