Description
LinkTender checks the links and images in your content from your own server, in small background batches, and lists the ones that are broken, redirected or could not be verified. It needs no account and no API key, and it sets no limit on the number of links. Your content is not sent to any outside service.
How link results are decided
- A link is marked Broken when the server answers 404 (Not Found) or 410 (Gone). The result is re-checked over the next 24 hours.
- Temporary problems (timeouts, 5xx server errors, DNS or connection failures) are retried three times over 24 hours (after 2, 10 and 24 hours). The link is marked Broken only if it still fails after the last retry.
- When a site blocks automated requests, the link is marked Unverified instead of Broken. This covers bot challenge pages (for example Cloudflare or Amazon’s captcha page), 401, 403 and 429 answers, and the 400 and 999 codes that Facebook and LinkedIn return to automated requests. You can open these links in your browser and click Mark as fine.
- If your own server cannot reach the internet, or cannot reach its own site, the affected links are marked Unverified (or keep their earlier status) and are checked again later.
- Links to your dashboard (wp-admin) and login page are not checked.
Gentle on your server and database.
- Checks run in time-boxed background batches (WP-Cron, or Action Scheduler when another plugin provides it) with a lock, so two batches never overlap.
- A few links are checked at the same time, always on different domains. Requests to the same domain are spaced out, and each request has a timeout.
- Tested on a site with 20,000 posts and over 90,000 unique links: each batch stays under about 1,300 database queries and 65 MB of memory.
- HEAD requests are tried first, with a GET fallback for servers that answer HEAD badly. Up to 5 redirects are followed.
- Data lives in two small tables of its own. WordPress core tables are never altered.
- A “Pause checking” switch and a Health screen showing table sizes, the last batch and the queue.
What gets scanned
- Posts, pages and every public custom post type, plus synced patterns and navigation blocks
- Gutenberg blocks (links, buttons, images, embeds, navigation links)
- Elementor page data (text, buttons, images)
- Shortcode-based page builders such as Divi, WPBakery and Avada: URLs in shortcode settings (buttons, images, video,
link="url:...") are read as text. No shortcode is run to do this. - Approved comments (links in the comment text) and, optionally, commenters’ website links
- Custom fields, including ACF text and URL fields
- Navigation menus (custom links) and widgets, both classic and block widgets
- Excerpts, images, iframes, video, audio and embeds
Fix links in one click
- One row per URL, listing every place it appears.
- Edit URL replaces it everywhere: post content (including shortcode settings), custom fields, Elementor data, comments, menus and widgets.
- Unlink removes the link and keeps the text.
- Use final URL updates redirected links to their destination. It is not offered when a redirect ends on a login, consent or captcha page.
- Recheck, Mark as fine or Ignore domain.
- Filter by status (broken, redirected, unverified), location, link type or domain, and search by URL.
Import settings from another link checker
If the Broken Link Checker plugin was used on the site before, LinkTender Health & Tools can import its exclusion list, check interval, timeout, front-end options and dismissed links. That plugin’s data is only read, never changed.
Broken links are not changed on your public site unless you turn on the optional strike-through or rel=”nofollow”.
Privacy and outgoing requests: LinkTender sends no data to us or anyone else, and it has no update checks, licence calls or tracking. Activating the plugin only creates its two tables; it prints nothing, schedules nothing and makes no outgoing requests, and front-end page views are not changed. Link checking starts only after an administrator clicks Start checking links on the LinkTender screen. Deactivating the plugin stops checking; after re-activation it waits for the button again. From then on, the only outgoing requests are the link checks themselves, which go to the URLs found in your content. An optional “Connectivity check” setting (off by default) lets LinkTender send one HEAD request to wordpress.org, at most every 10 minutes, when checks fail at the network level, to find out whether your server is online. No data is sent with it.
External services
LinkTender does not rely on any external service, and it sends no data about your site or its visitors to us or to anyone else.
- Link checks. After an administrator clicks Start checking links, LinkTender sends a HEAD request (or a GET request when a server answers HEAD badly) to each URL found in your own content, to see whether it still works. Each request goes only to the address of that link, and carries only standard browser-style request headers (no cookies, and no information about your site or its visitors). Nothing is requested before the button is clicked, and checking stops when you pause or deactivate the plugin.
- Optional connectivity check (wordpress.org), off by default. Only if you turn on the connectivity check under LinkTender Settings (“ask wordpress.org whether this server is online”), and only when a link check fails at the network level (DNS error, refused connection or timeout), LinkTender sends one HEAD request to https://wordpress.org/ (at most once every 10 minutes) to find out whether your server is online. No data is sent with it. WordPress.org terms of service and privacy policy.
Screenshots





Installation
- Install and activate the plugin from Plugins Add New, or upload the
linktenderfolder to/wp-content/plugins/. - Open LinkTender in the admin menu and click Start checking links. Nothing is scanned or checked before that. The first scan then runs in the background, and results appear as links are checked.
- Optionally, adjust what is scanned under LinkTender Settings.
If your host disables WP-Cron (DISABLE_WP_CRON), make sure a real cron job calls wp-cron.php every few minutes.
FAQ
-
Do I need an account, an API key or a paid plan?
-
No. Everything runs on your own server. There are no quotas and no limits on the number of links.
-
Why is a link “Unverified” instead of “Broken”?
-
The site behind the link blocked our automated check. This can be a Cloudflare or other bot challenge, a login wall (401/403) or a rate limit (429). That says nothing about whether the page works for real visitors, so LinkTender does not call it broken. Open the link in your browser. If it works, click Mark as fine.
-
When is a link reported as broken?
-
A link is reported as broken right away when the server answers 404 (Not Found) or 410 (Gone). This includes links to your own pages that no longer exist. The link is then re-confirmed over the next 24 hours. Timeouts, server errors (5xx), DNS failures and refused connections are retried 2, 10 and 24 hours after the first failure, and the link is only marked broken if it still fails after that. If your own server is offline or cannot connect to itself, nothing is marked broken; those links are checked again later.
-
Will it slow down my site?
-
Checks run in the background in short batches: by default up to 50 links or 20 seconds every 5 minutes, or every minute while there is a backlog. Four links are checked at a time, each on a different domain, with a pause between requests to the same domain. Visitors’ page loads do not run checks. You can lower the batch size, check one link at a time, or pause checking at any time.
-
How long does the first check take on a big site?
-
Expect roughly 1,000 to 2,500 links an hour, depending on how quickly the linked sites answer. A site with 50,000 unique links needs about a day for its first full check. Finding the links in the first place reads 250 posts per batch, so a 20,000-post site is fully indexed after about 80 batches (about 80 minutes when WP-Cron runs every minute). Links in posts you save are picked up straight away.
-
Does it change my content?
-
Only when you click Edit URL, Unlink or Use final URL. Post edits go through WordPress, so a revision is created and you can undo them.
-
Does it work with page builders?
-
Gutenberg and Elementor content is scanned and can be edited. For shortcode-based builders (Divi, WPBakery, Avada and similar), the URLs written in shortcode settings are found and can be edited too. LinkTender reads them as text and never runs the shortcodes, so scanning has no side effects. Other builders that store links in post content or plain custom fields are scanned as well.
-
Does it check links in comments?
-
Yes. Links in the text of approved comments are scanned and can be edited or unlinked. Pingbacks, trackbacks and comments that are pending, spam or in the trash are left out. Checking commenters’ website links is an option under Settings (off by default). You can also turn comment scanning off there.
-
Does it work on multisite?
-
Yes. Activate it per site, or network-activate it. Network activation creates the tables on every site in the network, however many there are (in batches of 100; on very large networks any site not reached within the activation request sets itself up the first time its dashboard is opened). New sites get their tables when they are created, and deleting a site removes its tables. Each site has its own schedule, and checking starts on a site when one of its administrators clicks Start checking links.
-
Where is the data stored?
-
In two tables,
{prefix}linktender_linksand{prefix}linktender_instances. Deleting the plugin from the Plugins screen removes them and all of the plugin’s options. -
For developers: can I extend it?
-
Yes. Use
linktender()to reach the services (links, scanner, checker, queue, editor). Hooks includelinktender_loaded,linktender_link_checked,linktender_link_status_changed,linktender_check_result,linktender_request_args,linktender_retry_intervals,linktender_concurrency,linktender_extracted_urls,linktender_scan_extra_sources,linktender_edit_source,linktender_bulk_actions,linktender_list_columns,linktender_settings_fieldsandlinktender_admin_menu.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“LinkTender – Local Broken Link Checker” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “LinkTender – Local Broken Link Checker” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.1.2
- No error pages from the plugin: an expired link or a missing permission on a LinkTender action now sends you back to the LinkTender screen with an explanation, and nothing is changed. The plugin no longer calls wp_die().
- The version check and the
linktender()helper moved into their own files; the main plugin file declares no functions. - Readme: new “External services” section describing the link checks and the optional wordpress.org connectivity check.
1.1.1
- Front-end page views never write to the database: tables are created or upgraded only on activation, on admin screens and in background batches, and content that changes during a front-end request (a visitor’s comment, or WordPress creating its default navigation menu) is parsed by the next background batch.
- Nothing is tracked or scheduled before an administrator clicks Start checking links. Deactivation stops checking; after re-activation it waits for the button again. Network activation no longer schedules a background event.
- Unsupported PHP or WordPress versions now only show an explanation on the Plugins screen and Dashboard; the plugin then loads nothing.
- A notice explains when the server cannot send HTTP requests (no cURL or stream sockets).
- Admin CSS is scoped under the plugin’s own wrapper; database-size readings stay quiet on databases without information_schema (e.g. SQLite).
- Uninstall also removes the remaining plugin options and notices.
1.1.0
- New: links in approved comments are scanned, and can be edited or unlinked from the LinkTender screen. Commenters’ website links can be included with an option (off by default).
- New: URLs in shortcode settings (Divi, WPBakery, Avada and similar shortcode-based builders) are found and can be edited. Shortcodes are read as text and never run.
- Sites where checking already runs scan their content once more after the update so these links get picked up. Nothing is scanned on sites where checking has not been started.
1.0.3
- Activation only creates the plugin’s tables (with dbDelta). It prints nothing, makes no outgoing requests and schedules nothing.
- Link checking now starts only after an administrator clicks Start checking links on the LinkTender screen. Sites that already ran 1.0.x keep checking.
- The wordpress.org connectivity check is now an opt-in setting (off by default). Without it, the server counts as offline after several different domains in a row could not be reached.
- Multisite: network activation sets up every site, in batches, with no 200-site limit. Network deactivation clears the schedule on every site, uninstall cleans up every site, and deleting a site drops its tables.
- Admin CSS and JavaScript load only on the LinkTender screens (exact screen check).
- PHP and WordPress versions are checked; on an unsupported server the plugin loads nothing and shows a notice.
1.0.2
- Readme: clearer description of how links are marked Broken, Redirected or Unverified, and of the retry schedule.
- Readme and plugin header: wording now describes only what the plugin does.
- No changes to checking behaviour or stored data.
1.0.1
- Faster checking: up to four links are checked at the same time, always on different domains. While there is a backlog, batches run every minute instead of every five.
- Large sites: scanning content now uses bulk database writes and reads at most 250 posts per batch. A batch on a 20,000-post site went from about 26,000 to about 1,300 database queries.
- Amazon’s captcha page is recognised as a bot check, and the 400 and 999 codes that Facebook and LinkedIn send to automated requests get a plain explanation. Both are shown as Unverified.
- If your server cannot reach the internet, or cannot connect to its own site, links are marked Unverified (or keep their status) instead of becoming broken.
- Links to wp-admin and the login page are no longer checked.
- “Use final URL” is hidden when a redirect ends on a login, consent or captcha page.
- A batch no longer waits behind one busy domain: links on other domains are picked first.
- A one-time review request after your first successful fix.
1.0.0
- First release.
