WP Manifestindependent plugin directory
manifest / seo / broken-link-logger

404 & Broken Link Logger

Logs every 404 hit on your WordPress site (URL, referrer, hit count) and lets you redirect any of them to a working URL in one click — no bloated SEO suite required.

by Mc Glenn Tangalin · github.com/mcglenn07/broken-link-logger · website

0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/mcglenn07/broken-link-logger/archive/refs/heads/main.zip

Readme

=== 404 & Broken Link Logger === Contributors: mcglenn07 Tags: 404, broken links, redirect, seo, logging Requires at least: 5.8 Tested up to: 6.6 Requires PHP: 7.4 Stable tag: 1.0.0 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html

Logs every 404 hit on your site and lets you redirect it to a working URL in one click, right from the WordPress admin.

== Description ==

Most sites accumulate broken links over time — old blog posts get renamed, products get discontinued, external sites link to pages that no longer exist. Each one is a visitor (or search engine crawler) hitting a dead end. This plugin quietly logs every 404 your site serves and gives you a simple admin screen to do something about it.

Features

  • Logs every 404 hit: URL, last referrer, hit count, first/last seen.
  • Hits are grouped and counted, not duplicated — the same broken URL hit 50 times is one row with a count of 50, not 50 rows.
  • Sortable, searchable admin list table (Tools → Broken Links).
  • One-click "Redirect this" — turns a logged 404 into a working 301/302 redirect immediately, no separate redirect-manager plugin needed.
  • CSV export for sharing a broken-link report with a content team or SEO consultant.
  • Configurable ignore rules: skip logged-in users, skip known bot User-Agents, skip URL patterns (e.g. /wp-content/uploads/*) by glob pattern.
  • Automatic cleanup of old, unresolved entries after a configurable retention window (default 90 days, 0 = keep forever).
  • No tracking, no external requests, no bloat — two small custom tables, no JS framework, no build step.
  • Privacy-conscious: visitor IPs are never stored in plain text, only a salted one-way hash.

Why this instead of a big all-in-one SEO suite?

Many sites already have an SEO plugin and don't want a second one duplicating its redirect manager, or don't want to install a 2MB plugin just to find broken links. This plugin does exactly one job, does it with two small indexed database tables, and gets out of the way.

== Installation ==

  1. Upload the broken-link-logger folder to /wp-content/plugins/, or install the zip via Plugins → Add New → Upload Plugin.
  2. Activate the plugin through the "Plugins" screen.
  3. Visit Tools → Broken Links to see logged 404s as they come in.
  4. Visit Settings → Broken Link Logger to tune ignore rules and retention.

== Frequently Asked Questions ==

= Does this slow down my site? =

Logging only runs on requests WordPress has already determined are a 404 — normal page loads are untouched except for one early, indexed lookup against the redirects table (to see if a redirect rule should fire instead of showing your 404 page).

= Does it store visitor IP addresses? =

No. A salted SHA-256 hash of the IP is stored for potential future unique-visitor de-duplication, but the raw IP is never written to the database.

= What happens to my data if I deactivate the plugin? =

Nothing — deactivating just stops new logging. Your data is only removed if you explicitly delete the plugin from the Plugins screen, which removes both custom tables and all plugin options.

= Can I bulk-resolve or bulk-delete entries? =

Yes, the admin list table supports bulk "Delete" and "Mark Resolved" actions, plus per-row "Redirect this", "Visit", and "Delete" actions.

== Screenshots ==

  1. The Tools → Broken Links admin screen, listing logged 404s with hit counts.
  2. The "Redirect this" quick-action form.
  3. Plugin settings: ignore rules and retention.

== Changelog ==

= 1.0.0 =

  • Initial release.

== Upgrade Notice ==

= 1.0.0 = Initial release.

Read the full README on GitHub →