{"id":352000,"date":"2026-08-20T10:01:48","date_gmt":"2026-08-20T10:01:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/linker-ai-by-albion\/"},"modified":"2026-08-20T10:19:42","modified_gmt":"2026-08-20T10:19:42","slug":"albion-link-assistant","status":"publish","type":"plugin","link":"https:\/\/en-ca.wordpress.org\/plugins\/albion-link-assistant\/","author":23509784,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.8.3","stable_tag":"1.8.3","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Albion Link Assistant","header_author":"Albion Web Studio","header_description":"AI-powered internal linking using your own OpenAI API key. Context-aware suggestions with one-click insertion, inbound\/outbound link management, visual sitemap, broken links, auto-linking and more.","assets_banners_color":"524b6a","last_updated":"2026-08-20 10:19:42","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/albionsite.com\/plugins\/albion-link-assistant","header_author_uri":"https:\/\/albionsite.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":61,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.8.0":{"tag":"1.8.0","author":"abilion","date":"2026-08-20 10:01:18"},"1.8.1":{"tag":"1.8.1","author":"abilion","date":"2026-08-20 10:04:59"},"1.8.2":{"tag":"1.8.2","author":"abilion","date":"2026-08-20 10:13:56"},"1.8.3":{"tag":"1.8.3","author":"abilion","date":"2026-08-20 10:19:42"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3656443,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3656443,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3656443,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3656443,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.8.0","1.8.1","1.8.2","1.8.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3656443,"resolution":"1","location":"assets","locale":"","width":1296,"height":785},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3656443,"resolution":"2","location":"assets","locale":"","width":1296,"height":695},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3656443,"resolution":"3","location":"assets","locale":"","width":1296,"height":770},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3656443,"resolution":"4","location":"assets","locale":"","width":1296,"height":731},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3656443,"resolution":"5","location":"assets","locale":"","width":1296,"height":709}},"screenshots":{"1":"Site-wide link suggestions report with match scores and one-click insertion","2":"Dashboard with the link health score and the orphaned posts report","3":"Anchor text diversity report, flagging over-used and generic anchors","4":"Broken link scanner showing 404s, redirects and their anchors","5":"Visual sitemap of the internal link graph, sized by inbound links"}},"plugin_section":[],"plugin_tags":[2353,6681,6503,194533,186],"plugin_category":[55],"plugin_contributors":[276627],"plugin_business_model":[],"class_list":["post-352000","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-internal-links","plugin_tags-linking","plugin_tags-openai","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-abilion","plugin_committers-abilion"],"banners":{"banner":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/banner-772x250.png?rev=3656443","banner_2x":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/banner-1544x500.png?rev=3656443","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/icon-128x128.png?rev=3656443","icon_2x":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/icon-256x256.png?rev=3656443","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/screenshot-1.png?rev=3656443","caption":"Site-wide link suggestions report with match scores and one-click insertion"},{"src":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/screenshot-2.png?rev=3656443","caption":"Dashboard with the link health score and the orphaned posts report"},{"src":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/screenshot-3.png?rev=3656443","caption":"Anchor text diversity report, flagging over-used and generic anchors"},{"src":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/screenshot-4.png?rev=3656443","caption":"Broken link scanner showing 404s, redirects and their anchors"},{"src":"https:\/\/ps.w.org\/albion-link-assistant\/assets\/screenshot-5.png?rev=3656443","caption":"Visual sitemap of the internal link graph, sized by inbound links"}],"raw_content":"<!--section=description-->\n<p><strong>Albion Link Assistant<\/strong> is a free, self-hosted internal linking tool. It uses your own OpenAI API key to semantically index your content and suggest the most relevant internal links while you write.<\/p>\n\n<p>Documentation and setup guide: <a href=\"https:\/\/albionsite.com\/plugins\/albion-link-assistant\">albionsite.com\/plugins\/albion-link-assistant<\/a><\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>\ud83d\udd17 AI-powered link suggestions in Gutenberg and Classic Editor<\/li>\n<li>\ud83e\uddf1 Full Elementor and Beaver Builder support \u2014 indexing, reports and link insertion<\/li>\n<li>\ud83c\udfaf Reuses focus keywords from Yoast, Rank Math, All in One SEO and SEOPress<\/li>\n<li>\u26a1 Scales to large sites \u2014 vectors stored packed and scored in chunks, so memory stays flat<\/li>\n<li>\u270d\ufe0f Anchor text taken from your own wording, and only ever a phrase that is really in the post<\/li>\n<li>\ud83d\udcca Site health score (0\u2013100%)<\/li>\n<li>\u26a0\ufe0f Orphaned posts report<\/li>\n<li>\ud83d\udd17 Broken links scanner (internal + external)<\/li>\n<li>\u26a1 Auto-linking rules (keyword \u2192 URL)<\/li>\n<li>\ud83d\udd04 URL Changer \u2014 update all internal links at once<\/li>\n<li>\ud83d\udcb0 Money Pages \u2014 mark and prioritize key pages<\/li>\n<li>\ud83d\udcc8 Click tracking + Link Report<\/li>\n<li>\ud83c\udf10 Domain Report (external links)<\/li>\n<li>\ud83d\udccb Auto-link activity log<\/li>\n<li>\ud83d\udd17 Related Posts widget<\/li>\n<li>\ud83d\udeab Exclude posts, categories, tags<\/li>\n<li>Polylang support (multilingual)<\/li>\n<li>\u2b07\ufe0f Export CSV<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Post content is sent to OpenAI to generate embeddings. No content is stored externally \u2014 embeddings are saved in your own WordPress database.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the OpenAI API to turn your posts into embeddings, which is how it works out which pages are related.<\/p>\n\n<p>It is called when you index or re-index your content, and when suggestions are requested for the post you are editing. The post title and text content are sent for that purpose. No personal data about your visitors is sent, and nothing is sent anywhere else \u2014 the plugin talks only to OpenAI, using an API key you supply yourself.<\/p>\n\n<p>Service: OpenAI API \u2014 <a href=\"https:\/\/api.openai.com\">api.openai.com<\/a>\nTerms of use: <a href=\"https:\/\/openai.com\/policies\/terms-of-use\">openai.com\/policies\/terms-of-use<\/a>\nPrivacy policy: <a href=\"https:\/\/openai.com\/policies\/privacy-policy\">openai.com\/policies\/privacy-policy<\/a><\/p>\n\n<h3>Source code<\/h3>\n\n<p>This plugin ships as plain, human-readable source. There is no build step, no bundler and no minified first-party code \u2014 every JavaScript file under <code>assets\/js\/<\/code> is the file that actually runs and can be edited directly.<\/p>\n\n<p>The Gutenberg sidebar is written against the <code>wp.*<\/code> browser globals using <code>wp.element.createElement<\/code>, so it requires no compilation.<\/p>\n\n<p>Third-party libraries:<\/p>\n\n<ul>\n<li>d3 v7.8.5 \u2014 <a href=\"https:\/\/github.com\/d3\/d3\">github.com\/d3\/d3<\/a> \u2014 BSD-3-Clause. Bundled under <code>assets\/vendor\/d3\/<\/code>, which contains both the minified build (<code>d3.min.js<\/code>, used by the plugin) and the full unminified source (<code>d3.js<\/code>), along with the upstream LICENSE file. Both are shipped exactly as published on npm and are not modified.<\/li>\n<\/ul>\n\n<p>Development happens at: <a href=\"https:\/\/github.com\/albion-web-studio\/albion-link-assistant\">github.com\/albion-web-studio\/albion-link-assistant<\/a><\/p>\n\n<h4>Who makes this<\/h4>\n\n<p>Built and maintained by <a href=\"https:\/\/albionsite.com\">Albion Web Studio<\/a>, a web development studio working on WordPress, WooCommerce, OpenCart and custom CRM projects. This plugin came out of internal work on client sites and is released free under the GPL.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin<\/li>\n<li>Go to <strong>Smart Links \u2192 Settings<\/strong> and enter your OpenAI API key<\/li>\n<li>Click <strong>\ud83d\udd0d Run Diagnostic<\/strong> to verify everything works<\/li>\n<li>Click <strong>\u26a1 Re-index All Content<\/strong><\/li>\n<li>Open any post \u2014 the \ud83d\udd17 icon appears in the Gutenberg toolbar<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20get%20an%20openai%20api%20key%3F\"><h3>Where do I get an OpenAI API key?<\/h3><\/dt>\n<dd><p>Visit <a href=\"https:\/\/platform.openai.com\/api-keys\">platform.openai.com\/api-keys<\/a>.<\/p><\/dd>\n<dt id=\"how%20much%20does%20indexing%20cost%3F\"><h3>How much does indexing cost?<\/h3><\/dt>\n<dd><p>Using <code>text-embedding-3-small<\/code> at $0.02\/million tokens. Indexing 1,000 posts typically costs ~$0.01.<\/p><\/dd>\n<dt id=\"why%20does%20%22create%20table%20now%22%20fail%3F\"><h3>Why does \"Create Table Now\" fail?<\/h3><\/dt>\n<dd><p>Your MySQL user may lack CREATE TABLE privilege. Check <strong>\ud83d\udd0d Run Diagnostic<\/strong> for the exact error.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Added a \"Who makes this\" section crediting Albion Web Studio<\/li>\n<li>Plugin URI now points to the plugin's own documentation page<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Links in the plugin description are now clickable instead of appearing as plain text<\/li>\n<li>Fixed mid-sentence line breaks in the description and privacy sections<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Tested against WordPress 7.1<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Fixed: \"Add Link\" copied the URL to the clipboard instead of inserting it on pages built with Elementor or imported from the Classic Editor<\/li>\n<li>The editor sidebar now falls back to server-side insertion, which can write into page-builder layouts<\/li>\n<li>Added support for classic, HTML, verse and preformatted blocks<\/li>\n<li>Clearer result states: inserted, saved (reload to see), or anchor not found<\/li>\n<\/ul>\n\n<h4>1.7.9<\/h4>\n\n<ul>\n<li>Fixed: the visual sitemap drew nodes but no connections \u2014 edge endpoints were returned as strings and dropped by the client<\/li>\n<li>Fixed: Money Pages were never boosted in suggestions, because the comparison against saved IDs could not match<\/li>\n<li>Post IDs are now returned as integers throughout the REST API<\/li>\n<\/ul>\n\n<h4>1.7.8<\/h4>\n\n<ul>\n<li>Fixed: saving a post raised a fatal error \u2014 a save_post hook pointed at a method that was never implemented<\/li>\n<li>Cached link counts and the broken-link scan are now cleared when a post is saved, so reports no longer show stale data for up to ten minutes<\/li>\n<\/ul>\n\n<h4>1.7.7<\/h4>\n\n<ul>\n<li>Fixed: a single problem post no longer aborts an entire Bulk Auto-Link run<\/li>\n<li>Bulk Auto-Link now names the posts it skipped and why, instead of failing with an unexplained HTTP 500<\/li>\n<li>Hardened the bulk path against missing scores, empty URLs and posts with no extractable text<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Fixed: Bulk Auto-Link failed with a generic error \u2014 each edited post queued a fresh OpenAI embedding call, exhausting the request timeout<\/li>\n<li>Fixed: Bulk Auto-Link reported links added on Elementor and Beaver Builder pages while leaving the rendered page unchanged<\/li>\n<li>Fixed: a malformed index row could abort a bulk run with a fatal error<\/li>\n<li>Improved: bulk failures now report the HTTP status instead of an unexplained \"Error\"<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Fixed: the editor sidebar always reported that no posts matched the language filter, instead of returning suggestions<\/li>\n<li>Fixed: post and category exclusions were never applied to editor suggestions<\/li>\n<li>Fixed: the \"Open Settings\" button on the no-API-key screen did nothing when clicked<\/li>\n<li>Improved: the empty-state message now distinguishes between filtered-out candidates and genuinely unrelated content<\/li>\n<\/ul>\n\n<h4>1.7.4<\/h4>\n\n<ul>\n<li>Annotated the remaining read-only $_GET reads so static analysis no longer flags them<\/li>\n<\/ul>\n\n<h4>1.7.3<\/h4>\n\n<ul>\n<li>Tested up to WordPress 7.0<\/li>\n<li>Replaced strip_tags(), parse_url() and direct filesystem calls in the CSV export with WordPress equivalents<\/li>\n<li>Post types in the broken-link scan are now bound through prepare() instead of interpolated<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fixed byte-based text truncation that corrupted non-Latin content sent to OpenAI<\/li>\n<li>The saved API key is no longer rendered back into the settings page<\/li>\n<li>Debug logging is now gated behind WP_DEBUG_LOG instead of always writing<\/li>\n<li>Tables are now created on every site of a multisite network, including new ones<\/li>\n<li>Uninstall now removes generated transients and cleans up across a network<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Escaped two remaining attribute outputs on the dashboard health ring<\/li>\n<li>Added translators comments to strings containing placeholders<\/li>\n<li>Guarded against an empty filtered post-type list producing invalid SQL<\/li>\n<li>Added defensive checks to the sitemap and click-tracking scripts<\/li>\n<li>Removed a third-party product name from the plugin description<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Renamed to Albion Link Assistant; all functions, options, constants, REST routes and database tables now use the <code>albla<\/code> prefix<\/li>\n<li>All JavaScript is now enqueued properly \u2014 no inline script tags remain<\/li>\n<li>d3 is bundled locally instead of being loaded from a CDN<\/li>\n<li>The Gutenberg sidebar is now plain unminified source with no build step<\/li>\n<li>Hardened the public click-tracking endpoint: internal target URLs only<\/li>\n<li>Clearing the auto-link activity log now requires a nonce<\/li>\n<li>Fixed escaping on the \"no API key\" admin notice<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Fixed: Add Link now properly inserts into Gutenberg editor (wp-rich-text dependency)<\/li>\n<li>Fixed: Critical error on plugin deactivation (undefined CRON_HOOK_BATCH)<\/li>\n<li>Improved: Add Link shows \"\ud83d\udccb URL copied\" vs \"\u2705 Added!\" distinction<\/li>\n<li>Improved: onMouseDown preventDefault prevents editor losing selection<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Fixed: DATETIME DEFAULT CURRENT_TIMESTAMP \u2192 TIMESTAMP (MySQL strict mode)<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Fixed: create_table uses both direct query and dbDelta fallback<\/li>\n<li>Fixed: Empty db_error now shows actionable message<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"AI-powered internal linking using OpenAI embeddings. Suggestions, orphaned posts, broken links, auto-linking, health score and more.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/352000","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=352000"}],"author":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abilion"}],"wp:attachment":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=352000"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=352000"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=352000"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=352000"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=352000"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=352000"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}