{"id":261023,"date":"2025-11-19T09:33:00","date_gmt":"2025-11-19T09:33:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kandeshop-broken-links-checker\/"},"modified":"2025-11-19T09:30:32","modified_gmt":"2025-11-19T09:30:32","slug":"kandeshop-broken-links-checker","status":"publish","type":"plugin","link":"https:\/\/hsb.wordpress.org\/plugins\/kandeshop-broken-links-checker\/","author":14453657,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.4.2","stable_tag":"trunk","tested":"6.8.5","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Kandeshop Broken Links Checker","header_author":"D Kandekore","header_description":"Checks posts and pages in batches to find and list broken external links.","assets_banners_color":"","last_updated":"2025-11-19 09:30:32","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/github.com\/dkandekore","rating":0,"author_block_rating":0,"active_installs":0,"downloads":167,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[14279,10674,947,175,732],"plugin_category":[52],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-261023","plugin","type-plugin","status-publish","hentry","plugin_tags-broken-links","plugin_tags-checker","plugin_tags-http","plugin_tags-links","plugin_tags-maintenance","plugin_category-performance","plugin_committers-kandeshop"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/kandeshop-broken-links-checker.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>The Kandeshop Broken Links Checker is a WordPress plugin designed to identify and list broken or non-functional external links. It scans through your site in batches and organizes links into five tabs:<\/p>\n\n<ol>\n<li><strong>Broken\/Unreachable Links:<\/strong> Shows all links (internal and external) that return an error (404, 500) or are unreachable (timeout).<\/li>\n<li><strong>Working External Links:<\/strong> Shows all links that are NOT on your own domain and return a successful status.<\/li>\n<li><strong>Pages Checked:<\/strong> Lists all posts and pages that have been scanned in your current session.<\/li>\n<li><strong>Guide &amp; Limitations:<\/strong> A simple \"how-to\" guide with important warnings about how the plugin works.<\/li>\n<li><strong>Status Code Explanations:<\/strong> A full explanation of what each error (404, 403, 999, cURL 28) actually means.<\/li>\n<\/ol>\n\n<p>The plugin now intelligently categorizes errors and features a real-time progress indicator that shows you exactly which post is being scanned.<\/p>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Go to the admin dashboard.<\/li>\n<li>Find the 'Broken Links' option in the main menu and click it.<\/li>\n<li>Read the <strong>Guide &amp; Limitations<\/strong> tab to understand how the plugin works.<\/li>\n<li>On the 'Broken Links Checker' page, set the number of posts\/pages per batch.<\/li>\n<li>Click the 'Check Next Batch' button.<\/li>\n<li>A real-time progress bar will appear, showing you which post is currently being scanned.<\/li>\n<li>Results will be added to the appropriate tabs as they are found.<\/li>\n<li>Click \"Clear All Results\" to reset the scan and start over.<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kandeshop-broken-link-check<\/code> folder to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Navigate to the 'Broken Links' menu in your WordPress admin to use the tool.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id='what%20is%20a%20batch%3F'><h3>What is a batch?<\/h3><\/dt>\n<dd><p>A batch refers to a set of posts or pages that the plugin scans at a time. You can set the number of posts\/pages in a batch in the admin dashboard.<\/p><\/dd>\n<dt id='does%20the%20plugin%20automatically%20fix%20the%20broken%20links%3F'><h3>Does the plugin automatically fix the broken links?<\/h3><\/dt>\n<dd><p>No, the plugin only identifies and lists the broken links. You will need to fix the links manually.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fix: Corrected a fatal JavaScript syntax error that prevented the script from loading, which broke the tabs and buttons.<\/li>\n<li>Best Practice: Bumped script versions to force cache-busting.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Feature: Added a \"Guide &amp; Limitations\" documentation tab to the admin page.<\/li>\n<li>Feature: Added a \"Status Code Explanations\" tab to explain what 404, 403, and cURL errors mean.<\/li>\n<li>Best Practice: Bumped script versions to force cache-busting.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Feature: Reworked the entire scanning architecture to be more stable and provide real-time feedback.<\/li>\n<li>Feature: The progress indicator now shows exactly which post is being scanned (e.g., \"Scanning (1\/20): 'My Post Title'...\").<\/li>\n<li>Fix: Changed the scan from one long request per batch to many small requests (one per post) to prevent server timeouts.<\/li>\n<li>Best Practice: Added a new AJAX endpoint <code>kblc_ajax_get_batch_posts<\/code> to feed the queue.<\/li>\n<li>Best Practice: <code>kblc_ajax_check_links<\/code> now only scans a single post ID.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Feature: Added detailed explanations for anti-bot status codes (403, 429, 999, 460).<\/li>\n<li>Feature: These \"Blocked\" links are now styled in blue to distinguish them from \"Broken\" (red) and \"Unreachable\" (yellow) links.<\/li>\n<li>Fix: Cleaned up link normalization to remove URL fragments (#) before checking.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Feature: Added a spinner and dynamic text (e.g., \"Checking batch 2...\") to the \"Checking...\" notice for better user feedback.<\/li>\n<li>Fix: Changed the HTML for the notice to include a dedicated paragraph for text, improving layout.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Feature: Scanner now fetches the full rendered HTML (header, footer, etc.) instead of just the post content.<\/li>\n<li>Feature: Scanner now warns about \"Loopback Request Failed\" errors if the server blocks it from scanning its own pages.<\/li>\n<li>Fix: Scanner now correctly finds all <em>publicly queryable<\/em> post types, including custom post types.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Feature: The scanner now automatically detects and checks all public post types (e.g., 'portfolio', 'products') instead of just posts and pages.<\/li>\n<li>Fix: Excludes 'attachment' post type from the scan by default.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Feature: Added a tabbed interface (Broken, Working External, Pages Checked).<\/li>\n<li>Feature: Added \"Working External Links\" tab to show only 200\/300 status links not on the local domain.<\/li>\n<li>Feature: Added \"Pages Checked\" tab to list all scanned posts\/pages.<\/li>\n<li>Feature: Results are now persistent in the browser's <code>sessionStorage<\/code>.<\/li>\n<li>Feature: Added \"Clear All Results\" button to reset the session.<\/li>\n<li>Fix: AJAX now returns a full JSON object instead of simple HTML\/codes.<\/li>\n<li>Best Practice: Added <code>jquery-ui-tabs<\/code> as a dependency.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Feature: Differentiated between \"Broken Links\" (404s, DNS errors) and \"Unreachable Links\" (cURL timeouts).<\/li>\n<li>Feature: Unreachable links are now displayed as a warning with an explanation.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix: Increased cURL timeout from 5 to 10 seconds to help with slow servers.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: Force cache-busting for JavaScript file.<\/li>\n<li>Fix: Add console logging for easier debugging.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: Added Nonce validation for all AJAX requests.<\/li>\n<li>Fix: Correctly handles HTTPS links in addition to HTTP.<\/li>\n<li>Fix: Improved link checking to detect all HTTP error codes (400+) instead of just 404.<\/li>\n<li>Fix: Removed a fatal PHP error (stray brace).<\/li>\n<li>Best Practice: Refactored all functions with <code>kblc_<\/code> prefix.<\/li>\n<li>Best Practice: Enqueued and localized script properly.<\/li>\n<li>Best Practice: Escaped all output and internationalized strings.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release of the plugin.<\/li>\n<\/ul>","raw_excerpt":"Checks posts and pages in batches to find and list broken external links.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/261023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=261023"}],"author":[{"embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kandeshop"}],"wp:attachment":[{"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=261023"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=261023"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=261023"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=261023"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=261023"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hsb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=261023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}