{"id":380081,"date":"2026-10-06T16:49:48","date_gmt":"2026-10-06T16:49:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/link-watch\/"},"modified":"2026-10-06T18:53:22","modified_gmt":"2026-10-06T18:53:22","slug":"blockbadurls-broken-link-checker","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/blockbadurls-broken-link-checker\/","author":23566586,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1.3","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"BlockBadURLS Broken Link Checker","header_author":"techpot","header_description":"Lightweight broken-link checker. Scans on a throttled schedule (never continuously), lists broken links grouped by post, and lets you unlink or edit in one click.","assets_banners_color":"","last_updated":"2026-10-06 18:53:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/blockbadurls-broken-link-checker\/","header_author_uri":"https:\/\/blockbadbot.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":94,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"techpot","date":"2026-10-06 16:49:16","revision":3731250},"1.1.1":{"tag":"1.1.1","author":"techpot","date":"2026-10-06 18:53:22","revision":3731418}},"upgrade_notice":{"1.1.1":"<p>Scans now use far less server CPU. They take longer to finish, because external links are checked one at a time.<\/p>","1.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[905,14279,40482,14280,732],"plugin_category":[52],"plugin_contributors":[280914],"plugin_business_model":[],"class_list":["post-380081","plugin","type-plugin","status-publish","hentry","plugin_tags-905","plugin_tags-broken-links","plugin_tags-dead-links","plugin_tags-link-checker","plugin_tags-maintenance","plugin_category-performance","plugin_contributors-techpot","plugin_committers-techpot"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/blockbadurls-broken-link-checker.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>BlockBadURLS Broken Link Checker finds broken links - on your own site and pointing out to others - and lists them grouped by post so you can fix or remove them in one click.<\/p>\n\n<p>BlockBadURLS Broken Link Checker is built to stay out of the way: a scheduled, throttled scan that never runs continuously, so it never competes with your site's own traffic for server resources, even on shared hosting.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li><strong>Checks your own links for free<\/strong> - a link to one of your own posts or pages is confirmed through the database, and a link to a file in your uploads folder is confirmed on disk. Neither costs an HTTP request, so checking your own site adds effectively no load.<\/li>\n<li><strong>Checks external links politely<\/strong> - one link at a time, so no external site ever gets hammered and your own server stays quiet while a scan runs.<\/li>\n<li><strong>Checks each unique link once per scan<\/strong> - a link repeated across thousands of posts is checked once, not once per post.<\/li>\n<li><strong>Scheduled, throttled scanning<\/strong> - a full scan runs daily or weekly in small background batches, never as one continuous crawl.<\/li>\n<li><strong>Re-checks a post the moment you edit it<\/strong>, so a fix shows up without waiting for the next full scan.<\/li>\n<li><strong>Finds broken images too<\/strong> - a missing image is reported next to your broken links.<\/li>\n<li><strong>Broken-link report<\/strong>, grouped by post, showing each link's text so you can spot it in the post.<\/li>\n<li><strong>Edit URL<\/strong> - point a broken link or image at the right address without opening the post.<\/li>\n<li><strong>One-click Unlink<\/strong> - strips just the link, keeps the text - or jump straight to Edit post.<\/li>\n<li><strong>Recheck<\/strong> a single link on the spot, and <strong>Dismiss<\/strong> one that is not really broken so it stops being reported.<\/li>\n<li><strong>Bulk Unlink and Dismiss<\/strong> for cleaning up several at once.<\/li>\n<li><strong>Restore<\/strong> a dismissed link, and it is checked again straight away.<\/li>\n<li><strong>Pause, resume or start over<\/strong> a running scan. Pausing keeps what was found so far and \"Resume scan\" carries on from where it stopped.<\/li>\n<li><strong>Settings<\/strong> to fit it to your site - see below.<\/li>\n<\/ul>\n\n<h4>Settings<\/h4>\n\n<p>Under <strong>Tools \u2192 BlockBadURLS Broken Link Checker \u2192 Settings<\/strong>:<\/p>\n\n<ul>\n<li><strong>Scan every<\/strong> - day or week.<\/li>\n<li><strong>Look for links in<\/strong> - which post types to scan.<\/li>\n<li><strong>Exclusion list<\/strong> - links whose URL contains any of these words are not checked.<\/li>\n<li><strong>Wait for each link<\/strong> - how many seconds a link may take to answer (3 to 8) before it counts as a failed check.<\/li>\n<li><strong>Hold off when busy<\/strong> - skip scanning while the server load is above a number you choose, and try again a few minutes later.<\/li>\n<li><strong>Post modified date<\/strong> - optionally leave a post's modified date alone when you edit or unlink a link from BlockBadURLS Broken Link Checker.<\/li>\n<\/ul>\n\n<h4>What counts as broken<\/h4>\n\n<p>A connection failure, 404, 410, or a 5xx server error. Responses like 401, 403, and 429 are treated as alive, since many sites block automated checkers - flagging those would bury real breakage in false positives.<\/p>\n\n<p>A 404 or 410 is reported at once. A connection failure or 5xx error can be a temporary outage, so it is only reported after failing two checks in a row.<\/p>\n\n<p>Links the plugin is not allowed to request - because of <code>WP_HTTP_BLOCK_EXTERNAL<\/code> \/ <code>WP_ACCESSIBLE_HOSTS<\/code>, a private network address, or an unusual port - are skipped rather than reported.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the external sites your own posts and pages link to, in order to check whether those links are still working. This is the plugin's core function and cannot be turned off, since checking external links is what it does.<\/p>\n\n<p>For each link found in your published content, during a scan, BlockBadURLS Broken Link Checker makes a HEAD request (falling back to a GET request only if HEAD fails or is rejected) to that URL, to read its HTTP response status. No data about your site or its visitors is sent - only a standard HTTP request identifying itself as BlockBadURLS Broken Link Checker, the same as a browser visiting the link would send.<\/p>\n\n<p>Which external sites are contacted depends entirely on which external links exist in your own content - there is no fixed list.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/blockbadurls-broken-link-checker<\/code>, or install directly from the Plugins screen in your dashboard.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Tools \u2192 BlockBadURLS Broken Link Checker<\/strong>, click <strong>Scan now<\/strong> for your first scan, and use the <strong>Settings<\/strong> tab to choose the scan frequency, post types and exclusions.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>No. Scanning runs in small batches on a schedule, never as a continuous crawl, and links to your own posts\/pages\/uploads are checked without any HTTP request at all.<\/p><\/dd>\n<dt id=\"does%20it%20check%20internal%20links%20too%3F\"><h3>Does it check internal links too?<\/h3><\/dt>\n<dd><p>Yes. Links to your own posts, pages, and uploaded files are checked for free, with no outbound HTTP request - see \"What it does\" above.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20click%20unlink%3F\"><h3>What happens when I click Unlink?<\/h3><\/dt>\n<dd><p>Only the <code>&lt;a&gt;<\/code> tag is removed; the link's visible text stays in the post. Nothing else in the post is changed. A button block keeps its button and just loses the link, so the block stays valid in the editor.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20a%20scan%20part-way%3F\"><h3>Can I stop a scan part-way?<\/h3><\/dt>\n<dd><p>Yes. <strong>Pause scan<\/strong> stops it and keeps the results so far; <strong>Resume scan<\/strong> carries on from the same post, without re-checking what is already done. <strong>Start over<\/strong> checks every post again from the beginning. A scan left paused for longer than your scan interval starts fresh, so the results are never badly out of date.<\/p><\/dd>\n<dt id=\"why%20does%20it%20say%20my%20site%20could%20not%20reach%20itself%3F\"><h3>Why does it say my site could not reach itself?<\/h3><\/dt>\n<dd><p>BlockBadURLS Broken Link Checker checks some links to your own site with a real request, and that request failed - often a firewall, security plugin, maintenance mode or a local development setup blocking the site from calling itself. Those links are skipped, not reported as broken. Links to your own posts, pages and uploads are still checked directly. WordPress's Site Health screen shows the same problem.<\/p><\/dd>\n<dt id=\"can%20i%20control%20which%20post%20types%20are%20scanned%3F\"><h3>Can I control which post types are scanned?<\/h3><\/dt>\n<dd><p>Which post types are scanned is a setting (default: all public ones); the <code>blockbadurls_post_types<\/code> filter can still override it from code.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Much lower server CPU use during a scan: external links are now checked one at a time instead of in parallel. A scan takes longer to finish, but no longer keeps a CPU core busy while it runs.<\/li>\n<li>Removed the <code>blockbadurls_concurrency<\/code> and <code>blockbadurls_per_host<\/code> filters, which no longer apply.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Finds broken links on your own site without the server slowdown - a scheduled, throttled scan instead of a continuous crawl.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/380081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=380081"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/techpot"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=380081"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=380081"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=380081"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=380081"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=380081"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=380081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}