{"id":348370,"date":"2026-08-20T22:28:48","date_gmt":"2026-08-20T22:28:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/crai-linksense-internal-link-builder\/"},"modified":"2026-08-21T00:38:48","modified_gmt":"2026-08-21T00:38:48","slug":"crai-linksense","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/crai-linksense\/","author":23475377,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.68.6","stable_tag":"1.68.6","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"CRAI LinkSense \u2013 Internal Link Builder","header_author":"mark456321","header_description":"Free internal linking for WordPress. Finds orphan pages and suggests internal links using wording you already wrote \u2014 nothing changes until you approve it. Works with the block editor, classic editor and Elementor, and reads focus keywords from Yoast SEO and Rank Math.","assets_banners_color":"4954b7","last_updated":"2026-08-21 00:38:48","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/mark456321\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":70,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.68.6":{"tag":"1.68.6","author":"mark456321","date":"2026-08-21 00:38:48"}},"upgrade_notice":{"1.68.6":"<p>Finds broken internal links pointing at addresses that never existed, not only ones that used to.<\/p>","1.68.5":"<p>Confirmed against WordPress 7.1.<\/p>","1.68.4":"<p>Broken internal links are now found during a scan instead of hours later.<\/p>","1.68.3":"<p>Adds a &quot;Pages with no links&quot; filter to Suggested links, and removes a filter that did nothing.<\/p>","1.68.2":"<p>Shows the version number beside the plugin name.<\/p>","1.68.1":"<p>Clearer buttons on &quot;Needs links&quot;, and better suggested wording in the manual chooser.<\/p>","1.68.0":"<p>&quot;Link from another page&quot; no longer offers weakly related pages or pre-fills wording that would fail the plugin&#039;s own checks.<\/p>","1.67.2":"<p>Directory listing rewrite. No code changes.<\/p>","1.67.1":"<p>Housekeeping for the WordPress.org directory: no packaged development notes, no Pro prefixes in free code.<\/p>","1.67.0":"<p>Pro: explains why AI wording is unavailable, and what still works, instead of going quiet.<\/p>","1.66.0":"<p>New installs pick the right link storage for the site. Existing sites keep their current setting.<\/p>","1.65.1":"<p>AI-written suggestions no longer appear when the Pro plugin is switched off. Nothing is deleted.<\/p>","1.65.0":"<p>&quot;Pages needing links&quot; moves out of Reports into its own &quot;Needs links&quot; tab, beside Suggested links.<\/p>","1.64.7":"<p>Pro: the Site structure count now matches the list it sits above.<\/p>","1.64.6":"<p>Pro: the Site structure list now matches its own count, and marks which suggestions are new.<\/p>","1.64.5":"<p>Pro: the Site structure button now takes you to the right suggestions, and its wording matches what it shows.<\/p>","1.64.4":"<p>Pro: Site structure now shows the suggestions it just created instead of only counting them.<\/p>","1.64.3":"<p>Fixes the card not updating when you pick different wording, and nonsense AI wording such as &quot;turn 000 into&quot;.<\/p>","1.64.2":"<p>Pro: one scan now covers every page with no links, and wording still starts within seconds.<\/p>","1.64.1":"<p>Fixes the nonsense wording offered under &quot;Or link these words&quot;, and the long wait before any AI wording appears.<\/p>","1.64.0":"<p>Refuses link wording that starts with a bare number or a verb, such as &quot;038 regulation&quot; or &quot;analyse markets&quot;.<\/p>","1.63.9":"<p>Pro: link wording may run to eight words, matching the AI service.<\/p>","1.63.8":"<p>Fixes the 1.63.4 request-size change, which never actually took effect.<\/p>","1.63.7":"<p>Pro: the AI service now receives what it needs to apply the same wording standard as the plugin.<\/p>","1.63.6":"<p>Pro: the AI service now receives the wording rules with each request.<\/p>","1.63.5":"<p>Pages with no links are reconsidered on every run, and dead &quot;Needs AI wording&quot; cards no longer clutter the list.<\/p>","1.63.4":"<p>Pro: fixes most wording coming back cut off, and wording passing checks on the source page&#039;s own words.<\/p>","1.63.3":"<p>Pro: fixes AI wording that named the wrong page being accepted.<\/p>","1.63.1":"<p>Pro: suggestions appear in the list as they are found during a run.<\/p>","1.63.0":"<p>Pro: one press now also finds and words links for pages nothing links to. Fixes the always-empty Link text report.<\/p>","1.62.1":"<p>Pro: any scan now produces finished AI suggestions in one step when AI wording is on \u2014 no second button, no popup.<\/p>","1.62.0":"<p>Pro: better AI wording \u2014 the model is now given the words that name each page, so more of its proposals pass the quality gate.<\/p>","1.61.1":"<p>Pro: adds the missing on-screen control for which kind of AI wording leads.<\/p>","1.61.0":"<p>Pages with no links now sort first, and the search for links to them no longer stops early on hosts without working WP-Cron.<\/p>","1.60.0":"<p>Upgrading from free to Pro now works without errors, whatever the plugin folder is called.<\/p>","1.59.2":"<p>Pro: clearer message when the licensing library is missing because an upload did not finish.<\/p>","1.59.1":"<p>Fixes a fatal error when activating Pro while the free version is still active.<\/p>","1.59.0":"<p>Pro: the AI now prefers writing a sentence for the link over wrapping existing words, where you have that mode switched on.<\/p>","1.58.0":"<p>Important Pro fix: suggestions could show a sentence belonging to a different page. Also fixes the empty AI filter and the empty Site structure report.<\/p>","1.57.0":"<p>Pro: AI link text must now describe the page it points at, rather than merely share a word with it.<\/p>","1.56.0":"<p>Fixes poor link text: half-sentences like &quot;brokers accepting&quot; are refused, and wording is only counted as relevant if it shares something that distinguishes the destination.<\/p>","1.55.1":"<p>Fixes poor link wording on sites with many suggestions. Please update.<\/p>","1.55.0":"<p>Pro adds a Site structure tab: topic groups with a central page, and pages that are competing with each other. The free version is unchanged.<\/p>","1.54.0":"<p>The permanent-storage choice now names which pages keep their links, with a count for your site. Bigger logo.<\/p>","1.53.0":"<p>New logo.<\/p>","1.52.0":"<p>The permanent-storage option now says how many of your pages it cannot cover, instead of leaving it as a footnote.<\/p>","1.51.2":"<p>Pro: fixes &quot;Could not load AI status&quot; on the Suggested links tab.<\/p>","1.51.1":"<p>Pro: fixes an upgrade that would have lost stored AI wording, settings and rules.<\/p>","1.51.0":"<p>Removes Pro housekeeping code from the free version, and clears any leftover API keys on uninstall.<\/p>","1.50.7":"<p>Fixes pause and resume: resuming carries on from where it stopped instead of starting the whole check again.<\/p>","1.50.6":"<p>Fixes the AI wording panel breaking the layout of suggestion cards.<\/p>","1.50.5":"<p>Fixes every screen failing to load. Please update.<\/p>","1.50.4":"<p>Fixes the Reports tab opening on an error in the free version, and makes failure messages say what actually went wrong.<\/p>","1.50.3":"<p>Fixes the free version showing a &quot;Pro&quot; badge and calling itself &quot;LinkSense Pro&quot; in the admin menu.<\/p>","1.50.2":"<p>Fixes the suggestion card layout on narrow screens.<\/p>","1.50.1":"<p>Removes references to AI features that do not exist in the free version, and fixes the suggestion card layout.<\/p>","1.50.0":"<p>Adds several links at once with an undo, a health verdict on your link wording, and a way to find pages that could link to the post you are writing.<\/p>","1.49.0":"<p>Adds several links at once with an undo, a health verdict on your link wording, and a way to find pages that could link to the post you are writing.<\/p>","1.48.4":"<p>Fixes the suggestions list sticking on &quot;Loading\u2026&quot;, checking that stopped after the first batch, and suggestion building stalling on hosts without working WP-Cron.<\/p>","1.48.3":"<p>&quot;Check my pages&quot; now takes you straight to Suggested links and shows progress there. Removes the redundant &quot;check from scratch&quot; link.<\/p>","1.48.2":"<p>Permanent mode now always states that it covers block and classic editor pages only, instead of mentioning it only on sites that already have page-builder pages.<\/p>","1.48.1":"<p>Permanent mode now tells you how many of your pages it cannot cover, instead of leaving you to find out after uninstalling. Removes the Tools tab.<\/p>","1.48.0":"<p>Fixes approved links that were never saved into your content, link text that could not be placed, and sentences split at a line break. Adds automatic linking for pages nothing links to, and more varied link text.<\/p>","1.47.2":"<p>The LinkSense dashboard is now administrator only, and REST permissions are scoped per endpoint. Authors and contributors keep per-post link suggestions in the editor for posts they can edit.<\/p>","1.37.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3657851,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3657851,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3657851,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3657851,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.68.6"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3657851,"resolution":"1","location":"assets","locale":"","width":1227,"height":831},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3657851,"resolution":"2","location":"assets","locale":"","width":1384,"height":762},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3657851,"resolution":"3","location":"assets","locale":"","width":1359,"height":835},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3657851,"resolution":"4","location":"assets","locale":"","width":1325,"height":801},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3657851,"resolution":"5","location":"assets","locale":"","width":1396,"height":808}},"screenshots":{"1":"The overview: how well connected your pages are, with the trouble spots one click away.","2":"Suggested links, each showing the sentence the link would sit in and alternative wording to choose from.","3":"The \"Needs links\" tab: pages nothing links to, with a one-press way to find links for any of them.","4":"Choosing what happens to your links if the plugin is ever removed.","5":"The link text report, flagging wording that is vague, over-used, or points to several different pages."}},"plugin_section":[],"plugin_tags":[25078,14279,19933,6681,252136],"plugin_category":[],"plugin_contributors":[263395],"plugin_business_model":[],"class_list":["post-348370","plugin","type-plugin","status-publish","hentry","plugin_tags-anchor-text","plugin_tags-broken-links","plugin_tags-internal-linking","plugin_tags-internal-links","plugin_tags-orphan-pages","plugin_contributors-mark456321","plugin_committers-mark456321"],"banners":{"banner":"https:\/\/ps.w.org\/crai-linksense\/assets\/banner-772x250.png?rev=3657851","banner_2x":"https:\/\/ps.w.org\/crai-linksense\/assets\/banner-1544x500.png?rev=3657851","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/crai-linksense\/assets\/icon-128x128.png?rev=3657851","icon_2x":"https:\/\/ps.w.org\/crai-linksense\/assets\/icon-256x256.png?rev=3657851","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/crai-linksense\/assets\/screenshot-1.png?rev=3657851","caption":"The overview: how well connected your pages are, with the trouble spots one click away."},{"src":"https:\/\/ps.w.org\/crai-linksense\/assets\/screenshot-2.png?rev=3657851","caption":"Suggested links, each showing the sentence the link would sit in and alternative wording to choose from."},{"src":"https:\/\/ps.w.org\/crai-linksense\/assets\/screenshot-3.png?rev=3657851","caption":"The \"Needs links\" tab: pages nothing links to, with a one-press way to find links for any of them."},{"src":"https:\/\/ps.w.org\/crai-linksense\/assets\/screenshot-4.png?rev=3657851","caption":"Choosing what happens to your links if the plugin is ever removed."},{"src":"https:\/\/ps.w.org\/crai-linksense\/assets\/screenshot-5.png?rev=3657851","caption":"The link text report, flagging wording that is vague, over-used, or points to several different pages."}],"raw_content":"<!--section=description-->\n<p>Your best pages are invisible if nothing links to them. CRAI LinkSense reads your whole site, finds every place one page mentions something another page covers, and turns those mentions into internal links \u2014 using wording you already wrote, one approval at a time.<\/p>\n\n<p><strong>Nothing changes until you press \"Add link.\"<\/strong> That is the rule the whole plugin is built on. It never edits a post behind your back, never rewrites a sentence, never adds a link you have not seen first. Every suggestion shows you the exact sentence, the exact words that become clickable, and where the link goes \u2014 before anything happens.<\/p>\n\n<h4>Your links are yours<\/h4>\n\n<p>On a standard WordPress site, links are written directly into your content. <strong>Deactivate this plugin, delete it, switch to something else \u2014 every link you approved stays exactly where you put it.<\/strong> They are ordinary links in your own posts, not a rented feature.<\/p>\n\n<p>On page-builder sites (Elementor, Divi, Bricks, Beaver Builder and friends), writing into the builder's data risks your layout \u2014 so there the plugin adds links safely as each page loads instead, and tells you plainly that it is doing so. The settings screen states which mode your site uses and why. No surprises in either direction.<\/p>\n\n<h4>What it finds<\/h4>\n\n<ul>\n<li><strong>Places to link<\/strong> \u2014 every sentence on your site that names a topic another of your pages covers, scored by how strongly the two pages belong together.<\/li>\n<li><strong>Orphan pages<\/strong> \u2014 pages nothing links to. Visitors and search engines find pages by following links; a page with none is nearly invisible. The \"Needs links\" tab lists them, and one press hunts for pages that could link to each.<\/li>\n<li><strong>Broken links<\/strong> \u2014 internal and outbound links that no longer resolve, with one-click repair or removal.<\/li>\n<li><strong>Anchor text patterns<\/strong> \u2014 the same clickable words used over and over reads as manipulation to search engines. The link text report shows your distribution.<\/li>\n<\/ul>\n\n<h4>What it refuses to do<\/h4>\n\n<p>The quality bar is not negotiable. Suggested wording must read as a real phrase \u2014 no half-sentences, no \"click here\", no wording that describes the wrong page. The plugin rejects its own suggestions rather than show you a bad one, and it tells you the honest reason when a page yields nothing.<\/p>\n\n<h4>Private by design<\/h4>\n\n<p>Your content is analysed on your own server. Nothing is sent to a third party, there is no account to create, no API key to buy, and no page limit. The only outbound requests the free plugin ever makes are the ones you would expect from a link checker: confirming that the links in your own posts still work.<\/p>\n\n<h4>What CRAI LinkSense Pro adds<\/h4>\n\n<p>The free plugin finds links where your existing wording already fits. <strong>Pro writes the wording<\/strong> \u2014 an AI drafts the sentence or rewrites yours so the right link fits naturally, with every figure and name preserved, checked against the destination page before you ever see it. Pro also maps your site structure into topic groups and suggests the links that bind each group together. The free plugin is complete on its own; Pro is for sites that publish often enough to want the writing done too.<\/p>\n\n<h3>How links are stored<\/h3>\n\n<p>There are two storage modes. The default never touches your content; the other\nis opt-in and exists because some site owners want links that survive the\nplugin being removed.<\/p>\n\n<p><strong>Safe mode (the default)<\/strong><\/p>\n\n<p>Links are added as the page is rendered, using a WordPress filter. Your posts in\nthe database are not modified at all. Removing a link, or the whole plugin, puts\neverything back exactly as it was, because nothing was ever changed.<\/p>\n\n<p><strong>Permanent mode (off unless you turn it on)<\/strong><\/p>\n\n<p>Links are written into the post content itself, so they remain after the plugin\nis deactivated or deleted. This is a real modification of your content, so:<\/p>\n\n<ul>\n<li>The original content of every affected post is copied to a backup first, before anything is written.<\/li>\n<li>\"Revert\" restores that backup, on one post or across the whole site.<\/li>\n<li>Only the content column is written, and only for posts with approved links. Nothing else about the post is altered, and no revision is created.<\/li>\n<li>Page-builder pages always use safe mode, whatever this setting says, because their content is not stored in the post body.<\/li>\n<li>If you delete the plugin while permanent mode is on, the links stay by design and the backups are kept, so the change is still reversible. Turn the mode off and revert first if you would rather they went.<\/li>\n<\/ul>\n\n<p>The setting is in Settings, described there in the same terms, and it defaults to\nsafe mode on a new install.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not use any third party service, API or remote server. Nothing\nis sent to the plugin author or to anyone else, no account is required, and no\ndata about you, your site or your visitors is collected or transmitted.<\/p>\n\n<p>The plugin does make outbound web requests in one situation, described in full\nbelow so there is no ambiguity.<\/p>\n\n<p><strong>Checking whether your links still work<\/strong><\/p>\n\n<p>To tell you which links on your site are broken, the plugin has to try them. It\nrequests the web addresses that your own content links to. Where you have linked\nto another website, that request goes to that website, exactly as it would if a\nvisitor clicked the link.<\/p>\n\n<ul>\n<li>What is requested: only the web addresses already present in your own posts and pages. The plugin does not choose or add addresses of its own.<\/li>\n<li>What is sent: a standard web request, identifying itself as \"CRAILinkSense\" together with your site address, in the same way a search engine crawler or any link checker identifies itself. No personal data, page content, or information about your visitors is included.<\/li>\n<li>What is kept: only the response status, such as \"working\" or \"not found\", stored in your own database. Nothing is stored anywhere else.<\/li>\n<li>When: in the background on a schedule, and each link is re-checked at most once every seven days.<\/li>\n<li>Turning it off: broken link checking runs as part of the background scan, which you can pause at any time from the Overview screen.<\/li>\n<\/ul>\n\n<p>Because the addresses requested are the ones you linked to yourself, there is no\nsingle provider to name here, and therefore no terms of use or privacy policy\nfor this plugin to link to. Any website you link to has its own terms, exactly as\nit does for any visitor who follows that link.<\/p>\n\n<p>All other work, including reading your pages, matching them and suggesting links,\nhappens entirely on your own server.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install through Plugins &gt; Add New.<\/li>\n<li>Activate it.<\/li>\n<li>Open <strong>LinkSense<\/strong> in the admin menu. The first scan starts automatically and runs in the background.<\/li>\n<li>Large sites take a few minutes to index. Use <strong>Scan now<\/strong> to speed up the first pass.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20links%20survive%20if%20i%20delete%20the%20plugin%3F\"><h3>Do my links survive if I delete the plugin?<\/h3><\/dt>\n<dd><p>On a standard WordPress site, yes \u2014 links are written into your post content, so they remain if the plugin is deactivated or deleted. On page-builder sites the plugin adds links as pages load instead (writing into a builder's data risks your layout), so those links need the plugin active. The settings screen tells you which mode your site uses and why.<\/p><\/dd>\n<dt id=\"does%20it%20change%20my%20content%20without%20asking%3F\"><h3>Does it change my content without asking?<\/h3><\/dt>\n<dd><p>Never. Every link is a suggestion until you approve it, and each suggestion shows the exact sentence and the exact words that become clickable before anything is added. Removing a link puts your original sentence back.<\/p><\/dd>\n<dt id=\"does%20it%20send%20my%20content%20anywhere%3F\"><h3>Does it send my content anywhere?<\/h3><\/dt>\n<dd><p>No. Analysis runs on your own server. The free plugin's only outbound requests are link checks \u2014 confirming the links already in your posts still resolve.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%2C%20divi%2C%20or%20other%20page%20builders%3F\"><h3>Does it work with Elementor, Divi, or other page builders?<\/h3><\/dt>\n<dd><p>Yes. The plugin detects builder sites and adds links as pages render rather than editing builder data, which protects your layout. This is chosen automatically on install and stated in the settings.<\/p><\/dd>\n<dt id=\"how%20is%20the%20wording%20chosen%3F\"><h3>How is the wording chosen?<\/h3><\/dt>\n<dd><p>From your own writing. The free plugin only ever links words that already exist in your sentences, and it applies the same quality rules to every suggestion: the wording must read as a real phrase and must describe the page it points to, or it is not offered.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20my%20site%20down%3F\"><h3>Will it slow my site down?<\/h3><\/dt>\n<dd><p>Analysis runs in the background in small batches. On the front of your site, stored links are plain HTML in your content; rendered links (builder mode) are added by a lightweight filter at display time.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.68.6<\/h4>\n\n<ul>\n<li>Links to an address on your site that has never existed \u2014 a typo, a slug that was never published, a path someone invented \u2014 are now reported. The check that finds broken internal links only looked at links that pointed at a real page once, which excluded exactly the ones most likely to be broken.<\/li>\n<li>Such a link is now re-resolved before being called broken, so one that points at a page published since the last scan is recognised rather than reported.<\/li>\n<\/ul>\n\n<h4>1.68.5<\/h4>\n\n<ul>\n<li>Confirmed against WordPress 7.1.<\/li>\n<\/ul>\n\n<h4>1.68.4<\/h4>\n\n<ul>\n<li>Broken internal links now appear straight after a scan. Link checking was left entirely to an hourly background schedule, and a link had to fail twice before being listed \u2014 so deleting a page and rescanning reported that every link was working, sometimes for hours.<\/li>\n<li>A link to one of your own posts is now settled on the first check. The two-strike rule exists so that a momentary network failure is not reported as a broken link, which is right for an outside address; whether your own post is published is not a network question, and asking twice cannot change the answer.<\/li>\n<li>Links to outside websites are unchanged: still checked in the background, still reported only after failing twice.<\/li>\n<\/ul>\n\n<h4>1.68.3<\/h4>\n\n<ul>\n<li>New \"Pages with no links\" filter on Suggested links: shows only the suggestions that would give a page its first link. It reads the live link count, so nothing can hide a row from it.<\/li>\n<li>Removed the \"Basic links\" filter where there is no AI to contrast it with. Without AI wording it returned the same list as \"All\" \u2014 two names for one list is a control that does nothing.<\/li>\n<\/ul>\n\n<h4>1.68.2<\/h4>\n\n<ul>\n<li>The version number now appears beside the plugin name on every screen, and can be selected and copied.<\/li>\n<\/ul>\n\n<h4>1.68.1<\/h4>\n\n<ul>\n<li>The two buttons on \"Needs links\" no longer read as the same thing. \"Find links for this\" sat beside \"Find links for all of these\" while doing something quite different \u2014 one opens a chooser and waits for you, the other searches every page on its own. They are now \"Choose a link\u2026\" and \"Search for links automatically\".<\/li>\n<li>Suggested wording is no longer offered with the punctuation it was cut at, or with invisible characters carried over from the page. A phrase ending in a dash, or with unbalanced brackets, is a slice of a sentence rather than a phrase.<\/li>\n<li>Wording ending in a plain verb \u2014 \"Manitoba traders sit\", \"spreads vary\" \u2014 is refused. Link text names something; it does not describe what the sentence was doing.<\/li>\n<\/ul>\n\n<h4>1.68.0<\/h4>\n\n<ul>\n<li>\"Link from another page\" now holds the same standard as everything else. It scored the pages it offered and then ignored the score, so it listed pages nine per cent related \u2014 including boilerplate such as an affiliate disclosure \u2014 beside a box inviting you to link them. Whether two pages belong together is a fact about the pages, not a matter of taste, so weak pairings are no longer offered. Where nothing qualifies it says so.<\/li>\n<li>The suggested wording in that box is no longer pre-filled with a phrase the plugin would refuse from its own AI. An empty box asks you to think; a box already filled with the wrong answer invites you to press the button.<\/li>\n<li>Sentences with no usable wording in them are no longer offered as places to put a link.<\/li>\n<\/ul>\n\n<h4>1.67.2<\/h4>\n\n<ul>\n<li>Rewrote the plugin listing: description, FAQ, and tags now describe what the plugin actually does and how links are stored.<\/li>\n<\/ul>\n\n<h4>1.67.1<\/h4>\n\n<ul>\n<li>Internal development notes are no longer packaged inside the plugin. Four of them had shipped in every build for ten releases.<\/li>\n<li>Removed the last trace of the Pro plugin's prefix from the free plugin's code (a cache group name; no behaviour change).<\/li>\n<\/ul>\n\n<h4>1.67.0<\/h4>\n\n<h4>1.66.0<\/h4>\n\n<ul>\n<li>New installs now choose how links are stored based on the site. Most sites get links written into their own content, so they stay whatever happens to this plugin \u2014 they are your links, in your posts. Sites using a page builder get links added as the page loads instead, because a builder keeps your content in its own format and writing into it risks the layout.<\/li>\n<li>The settings screen now says which one your site is set to and why, rather than offering two options and leaving you to guess.<\/li>\n<li>Existing sites are not changed. Switching someone to writing into their posts is not a change of default, it is an edit they did not ask for.<\/li>\n<\/ul>\n\n<h4>1.65.1<\/h4>\n\n<ul>\n<li>Switching off the Pro plugin no longer leaves AI-written suggestions in the list. They stayed there, still labelled as AI wording, on a plugin with no code to add a written sentence to a page. They are hidden rather than deleted \u2014 that work was paid for, and switching Pro back on brings all of it back.<\/li>\n<\/ul>\n\n<h4>1.65.0<\/h4>\n\n<ul>\n<li>\"Pages needing links\" is now its own tab, called \"Needs links\", beside \"Suggested links\". It was a section inside Reports, which put the question one level below the answer \u2014 you saw a queue of fixes without the problem they were for. It is also the only screen that shows the site getting better, which is the one worth returning to.<\/li>\n<li>Those two tabs now stand out from the rest, and each carries its own count: suggestions waiting, and pages still short of links.<\/li>\n<li>On a phone the tab row scrolls sideways instead of wrapping.<\/li>\n<\/ul>\n\n<h4>1.64.7<\/h4>\n\n<h4>1.64.6<\/h4>\n\n<h4>1.64.5<\/h4>\n\n<h4>1.64.4<\/h4>\n\n<h4>1.64.4<\/h4>\n\n<h4>1.64.3<\/h4>\n\n<ul>\n<li>Picking one of the \"Or link these words\" options now updates the highlighted wording on the card. It changed what \"Add link\" would insert but left the card showing the original, so you were told one thing and given another \u2014 on a card whose whole purpose is judging the wording before adding it.<\/li>\n<li>AI wording now takes the same reading test as the plugin's own. It never did, which is how \"turn 000 into\" reached a reader: that came from \"$1,000\", where the thousands separator split the number and the wording kept the second half.<\/li>\n<\/ul>\n\n<h4>1.64.2<\/h4>\n\n<h4>1.64.1<\/h4>\n\n<ul>\n<li>The \"Or link these words\" options are now checked before they are offered. They never were, so every card carried a row of half-sentences \u2014 \"toward investment\", \"pips pip value\", \"either capital\", \"tax time far\" \u2014 which is the plugin recommending nonsense in its own voice.<\/li>\n<li>Wording now starts within seconds of a scan instead of several minutes. The pass that finds links for pages nothing links to was running to exhaustion first, so on a 76-page site the list sat empty while it worked. It now runs a few rounds, hands over to the wording, and finishes in the background.<\/li>\n<\/ul>\n\n<h4>1.64.0<\/h4>\n\n<ul>\n<li>Link wording starting with a bare number is now refused. \"038 regulation\" reached a reader: whatever that number was part of, the wording kept the tail of it and dropped the head, and it names nothing. A year is still allowed, at either end.<\/li>\n<li>Link wording starting with a verb is now refused. \"analyse markets\" was offered as a description of a broker review \u2014 it tells the reader what to do rather than where the link goes. Link text stands in for a page title, and titles are things rather than instructions.<\/li>\n<\/ul>\n\n<h4>1.63.9<\/h4>\n\n<h4>1.63.8<\/h4>\n\n<h4>1.63.7<\/h4>\n\n<h4>1.63.6<\/h4>\n\n<h4>1.63.5<\/h4>\n\n<ul>\n<li>Pages nothing links to are now reconsidered on every run. The search recorded each page it examined so it would not ask about the same ones repeatedly \u2014 but it recorded them whether or not it had managed to find anything, so a page it failed once was excluded from every later run. On a site whose unlinked pages are its newest, that was exactly the wrong set to give up on.<\/li>\n<li>Suggestions that need AI wording, have been through the AI and got none are no longer listed. They showed as a card with a greyed-out \"Needs AI wording\" button and nothing the reader could do. They remain in the database for a later retry.<\/li>\n<\/ul>\n\n<h4>1.63.4<\/h4>\n\n<h4>1.63.3<\/h4>\n\n<h4>1.63.1<\/h4>\n\n<h4>1.63.0<\/h4>\n\n<ul>\n<li>Fixed the Link text report showing \"Nothing to report yet\" on every site. The report data grew a health verdict some versions ago and the screen was still reading the old shape, so it always looked empty. The verdict now leads the report.<\/li>\n<\/ul>\n\n<h4>1.62.1<\/h4>\n\n<ul>\n<li>With AI wording off, scans behave exactly as before.<\/li>\n<\/ul>\n\n<h4>1.62.0<\/h4>\n\n<h4>1.61.1<\/h4>\n\n<h4>1.61.0<\/h4>\n\n<ul>\n<li>Suggested links now puts pages nothing links to at the top, then the biggest shortfall, then the best match. Previously the shortfall was scaled by length, so a long page with two links outranked a short page with none.<\/li>\n<li>Fixed most pages that nothing links to never being looked at. The pass that searches for links TO those pages was driven entirely by WP-Cron, and on hosts where cron does not fire it ran once and stopped. The dashboard's own polling now carries it on, the same way it already did for the main check.<\/li>\n<\/ul>\n\n<h4>1.60.0<\/h4>\n\n<ul>\n<li>Upgrading from the free version to Pro now just works. The free version recognised Pro only at one exact folder name, so a folder renamed by hand, by a host's installer, or unpacked over the top left both editions running at once \u2014 which is what produced duplicate links and licensing errors. Each edition now recognises the other by its file name, whatever the folder is called.<\/li>\n<li>Where Pro's files have been unpacked into the free version's own folder, the free version stands aside for it rather than the two fighting over the same site.<\/li>\n<li>Your suggestions, links and settings carry across untouched \u2014 they live in the database, not in the plugin folder.<\/li>\n<\/ul>\n\n<h4>1.59.2<\/h4>\n\n<h4>1.59.1<\/h4>\n\n<ul>\n<li>Fixed \"the plugin could not be activated because it triggered a fatal error\" when switching on Pro while the free version was still active. The two are built from one codebase and share the same class names, so a second copy loading into the same request could not be declared. Pro now stands aside for that one request, switches the free version off, and starts normally on the next page load.<\/li>\n<\/ul>\n\n<h4>1.59.0<\/h4>\n\n<h4>1.58.0<\/h4>\n\n<h4>1.57.0<\/h4>\n\n<ul>\n<li>Where the AI's wording is refused, the plugin's own suggestion is used instead. On the examples that prompted this, that wording was the better of the two anyway.<\/li>\n<\/ul>\n\n<h4>1.56.0<\/h4>\n\n<ul>\n<li>Fixed link text that read as half a sentence. Wording like \"brokers accepting\", \"using real\", \"why traders\", \"trade beyond\" and \"trade 40\" was being offered as a description of a page. Link text now has to read as a thing rather than as a span of a sentence with the ends cut off.<\/li>\n<\/ul>\n\n<h4>1.55.1<\/h4>\n\n<ul>\n<li>Fixed poor link wording on sites with a lot of suggestions. Wording not already used was being preferred whatever the cost, so once the good phrases for a page were taken, each new suggestion was pushed to a worse one \u2014 ending in fragments like \"using real\" while \"using real money\" sat unused in the alternatives. Varied wording now has to be nearly as good as the wording it replaces, and a phrase that is simply another one cut short is never chosen.<\/li>\n<\/ul>\n\n<h4>1.55.0<\/h4>\n\n<ul>\n<li>No change to the free version.<\/li>\n<\/ul>\n\n<h4>1.54.0<\/h4>\n\n<ul>\n<li>The permanent-storage choice now says which pages keep their links, not only which ones do not. Links stay on pages written in the block editor or the classic editor \u2014 anywhere your writing is stored in the post itself \u2014 and not on pages built with Elementor, Divi, Beaver Builder or Bricks. Both sides are shown with a count for your site.<\/li>\n<li>Bigger logo on the dashboard heading, and the new logo in the WordPress menu.<\/li>\n<\/ul>\n\n<h4>1.53.0<\/h4>\n\n<ul>\n<li>New logo, on the dashboard heading and on the WordPress menu.<\/li>\n<\/ul>\n\n<h4>1.52.0<\/h4>\n\n<ul>\n<li>\"Keep the links in my content permanently\" now says plainly what it cannot cover, and how many of your pages that is. Pages built with a page builder keep their layout outside the post, so links there can never be saved into your content \u2014 and on a site built mostly that way the setting applies to very little. That was the last sentence of a paragraph whose previous sentence promised the links stay permanently; it is now set apart, and counted.<\/li>\n<li>The same limit is stated on the Settings screen whether or not your site has page-builder pages today, since you might start using one later.<\/li>\n<\/ul>\n\n<h4>1.51.2<\/h4>\n\n<h4>1.51.1<\/h4>\n\n<h4>1.51.0<\/h4>\n\n<ul>\n<li>Removed housekeeping belonging to the Pro version from the free one. It cleared settings the free version never creates, so it did nothing here \u2014 but it had no business being in this download.<\/li>\n<li>Uninstalling now also removes any API keys left behind by a previous Pro install, so deleting the plugin does not leave a stored credential in your database.<\/li>\n<\/ul>\n\n<h4>1.50.7<\/h4>\n\n<ul>\n<li>Fixed resuming after a pause starting the whole check again from the beginning. A run paused at \"18 found, 10 of 76 pages\" came back as \"0 found, 0 of 121 pages\" and everything already done was thrown away. Resuming now carries on from where it stopped.<\/li>\n<li>Fixed \"Pause scanning\" only pausing half the work. Reading pages stopped, but finding links carried on to the end behind a screen that said nothing was happening \u2014 which is why there was nothing left to resume. Both stop together now.<\/li>\n<li>While paused, the bar stays on screen showing where the run stopped, instead of disappearing as though it had been abandoned.<\/li>\n<\/ul>\n\n<h4>1.50.6<\/h4>\n\n<ul>\n<li>Fixed the AI wording panel breaking the suggestion card. \"See the wording options\" sat outside the card, and opening it squeezed the suggestion text into a column one word wide. The panel now has a row of its own, directly under the text it belongs to.<\/li>\n<\/ul>\n\n<h4>1.50.5<\/h4>\n\n<ul>\n<li>Fixed every screen failing to load with \"Could not load suggestions\". A helper added in 1.50.1 ended up calling itself, so the page ran out of stack before it could draw anything. It affected both versions and every tab.<\/li>\n<\/ul>\n\n<h4>1.50.4<\/h4>\n\n<ul>\n<li>Fixed the Reports tab opening on an error. It opened on Progress, which is a Pro feature, so the free version asked for something it does not have and showed a failure instead of your reports. Reports now opens on \"Pages needing links\".<\/li>\n<li>Fixed the Progress report in Pro being registered in the wrong place, so it could never be found.<\/li>\n<li>When something cannot load, the message now says what the server actually reported instead of only that it failed.<\/li>\n<\/ul>\n\n<h4>1.50.3<\/h4>\n\n<ul>\n<li>The free version no longer calls itself Pro. It showed a \"Pro\" badge beside the title on every screen, and listed itself as \"LinkSense Pro\" in the WordPress sidebar.<\/li>\n<\/ul>\n\n<h4>1.50.2<\/h4>\n\n<ul>\n<li>Fixed the suggestion cards on narrow screens, where the tick box could still push the match score and the buttons onto their own row.<\/li>\n<li>Removed a stylesheet that was never loaded. Its rules were already in the main one, so nothing changes on screen.<\/li>\n<\/ul>\n\n<h4>1.50.1<\/h4>\n\n<ul>\n<li>Removed references to AI features from the free version. \"Pages needing links\" told you to switch on wording options on a tab that does not exist here, and a few other messages did the same. The free version only ever links words already on your pages, so it now says so, and says what to do instead.<\/li>\n<li>Fixed the suggestion cards putting the match score and the buttons below the tick box instead of beside the text.<\/li>\n<li>Fixed \"3 links added.Undo these 3Keep them\" running together with no spaces.<\/li>\n<\/ul>\n\n<h4>1.50.0<\/h4>\n\n<ul>\n<li>Adds several links at once. Tick the suggestions you want and add them in one go, with an undo that takes back exactly that batch and nothing you added earlier.<\/li>\n<li>Link wording now gets a verdict, not just a table: whether your anchor text is healthy, how many phrases are vague, over-used or pointing at more than one page, and which are worst.<\/li>\n<li>\"Find pages that could link here\", in the editor. The sidebar answers what this page should link to, which is the wrong way round just after publishing \u2014 a new post has nothing pointing at it. When nothing is found it says why.<\/li>\n<li>Fixed link wording counts being inflated. An added link is recorded in two places by design, and the report added them together, so a phrase used on three pages was reported as six \u2014 enough to flag a site as over-optimised when it was doing nothing wrong.<\/li>\n<li>Fixed the page breakdown naming a skip reason as an editor: a page with no title was listed as \"No_title\" alongside \"Standard editor\". Skipped pages are now reported separately and in plain words.<\/li>\n<li>A page that could not take a written link is recorded, rather than the reason being discarded unread.<\/li>\n<\/ul>\n\n<h4>1.49.0<\/h4>\n\n<p>New<\/p>\n\n<ul>\n<li>Add several links at once. Tick the suggestions you want and add them in one go, instead of one click each. Deliberately a selection rather than an \"add everything\" button \u2014 looking at each link before it goes in is the point of this plugin, and a single button that applied two hundred unseen suggestions would throw that away.<\/li>\n<li>Undo a batch. Adding several offers to take back exactly those links, and the offer survives the list reloading. Undoing never touches links added earlier.<\/li>\n<li>Link wording now gets a verdict, not just a table. The report opens with whether your anchor text is healthy, how many phrases are vague, over-used, or pointing at more than one page, and which are worst.<\/li>\n<li>\"Find pages that could link here\", in the editor. The suggestions in the sidebar answer what this page should link to, which is the wrong way round just after publishing \u2014 a new post has nothing pointing at it and linking out does not fix that. When nothing is found it says why, rather than reporting nothing.<\/li>\n<\/ul>\n\n<p>Fixed<\/p>\n\n<ul>\n<li>Link wording counts were inflated. An added link is recorded in two places by design, and the report added them together, so a phrase used on three pages was reported as six \u2014 enough to flag a site as over-optimised when it was doing nothing wrong.<\/li>\n<\/ul>\n\n<h4>1.48.4<\/h4>\n\n<ul>\n<li>Fixed the suggestions list sticking on \"Loading\u2026\" after a check finished. The screen reloaded itself once the results existed, but a finished job stays finished, so it reloaded on every render and wiped the list before it could appear.<\/li>\n<li>Fixed \"Check my pages\" announcing it had finished after a single batch. It watched for figures the progress endpoint does not report, so it read them as nothing left to do and stopped \u2014 usually after the first 25 pages. The rest was still worked out in the background, which is why suggestions appeared later with nothing on screen having said so, and why the count on the bar read as none found.<\/li>\n<li>Suggestion building now continues on hosts where WP-Cron never runs. The job was scheduled and then waited for a cron spawn that, where loopback requests are blocked or cron is disabled, never came \u2014 leaving it at \"0 of N\" indefinitely. The dashboard's own polling now runs a batch when the scheduled one is overdue.<\/li>\n<\/ul>\n\n<h4>1.48.3<\/h4>\n\n<ul>\n<li>\"Check my pages\" now takes you to Suggested links and shows the work there, instead of leaving you on the Overview watching a counter and then having to notice a badge and click across. Suggestions are the point of pressing it, so that is where it goes.<\/li>\n<li>While a check is running, an empty suggestions list says so rather than telling you to press the button you have just pressed.<\/li>\n<li>Removed \"Check everything again from scratch\". It read as a more thorough version of the button above it, which it was not \u2014 ordinary checking already re-reads every changed page and works the suggestions out again.<\/li>\n<li>Fixed the editor breakdown naming a skip reason as an editor. A page with no title was reported as \"No_title: 1\" alongside \"Standard editor: 76\", because the reason a page was skipped is recorded in the same place as the editor it was written in. Skipped pages are now listed separately and in plain words.<\/li>\n<\/ul>\n\n<h4>1.48.2<\/h4>\n\n<ul>\n<li>The page-builder limit on permanent mode is now stated whether or not your site currently has any such pages. It was only shown once a page-builder page existed, which meant a site with none was told nothing \u2014 and the setting could be switched on, a builder installed later, and links on those new pages silently left out of the very thing the setting promises.<\/li>\n<\/ul>\n\n<h4>1.48.1<\/h4>\n\n<ul>\n<li>Permanent mode now states plainly, on the setting itself and during first-time setup, that it covers block and classic editor pages only. Pages built with a page builder keep their layout in the builder's own storage rather than in the post, so links on them can never be written into your content and are removed if the plugin is deleted \u2014 whatever this setting says.<\/li>\n<li>Where a site does have page-builder pages, the count is shown too, so \"some of your pages are different\" becomes a number you can act on.<\/li>\n<li>A page that could not take a written link is now recorded, rather than the reason being discarded unread.<\/li>\n<li>Removed the Tools tab. The content check and the address-replace utility it held were rarely useful, and the choice of what happens to your links if the plugin is removed already lives in Settings.<\/li>\n<li>\"Pages needing links\" no longer lists drafts or unpublished pages. The index drops a post when it stops being published, but that relies on the save hook firing \u2014 a bulk edit or an import could leave one listed as work outstanding when nobody could act on it.<\/li>\n<\/ul>\n\n<h4>1.48.0<\/h4>\n\n<p>Fixes<\/p>\n\n<ul>\n<li>Links approved but never written into your content. Only four block types were ever written to, so posts built from the classic editor, or from any third-party text block, silently had nothing saved. The links still showed on the page, so the omission was invisible until the plugin was removed.<\/li>\n<li>Links that disappeared from the page entirely. A post could be flagged as having its links written in when nothing had been written, and that flag is what tells the render-time filter to stand down.<\/li>\n<li>Link text containing a non-breaking space could not be placed. The link was recorded as added and nothing appeared. This affects any content pasted in or touched by a visual editor.<\/li>\n<li>Nonsense link text like \"Interactive Brokers\u2713offers\", built from words either side of a table cell or a tick. No such text exists on the page, so accepting one could never have worked.<\/li>\n<li>Sentences split in half at a line break. WordPress wraps soft newlines in <code>&lt;br&gt;<\/code>, and those were being read as the end of a sentence, so wording spanning the break could not be found on a page that plainly contained it.<\/li>\n<li>\"Don't link in the first paragraph\" quietly meant \"never write links into my content\" for anyone who had it switched on.<\/li>\n<li>Editing a post during the first scan could sideline up to 25 readable pages as unreadable.<\/li>\n<li>Pressing \"Check my pages\" while a check was already running restarted it from the beginning. On a site polled while running, it could never finish.<\/li>\n<li>Adding a link now updates the reports immediately. Previously \"Pages needing links\" went on listing a page after you had linked it.<\/li>\n<li>The \"Links in \/ suggested\" column never showed the suggested half \u2014 every row read \"None\" however many were waiting.<\/li>\n<li>Pages showing \"0 related pages\" while sitting in a library of articles on the same subject. The search used each page's most distinctive words, which is close to searching for what it shares with nothing; it now widens through ordinary vocabulary until it finds something.<\/li>\n<li>Suggestion previews cut off mid-sentence. They now show the sentence the link sits in, plus one either side.<\/li>\n<\/ul>\n\n<p>Improvements<\/p>\n\n<ul>\n<li>Pages nothing links to are now found automatically after each check, instead of needing \"Find links for this\" pressed once per page.<\/li>\n<li>Link text is more varied. Wording that already points at a page is passed over in favour of wording that does not, so the same phrase is not repeated across your site where an alternative exists.<\/li>\n<li>\"Pages needing links\" now judges a page by its length. A long guide that only one page mentions is still buried; a short note is served by one link.<\/li>\n<li>New wording rules setting (automatic, standard, or relaxed). Sites built from a title template, or made mostly of headings, were having nearly every candidate rejected \u2014 on one 76-page site the standard rules left three suggestions in total. Automatic measures the site and decides.<\/li>\n<li>Suggestion counts now explain themselves: \"created 0\" says which check each candidate fell at.<\/li>\n<li>Extension points added so CRAI LinkSense Pro can run on this engine without a forked copy of it.<\/li>\n<li>Installing CRAI LinkSense Pro now leaves this plugin dormant rather than running both at once. Your settings, suggestions and links are untouched \u2014 Pro reads the same data.<\/li>\n<\/ul>\n\n<p>Security<\/p>\n\n<ul>\n<li>No change. The endpoint permissions introduced in 1.47.0 are unchanged, and the dashboard still verifies capability on render. The dashboard menu is available to Editors again, as in 1.47.0, but the Settings tab is now hidden from anyone without <code>manage_options<\/code> \u2014 which is what made 1.47.2 close the whole screen. Those endpoints continue to enforce it independently.<\/li>\n<\/ul>\n\n<h4>1.47.2<\/h4>\n\n<ul>\n<li>The LinkSense dashboard now requires <code>manage_options<\/code>. In 1.47.0 it was opened to <code>edit_others_posts<\/code>, but the dashboard also contains the Tools and Settings screens, which are administrator only \u2014 an Editor would have seen those tabs and hit permission errors on them. Making the whole screen administrator only keeps it consistent with what it contains.<\/li>\n<li>Added an explicit capability check when rendering the dashboard page, in addition to the menu capability.<\/li>\n<li>Per-post suggestions in the post editor are unchanged and remain available to authors and contributors for posts they can edit.<\/li>\n<\/ul>\n\n<h4>1.47.1<\/h4>\n\n<ul>\n<li>Shortened the 1.47.0 upgrade notice, which exceeded the 300 character limit. Readme only, no functional change. The full detail of the permission changes stays in the 1.47.0 entry below and in the FAQ.<\/li>\n<\/ul>\n\n<h4>1.47.0<\/h4>\n\n<ul>\n<li>Security: tightened REST API permissions so each endpoint requires a capability that matches its scope. Site-wide reports (stats, orphans, broken links, applied links, opportunities, link text and rebuild status) now require <code>edit_others_posts<\/code> instead of <code>edit_posts<\/code>, because they cover posts the user may not be allowed to edit. Site-wide maintenance actions (bulk suggestion generation and the background rebuild start, pause and stop controls) now require <code>manage_options<\/code>.<\/li>\n<li>Security: the link candidates and post links endpoints now verify <code>edit_post<\/code> against the specific post requested, matching the checks already used by the other per-post endpoints.<\/li>\n<li>The LinkSense dashboard menu now requires <code>edit_others_posts<\/code>, so it is only shown to roles that can actually load the site-wide reports it displays. Per-post suggestions in the editor are unchanged and remain available to authors and contributors for their own posts.<\/li>\n<li>Documented the capability model in the FAQ.<\/li>\n<\/ul>\n\n<h4>1.46.5<\/h4>\n\n<ul>\n<li>Resolved the remaining Plugin Check notices on the candidate-selection query. It now uses the same suppression style as the plugin's two other dynamic-placeholder queries, which pass cleanly. No behaviour change.<\/li>\n<\/ul>\n\n<h4>1.46.2<\/h4>\n\n<ul>\n<li>Added a \"How links are stored\" section explaining both storage modes, what permanent mode writes, and how to reverse it.<\/li>\n<li>Removed a redundant transient cleanup added in 1.46.1; uninstall already removed them in bulk.<\/li>\n<li>Corrected a misleading code comment that described a write to the core posts table as a write to one of the plugin's own tables.<\/li>\n<\/ul>\n\n<h4>1.46.1<\/h4>\n\n<ul>\n<li>Resolved all Plugin Check warnings. Database queries that built their placeholder lists dynamically now pass arguments individually so the placeholder count can be verified, and the suppression comments on two Diagnostics queries were attached to the wrong lines and had no effect.<\/li>\n<li>Uninstall now also removes the unplaced-link record and the plugin's cached transients.<\/li>\n<li>Corrected the FAQ, which claimed the plugin makes no outbound requests. Broken link checking has to request the addresses your pages link to, as the \"External services\" section has always described.<\/li>\n<\/ul>\n\n<h4>1.46.0<\/h4>\n\n<ul>\n<li>Fixed approved links that never appeared on the page. Links are never written into figure captions, quotations, or text that is already a link, but the suggestion engine did not know that and would offer wording from those places. Approving one recorded the link as added while the page rendered without it. Those regions are now visible to the engine as unlinkable, so the wording is never offered in the first place. Their words still count towards what a page is about.<\/li>\n<li>When a link genuinely cannot be placed, it is now recorded and counted in Diagnostics instead of failing silently.<\/li>\n<li>Existing anchor text on a page can no longer be reused  &hellip;<\/li>\n<\/ul>","raw_excerpt":"Internal links from wording you already wrote. Finds orphan pages, checks broken links. Nothing changes until you approve it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/348370","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=348370"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mark456321"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=348370"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=348370"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=348370"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=348370"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=348370"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=348370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}