=== IsaacVarner Link Scanner ===
Contributors: isaacvarner
Tags: broken links, link checker, dead links, broken link checker, 404
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.0.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Find the broken links in your posts and pages. Scans run only while you have the plugin page open, with no background cron and no scheduled tasks.

== Description ==

Broken links cost you readers and search rankings. This plugin finds them, and it is built so that looking for them never costs you anything while you are not looking.

**It does nothing at all until you open it and press Start.**

The scan runs from the Tools screen, one small batch at a time, and stops the moment you close the tab. There is no scheduled task and no background worker. When the scan finishes, the plugin returns to using no resources.

= How it works =

* **No background cron.** The plugin registers no scheduled events of any kind.
* **Each unique link is checked once**, however many posts it appears in. A link in your footer that appears on five hundred pages is one request, not five hundred.
* **HEAD requests first**, falling back to a full request only when a server needs one, so remote sites are asked for as little as possible.
* **Nothing runs on the front end.** No code executes for your visitors. When idle, the plugin holds two small database tables and does nothing else.

= Four results, not one =

Not every link that fails an automated check is actually broken. Results are separated so you can tell the difference:

* **Broken** — the link is genuinely gone. 404, DNS failure, connection refused.
* **Blocked** — the server answered but refused an automated request (401, 403, 429). These normally work fine in a browser, so they are listed apart from real failures.
* **Redirect** — the link resolves, but somewhere else now. The destination is shown. If that destination is itself dead, the link is reported as broken instead.
* **Working** — verified reachable.

Any link you do not care about can be ignored, and it stays ignored.

= Polite to the sites it checks =

Checking a link means making a request to somebody else's server. This plugin waits at least a second between requests to the same host, sets a short timeout, and identifies itself with a user agent containing your site address. These are not configurable.

= Honest about incomplete scans =

If a scan is stopped or interrupted, the plugin says so and tells you how many links were never checked, so a short list of broken links is never mistaken for a clean site.

== Installation ==

1. Install through Plugins → Add New, or upload the folder to `/wp-content/plugins/`.
2. Activate the plugin.
3. Go to **Tools → IsaacVarner Link Scanner** and press **Start scan**.

That is the whole setup. There is nothing to configure.

== Frequently Asked Questions ==

= Does this slow my site down? =

No. Nothing runs on the front end, and nothing is scheduled. The plugin does work only while you are on its page with a scan running.

= What happens if I close the tab mid-scan? =

The scan stops. Results found so far are kept, and the plugin tells you how many links remain unchecked so the report is not mistaken for a complete one. You can start a fresh scan whenever you like.

= How long does a scan take? =

It depends on how many unique links you have. Because requests to the same host are deliberately spaced at least a second apart, a site with many links pointing at a handful of domains takes longer than the raw link count suggests. That pacing is intentional and cannot be turned off.

= Why is a working link showing as "Blocked"? =

Some servers refuse requests that do not come from a normal browser, answering 401, 403 or 429 instead. The link is fine for your readers. It is listed separately so you do not spend time on links that are not actually broken.

= Does it check images and other media? =

Not in this version. It checks links in the content of your posts and pages.

= Does it work on WordPress Multisite? =

This version is built and tested for single-site installations. It may work on a network install, but that has not been verified, so it is not claimed. Multisite support is planned once the single-site version is settled.

= Does it delete its data when I uninstall it? =

Yes. Uninstalling drops both database tables and removes all options. Nothing is left behind.

== Screenshots ==

1. Broken links, grouped by URL and showing which post each one appears in.
2. A link that answered but refused an automated request is listed under Blocked rather than Broken, so a link that works for your readers is never reported as dead.
3. Before a scan. The plugin has registered nothing and is doing nothing.
4. A scan in progress. It runs only while this page is open and stops when you leave.

== Changelog ==

= 1.0.1 =
* Fixed: the results from a previous scan stayed on screen while a new scan was running, even though starting a scan clears them. The list is now replaced for the duration of the scan.
* Fixed: stopping a scan now refreshes the page, so the partial results and the unchecked count are accurate immediately.
* Fixed: status messages no longer break words in the middle when they wrap. The status column is also wider, so most messages now fit on one or two lines.

= 1.0.0 =
* First release.
