{"id":357604,"date":"2026-08-26T09:44:13","date_gmt":"2026-08-26T09:44:13","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/rockon-link-monitor\/"},"modified":"2026-08-27T07:07:20","modified_gmt":"2026-08-27T07:07:20","slug":"rockon-link-monitor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/rockon-link-monitor\/","author":15298435,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"trunk","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Rockon Link Monitor","header_author":"Vikas Sharma","header_description":"Find broken links in your WordPress posts and pages with a focused manual scanner.","assets_banners_color":"545c65","last_updated":"2026-08-27 07:07:20","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/rockonplugins.com\/link-monitor","header_author_uri":"https:\/\/profiles.wordpress.org\/devikas301","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"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":{"banner-300x100.png":{"filename":"banner-300x100.png","revision":3668236,"resolution":"300x100","location":"assets","locale":"","width":300,"height":100},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3668236,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[905,14279,14280,732,186],"plugin_category":[52,55],"plugin_contributors":[144127],"plugin_business_model":[],"class_list":["post-357604","plugin","type-plugin","status-publish","hentry","plugin_tags-905","plugin_tags-broken-links","plugin_tags-link-checker","plugin_tags-maintenance","plugin_tags-seo","plugin_category-performance","plugin_category-seo-and-marketing","plugin_contributors-devikas301","plugin_committers-devikas301"],"banners":{"banner":"https:\/\/ps.w.org\/rockon-link-monitor\/assets\/banner-772x250.png?rev=3668236","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/rockon-link-monitor_545c65.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Rockon Link Monitor finds broken internal and external links without adding a\nlarge SEO suite to your site. Run a scan, see exactly which links are dead and\nwhere they live, and jump straight to the editor to fix them.<\/p>\n\n<p>Scans are manual. Nothing runs in the background, and no data ever leaves your\nsite except the requests used to check the links themselves.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li>Scan published posts and pages.<\/li>\n<li>Check internal and external links.<\/li>\n<li>No limit on how many links a scan checks.<\/li>\n<li>Detect HTTP 404, 403, 500, 502, 503, timeouts, DNS failures and connection\nerrors.<\/li>\n<li>Destinations that merely refuse automated requests are reported separately,\nso bot blocking is not mistaken for a broken link.<\/li>\n<li>See total links scanned, broken links, affected pages and the last scan date.<\/li>\n<li>Jump directly to the editor for each broken link.<\/li>\n<li>Batched scanning with a live progress bar, so a scan will not time out.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on two kinds of external connection. Both are described in\nfull below.<\/p>\n\n<p><strong>1. The websites your content links to<\/strong><\/p>\n\n<p>Checking a link means asking the destination whether it still answers, so the\nplugin sends an HTTP GET request to every URL it finds in your posts and pages.\nThis cannot be done locally: only the destination server can say whether a page\nstill exists.<\/p>\n\n<ul>\n<li>What is sent: the URL being checked, and a User-Agent header identifying the\nplugin together with your site's home URL. If the destination refuses that\nfirst request with a 401, 403 or 429, one retry is sent using a generic\nbrowser User-Agent, an Accept-Language header, and your site's home URL as\nthe Referer.<\/li>\n<li>When: only while you are running a scan that you started yourself from the\nLink Monitor screen. The plugin schedules no background requests.<\/li>\n<li>Who receives it: the operator of whichever third-party site you linked to.\nThese are not services chosen by this plugin, so no single terms or privacy\ndocument covers them; each destination is governed by its own.<\/li>\n<\/ul>\n\n<p><strong>2. Freemius<\/strong><\/p>\n\n<p>The plugin bundles the Freemius SDK, provided by Freemius, Inc. It powers the\noptional account connection and the delivery of separately distributed add-ons.\nNo feature of this plugin depends on it: link scanning works in full whether or\nnot you ever connect.<\/p>\n\n<ul>\n<li>What is sent: nothing at all unless you explicitly opt in. If you do opt in,\nFreemius receives your site URL, your WordPress, PHP and plugin versions, the\nadministrator's name and email address, and a list of active plugins and\nthemes.<\/li>\n<li>When: at the moment you opt in, and periodically afterwards to check for\nadd-on updates. You can opt out at any time from the plugin's Account screen.<\/li>\n<li>Service provider: Freemius, Inc.<\/li>\n<li>Terms of Service: https:\/\/freemius.com\/terms\/<\/li>\n<li>Privacy Policy: https:\/\/freemius.com\/privacy\/<\/li>\n<\/ul>\n\n<h3>For developers<\/h3>\n\n<p>The scanner, repository and admin are separate classes, and the dashboard is\nbuilt entirely from hooks so an add-on can extend it without forking anything.<\/p>\n\n<p>Filters: <code>rockonlm_scan_settings<\/code>, <code>rockonlm_request_settings<\/code>,\n    rockonlm_scan_candidates, <code>rockonlm_posts_per_page<\/code>, <code>rockonlm_link_limit<\/code>,\n    rockonlm_batch_size, <code>rockonlm_fallback_link_limit<\/code>,\n    rockonlm_fallback_time_budget, <code>rockonlm_request_timeout<\/code>,\n    rockonlm_request_args, <code>rockonlm_browser_user_agent<\/code>,\n    rockonlm_soft_statuses, <code>rockonlm_blocked_is_broken<\/code>, <code>rockonlm_check_link<\/code>,\n    rockonlm_scan_data, <code>rockonlm_admin_rows<\/code>, <code>rockonlm_admin_row_actions<\/code>,\n    rockonlm_admin_edit_link, <code>rockonlm_admin_footer<\/code>, <code>rockonlm_admin_screen<\/code>,\n    rockonlm_upgrade_url, <code>rockonlm_capability<\/code>.<\/p>\n\n<p>Actions: <code>rockonlm_loaded<\/code>, <code>rockonlm_activated<\/code>, <code>rockonlm_scan_completed<\/code>,\n    rockonlm_admin_after_header, <code>rockonlm_admin_stats<\/code>,\n    rockonlm_admin_after_stats, <code>rockonlm_admin_scan_sources<\/code>,\n    rockonlm_admin_scan_options, <code>rockonlm_admin_scan_actions<\/code>,\n    rockonlm_admin_sidebar, <code>rockonlm_admin_before_results<\/code>,\n    rockonlm_admin_results_toolbar, <code>rockonlm_admin_after_table<\/code>,\n    rockonlm_admin_after_results.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin through <strong>Plugins &gt; Add New<\/strong> in your WordPress admin, or\nupload the <code>rockon-link-monitor<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Link Monitor<\/strong> in the admin menu and press <strong>Scan now<\/strong>.<\/li>\n<\/ol>\n\n<p>There is nothing to configure. The first scan works straight after activation.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20scan%20my%20site%20automatically%3F\"><h3>Does the plugin scan my site automatically?<\/h3><\/dt>\n<dd><p>No. Every scan is started by you from the Link Monitor screen. The plugin\nschedules no cron events and does no work in the background.<\/p><\/dd>\n<dt id=\"what%20does%20it%20scan%3F\"><h3>What does it scan?<\/h3><\/dt>\n<dd><p>Published posts and pages, including both internal and external links found in\ntheir content.<\/p><\/dd>\n<dt id=\"how%20many%20links%20can%20one%20scan%20check%3F\"><h3>How many links can one scan check?<\/h3><\/dt>\n<dd><p>There is no limit. A scan checks every link it finds. Developers who want a\nceiling of their own can set one with the <code>rockonlm_link_limit<\/code> filter, which\ndefaults to <code>0<\/code>, meaning unlimited.<\/p><\/dd>\n<dt id=\"will%20a%20large%20site%20time%20out%3F\"><h3>Will a large site time out?<\/h3><\/dt>\n<dd><p>No. Links are checked in batches of 25 over AJAX with a live progress bar, so no\nsingle request has to do the whole scan, and posts are read a page at a time so\ncollecting the links does not depend on how many posts you have. Keep the tab\nopen until the bar finishes.<\/p>\n\n<p>Without JavaScript the form still works, but that scan has to run in a single\nrequest, so it stops at 100 links or at a safe share of your PHP time limit,\nwhichever comes first. It saves what it checked and tells you it stopped early.\nThis is a technical limit of doing the whole job in one HTTP request; the\n    rockonlm_fallback_link_limit and <code>rockonlm_fallback_time_budget<\/code> filters\nadjust it.<\/p><\/dd>\n<dt id=\"a%20link%20is%20reported%20as%20broken%20but%20works%20in%20my%20browser.%20why%3F\"><h3>A link is reported as broken but works in my browser. Why?<\/h3><\/dt>\n<dd><p>Some servers block automated requests, or respond too slowly for the 8 second\nrequest timeout. Destinations that answer 401, 403 or 429 to both our own user\nagent and a browser one are listed separately as \"Could not be verified\" rather\nthan counted as broken. Use the <code>rockonlm_request_timeout<\/code> filter to allow more\ntime.<\/p><\/dd>\n<dt id=\"who%20can%20run%20a%20scan%3F\"><h3>Who can run a scan?<\/h3><\/dt>\n<dd><p>Users with the <code>manage_options<\/code> capability, which normally means administrators.\nThe <code>rockonlm_capability<\/code> filter changes this.<\/p><\/dd>\n<dt id=\"does%20it%20modify%20my%20posts%3F\"><h3>Does it modify my posts?<\/h3><\/dt>\n<dd><p>Never. The plugin only reports what it finds; you fix links in the editor\nyourself.<\/p><\/dd>\n<dt id=\"where%20is%20the%20scan%20data%20stored%2C%20and%20is%20it%20removed%20on%20uninstall%3F\"><h3>Where is the scan data stored, and is it removed on uninstall?<\/h3><\/dt>\n<dd><p>Results live in the <code>rockonlm_scan_data<\/code> WordPress option. No custom tables are\ncreated. Deleting the plugin removes its options, so nothing is left behind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Removed the 500 link ceiling on manual scans. A scan now checks every link it\nfinds, and the <code>rockonlm_link_limit<\/code> filter defaults to unlimited.<\/li>\n<li>Renamed every function, class, constant, option, hook, handle and asset to the\nlonger <code>rockonlm<\/code> prefix, so nothing collides with another plugin. Existing\nscan results are carried over automatically on activation.<\/li>\n<li>The scan form no longer passes the raw request array to the\n  rockonlm_request_settings filter, and admin query flags are cast to integers\nbefore use.<\/li>\n<li>Documented every external connection the plugin makes.<\/li>\n<li>Fixed a PHP warning raised by an anchor with an empty <code>href<\/code> attribute.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Reworked the scanner into a collect-then-check pipeline with filters at every\nstep, so add-ons can contribute their own link sources and checking strategy.<\/li>\n<li>Added a full set of dashboard hooks for extensions.<\/li>\n<li>Better error labels: timeouts and DNS failures are now reported separately\nfrom generic connection errors.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"A focused manual broken-link scanner for WordPress posts and pages.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/357604","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=357604"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/devikas301"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=357604"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=357604"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=357604"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=357604"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=357604"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=357604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}