Rewrite your slugs.
Redirect every URL.
A slug is the readable part of a URL. After an import or a migration, thousands of them stop matching the titles they belong to — and renaming them by hand breaks every link and search result you already have. Slug Sync rewrites them in bulk and keeps the old addresses working.
/product/product-1423/
/product/blue-cotton-shirt/
Watch 1,284 product URLs get rewritten and redirected — 38 seconds, no sound. Nothing downloads until you press play.
The problem
Nobody fixes 3,000 slugs by hand
Imports, migrations and bulk uploads leave permalinks that mean nothing to a visitor or a search engine, and Quick Edit stops being realistic past the first few dozen. Slug Sync rebuilds every one from its title, exactly as WordPress would if you saved the post with an empty slug.
Title Blue Cotton Shirt
/product/product-1423/
/product/blue-cotton-shirt/
Title Stainless Steel Kettle
/product/import-9f2a1/
/product/stainless-steel-kettle/
Title Winter Sale 2026
/2026/01/post-88/
/2026/01/winter-sale-2026/
Title About Our Workshop
/about-us-final-v2/
/about-our-workshop/
Works on posts, pages, WooCommerce products and any public custom post type.
The part that matters
Every change comes with its redirect
Renaming slugs is the easy half — WP-CLI or a SQL query will do it in a minute. Carrying every old URL across is the half that decides whether your rankings and traffic survive. Slug Sync covers it twice.
WordPress redirects it for you
Each previous slug is recorded exactly the way core does it, so the old address 301s to the new one with no redirect plugin involved. A direct database write skips this step entirely — which is why a hand-rolled bulk rename leaves every renamed URL returning a 404. This covers everything that does not nest inside a parent: posts, products and custom post types. Pages are the exception — WordPress keeps no old-slug record for them — so they rely on the redirect map beside this.
A redirect map you can import
Every applied run also exports a CSV of relative source and target pairs, ready to load into whatever handles redirects on your stack. No header row, because some importers read one as a live redirect. Published posts only, because draft permalinks are query strings rather than real URLs.
/product/product-1423/,/product/blue-cotton-shirt/
/product/import-9f2a1/,/product/stainless-steel-kettle/
/product/sku-4823-blk/,/product/merino-wool-scarf/
/product/p-00871/,/product/cast-iron-skillet/
/product/copy-of-lamp-2/,/product/brass-desk-lamp/
/product/untitled-product-7/,/product/linen-apron/
/2026/01/post-88/,/2026/01/winter-sale-2026/
/2025/11/untitled-4/,/2025/11/how-we-pack-every-order/
/2025/09/draft-copy-2/,/2025/09/choosing-a-kettle/
/about-us-final-v2/,/about-our-workshop/
/page-42/,/shipping-and-returns/
/new-page-1/,/wholesale-enquiries/
/docs/doc-117/,/docs/installing-the-plugin/
/portfolio/item-9/,/portfolio/oak-dining-table/
/events/event-2026-03/,/events/spring-open-studio/
Two columns, no header, every post type it touched — products, posts, pages and custom types. A second CSV lists each change with its title, old and new slug, both URLs, and a note column flagging duplicate titles.
How it works
Preview, review, then apply
Nothing is written until you have seen the full list of changes and decided to go ahead.
Preview
A CSV of every slug it would change, old and new URL side by side, duplicate titles flagged.
Writes nothingReview
Read the report before committing. Stop the run after its first batch to check the result on a handful of items.
Nothing written yetApply
Slugs are rewritten in batches that resume if a tab closes, and a run lock stops two administrators colliding. Every run is timestamped and reversible — it restores exactly the slugs it changed, and skips anything you have edited since.
Writes begin hereTake a database backup first, as you would before any bulk change — though step 3 is not a one-way door either way.
Safe by default
Built so it cannot quietly break your site
Changing thousands of URLs is the kind of job you only want to do once. These apply on every plan.
Quiet writes
Slugs can go straight to the posts table, skipping save_post, so a catalogue run does not fire a webhook per product or reset every sitemap date.
Undo any run
Every applied run keeps its own report and restores exactly the slugs it changed. Anything you edited since is skipped. The last fifty runs are kept.
Administrators only
Every screen and run is restricted, and reports are written to a directory with a random name.
Safe on large sites
Keyset pagination means nothing is skipped if someone publishes mid-run, and long runs don't time out.
GPL-2.0-or-later
Both are free software. Paying for Pro pays for the licence key and the updates — the full source comes with it either way.
No telemetry
The plugin never contacts a server. No account, no tracking, and Yoast indexables are cleared so canonicals don't go stale.
Pricing
Everything above is free
No item limit, no trial, nothing that expires. Pro is a separate add-on that layers title rules and term slugs on top.
Slug Sync
The complete plugin. Nothing here is ever moved behind a paywall.
Free software · WordPress 5.6+ · PHP 7.4+
Download freePlugins → Add New → Upload Plugin
- Old URLs keep working. Every previous slug is recorded, so WordPress 301s it for posts, products and custom types — plus an exportable redirect map, which is what pages use.
- Preview before anything is written. A CSV of every slug it would change, old and new URL side by side.
- Collision-accurate. Slug claims are tracked across the whole run, so the preview matches what applying actually produces.
- Quiet writes. Skip
save_postso a catalogue run doesn't fire a webhook per product or reset every sitemap date. - Undo any run. Each run keeps its own reports and restores exactly the slugs it changed.
- Resume and lock. Batch progress survives a closed tab, and two administrators can't run at once.
- Any public post type. Posts, pages, WooCommerce products and custom types.
Slug Sync Pro
An add-on that cleans the title before the slug is built — then finishes the parts of a rename you would otherwise do by hand.
Every site you own · no renewal · offline key, nothing phones home · GPL source included
Still in development. One email when it ships, nothing else — and the waiting list keeps the $4.99 launch price.
- Strip product codes and SKUs. Removes
SKU 4823-BLK,B09XYZ123and(AB-1234), while keeping the 15 in "iPhone 15". - Transliterate non-Latin titles.
Кофеваркаbecomeskofevarkaand咖啡机becomeskafeiji, instead of a slug that percent-encodes into 54 characters beginning%D0%9A. - Filler words, find and replace, word cap. Your own stop-word list, case-insensitive replacements, and a maximum word count for runaway titles.
- Term and taxonomy slugs. Categories, tags and product attributes — the slugs the free plugin leaves alone.
- Redirects for renamed terms. Rename a category and WordPress breaks its URL outright — it has no old-slug redirect for terms at all. Pro records the old slug and 301s it for you.
- Purge the cache when a run ends. A cached page is served without WordPress running at all, so until the cache clears, the 301 cannot fire. Pro purges the page cache and CDN it detects.
- Confirm the redirects held. Pro watches the URLs a run changed and lists any still returning 404 — so you hear it from the plugin, not from Search Console six weeks later.
Licence key is an Ed25519 signature verified on your own server. WordPress 6.5+, PHP 7.4+ with libsodium.
Compare
Pro is extra code, not an unlock
Everything the free plugin does today, it will keep doing. There is no quota to hit and nothing that expires.
| Feature | Slug Sync | Pro |
|---|---|---|
Bulk slug rewritingPosts, pages, products, any public post type | ||
Preview with change reportOld and new slug and URL, as CSV | ||
Old URLs keep redirectingPrevious slug recorded, WordPress 301s it — pages use the map | ||
| Exportable redirect map | ||
| Per-run undo and history | ||
Quiet writes that skip save_post | ||
| Batching, resume and run lock | ||
| Item limit | None | None |
| Strip product codes and SKUs | — | |
| Transliterate non-Latin titles | — | |
| Filler words, find and replace, word cap | — | |
Term and taxonomy slug syncCategories, tags, product attributes | — | |
Redirects for renamed termsWhere WordPress has none | — | |
Cache and CDN purge after a runWhat makes a 301 actually fire | — | |
404 watch on changed URLsConfirms the run held | — | |
| Price | Free | $4.99 once · coming soon |
FAQ
Questions people ask first
What it touches, what it leaves alone, and what to do once a run has finished.
Because neither gives you a redirect for the URLs you just changed. A direct database write skips the record WordPress uses to 301 the old address, so every renamed URL starts returning a 404 to anyone who had it bookmarked, linked or indexed. Slug Sync writes that record, exports the redirect map, shows you a collision-accurate preview before anything changes, and can undo the whole run afterwards. If nothing is indexed yet and the rename is all you need, WP-CLI is genuinely fine — use it.
Yes. Products are a public post type, so they are handled exactly like posts and pages, and they are the case the plugin was built for — imported catalogues are where slugs and titles drift furthest apart. Product variations are a separate post type and are never touched.
For posts, products and custom post types, no — the plugin records each previous slug the way WordPress does, so old URLs keep 301-ing to the new ones, and the exported redirect map is a second layer for anything you would rather handle in a dedicated redirect plugin. Pages are the exception: WordPress records old slugs only for content that does not nest inside a parent, so a renamed page needs the map rather than the built-in 301. One step is on you with the free plugin: purge your page cache and CDN once the run finishes. Pro does that for you. Sitemaps need no resubmission — Google retired its ping endpoint in 2023, so an accurate lastmod is what it reads now.
No. No item limit, no trial, nothing expires, and nothing in it today will move behind the paid add-on. Pro is separate code: it rewrites the title before a slug is built, syncs term slugs, and closes the steps a rename leaves open. It is not an unlock.
Pro is still in development and does not have a date yet. Join the waiting list on the Pro plan and you will get one email when it ships, and nothing else. The free plugin is finished and fully usable today — Pro adds title rules, term slug sync, and the follow-through after a run on top of it.
One purchase covers unlimited sites under the licensed email address, with no renewal and no site count to manage. The key is verified on your own server, so there is nothing to activate and nothing we can throttle.
The lower post ID keeps the clean slug and the other takes a numeric suffix, which is what WordPress does normally. Both are flagged in the note column of the report, so you can rename them properly if you would rather not have a suffix.
Yes. Every applied run gets a timestamped entry with an Undo button that restores the slugs recorded for that specific run. Anything you edited since then is skipped rather than overwritten.
WordPress has no old-slug redirect for terms at all. Renaming a category breaks its URL outright, with nothing catching the old one — and no redirect plugin fills that gap either, including the biggest of them, which monitors posts and pages only. That is exactly why term slugs are not in the free plugin: Pro syncs them and catches the old URL itself, alongside the exported redirect map.
No. Variations are a separate post type and are never listed.
Almost always a page cache. A cached page is served without WordPress running at all, so the 301 recorded against the old slug never gets the chance to fire. Purge the page cache and the CDN, then re-check in a private window, because a browser caches a 301 aggressively once it has seen one. If it still 404s, the post was not published when the run happened — draft permalinks are query strings rather than real URLs, so there is no old address to carry across. Pro purges the cache at the end of a run so this does not come up. If the URL was a page, there is a third cause: WordPress keeps no old-slug record for pages at all, so those rely on the exported redirect map rather than a built-in 301.
It renames them the same way, but the redirects work differently, and that is a WordPress limitation rather than a plugin one. WordPress only records a previous slug for content that does not nest inside a parent, so a renamed page gets no automatic 301 — import the exported redirect map instead. There is a second consequence worth knowing: a page's URL contains its parents' slugs, so renaming a parent also changes the URL of every page beneath it. Those child URLs are not in the reports, which list only the items whose own slug changed. Check what sits under anything you rename. Posts, products and custom post types are unaffected by either point, and the plugin says all of this on screen the moment you select a nesting type.
For posts, products and custom post types, no. WordPress itself 301s the old slug and the free plugin makes sure that record is written. For pages you do: WordPress keeps no old-slug record for content that nests inside a parent, so load the exported CSV into a redirect plugin after renaming any. Keep one anyway if you want manual redirects, regex rules or a site-wide 404 log — the CSV loads straight into it. The one thing no redirect plugin covers is terms: the largest of them monitors posts, pages and custom post types only, so a renamed category breaks its URL with nothing catching it. That is the gap Pro closes.
Left alone, WordPress keeps the original characters and the browser percent-encodes them, so Кофеварка becomes a 54-character slug beginning %D0%9A, and a Japanese title can run past 70. It works, but it is unreadable in a search result, unusable in a message, and a nightmare to read out over the phone. Pro's transliteration rewrites the title into Latin script first — Кофеварка to kofevarka, 咖啡机 to kafeiji — so the slug is legible before it is ever built.
Stop fixing slugs by hand
Preview a run in a couple of minutes and see every URL that would change before a single one is written.
