Find and Fix Broken Links in WordPress: Complete Workflow

Find and Fix Broken Links in WordPress: Complete Workflow

By KaizenCoders

By the end of this post you'll have a working process for broken links on a WordPress site: a way to find them, a decision tree for what to do with each one, and a bulk-fix workflow that handles a thousand links almost as fast as ten.

Most posts on this topic stop at "install a plugin and click scan." That finds the links. It doesn't tell you whether to fix, redirect, nofollow, or delete each one — which is the part that takes time. We'll cover both.

Three concrete ways a 404 hurts your site:

  • Crawl budget. Google's crawler hits dead URLs and gets nothing back. On a large site, repeated 404s slow indexing of pages that do work.
  • Bounce rate. A reader who lands on a broken link leaves immediately. That signal feeds back into rankings.
  • Affiliate revenue. A dead affiliate link doesn't pay. If you have 200 affiliate links and 5% are broken, that's 10 silently leaking revenue every month.

Internal links rot when you rename or delete pages. External links rot when other sites change their URL structure or shut down entirely. Both are inevitable. The question is whether you find them before your readers do.

These break for different reasons and need different fixes:

Type Common cause Typical fix
Internal Page renamed, post deleted, slug changed Redirect to the new URL
External Other site changed structure or went offline Replace with a working alternative, or remove
Image File deleted from media library, hotlinked image removed Re-upload, swap, or remove

Treating all three the same is a common mistake. An external broken link to a competitor blog is fine to delete. An internal broken link from your most-read post needs a redirect to preserve traffic and link equity.

Detection: what to use

You have three options, ordered cheapest-first:

1. Browser DevTools (free, manual). Open any page, right-click → Inspect → Network tab → reload. 404s show in red. Useful for spot-checking one page. Not useful at scale.

2. WordPress search-and-replace (free, no plugin). If you've migrated and know the old domain, run a database search for the old URL. The Better Search Replace plugin does this safely (with a dry-run option). This catches systematic breakage from a migration but misses ad-hoc rot.

3. A dedicated broken-link checker (recommended for any site over 50 pages). URL Shortify's Broken Link Checker crawls every link in your content on a schedule, flags the ones that 404 or redirect to a generic homepage, and emails you a digest. It runs in the background — you don't have to remember to scan.

The free WordPress.org Broken Link Checker plugin works too, but it's heavier on database load and has had compatibility issues with caching plugins. Pick whichever you'll actually leave running.

The triage decision tree

Once you have a list of broken links, this is the part that takes time if you do it case-by-case. A decision tree cuts the average decision to about ten seconds:

Is the broken link internal (points to your own site)?
├─ Yes
│   ├─ Was the target post merged into another? → Redirect to the new post
│   ├─ Was the target post deleted intentionally? → Redirect to the closest related post
│   └─ Was the target a category/tag page that no longer exists? → Redirect to the parent category
└─ No (external link)
    ├─ Does the target site still exist with similar content elsewhere? → Replace the link
    ├─ Is the link in an affiliate post and the program changed URL format? → Update with the new format
    ├─ Is the link to a competitor reference / source citation? → Remove the link, keep the text
    └─ Is the link contextual (e.g. "as discussed here…")? → Remove the sentence

Make this decision once per type of broken link, not once per link. After the first ten, you'll see patterns.

Bulk fixing with redirects

This is where most workflows fall apart. Editing 200 posts to update 200 hyperlinks is a week of work. Here's the alternative:

If you're using URL Shortify, every link you've cloaked through it is already a redirect — fixing the underlying destination updates every reference site-wide in one edit:

  1. URL Shortify → Links — filter by the broken destination's domain.
  2. Open the link's edit screen.
  3. Change the Target URL to the new destination.
  4. Save. Every post that uses that short link now redirects to the new URL.

If you have raw URLs scattered through old posts (no short link layer), the migration step is to bulk-create short links and rewrite the posts to use them. The Auto-Link Keywords feature does the post rewriting for you — define one rule, "any mention of oldsite.com/page becomes /go/oldsite-page," and it applies across your entire archive.

For systematic broken-link fixes (e.g. "redirect every URL matching /old-blog/* to /blog/*"), the CSV import accepts a spreadsheet of old → new mappings and creates them all in one shot.

The post-migration scenario

A specific case worth its own section because so many sites hit it.

You've moved from one platform to another (Squarespace to WordPress, http to https, changed permalink structure). The old URLs are gone but Google's index, your email subscribers, and every site that linked to you still know the old URLs.

The right sequence:

  1. Don't delete anything yet. Keep the old structure live (or proxy it) until step 3 finishes.
  2. Build a redirect map. A two-column CSV: old URL → new URL. For systematic changes (/?p=123/post-name), generate this programmatically. For one-offs, do them manually.
  3. Implement the redirects at the server level (nginx/Apache rewrite rules) for cleanest performance, or in WordPress with a redirect plugin if you don't have server access.
  4. Run a broken-link scan a week after going live. The scan catches anything you missed — the redirect map almost never covers 100% on the first try.
  5. Re-submit your sitemap to Google Search Console. It tells Google about the new structure faster than waiting for re-crawl.

Skipping step 4 is the most common mistake. The first week after migration is when you can still fix broken links cheaply, before they propagate into other sites' link rot lists.

A subtype that gets ignored. Images stored in the media library disappear when:

  • A user deletes a media item without checking what references it
  • A migration moves images but updates URLs incorrectly
  • A theme switch changes the image URL structure
  • Hotlinked images (referenced from other domains) are removed by the source

Most broken-link checkers cover image URLs alongside hyperlinks — Broken Link Checker reports both in the same dashboard. Triage the same way: replace if the image still exists somewhere, remove the <img> tag if it doesn't, or use a placeholder if removing it breaks the post layout.

Preventing future breaks

You can't stop other sites from changing their URLs. You can stop yourself from breaking your own:

  • Use redirects, never raw rewrites. When you rename a slug or move a post, set up the redirect from the old URL before you publish. WordPress's built-in redirect (when you change a slug on an existing post) handles this for you. Custom URL changes need an explicit rule.
  • Cloak external links through a short-link layer. Affiliate links especially. If the affiliate program changes URL format, you update one record instead of fifty posts.
  • Schedule a monthly broken-link scan. Set it once and forget. Configure the Email Digest to send you the report on the first of each month.
  • Don't delete pages without a plan. Before deleting, search for inbound internal links and either redirect them or update them in place.

A site that follows these four rules accumulates broken links at a fraction of the rate of a site that doesn't. You'll still get external rot — that's outside your control — but the internal portion (usually the worst-impact links) effectively goes to zero.

What to do next

Run a scan today. Whether you use Broken Link Checker, the free plugin, or DevTools on your top ten pages, you need a baseline before you can decide what to fix.

If the scan returns more than 50 broken links, don't try to fix them all in one session. Sort by URL — fix the systematic patterns first (one rule that fixes 30 links in one edit beats 30 individual edits), then work through the long tail.

Schedule the next scan for one week from now. The point of the workflow isn't to clear the queue — it's to keep it short enough that you can clear it whenever it appears.

If you're starting from scratch and want the scanning + redirecting + reporting in one place, set up URL Shortify and turn on the Broken Link Checker module. The default settings are sensible for any WordPress site under 100,000 pages.