Title: Web &amp; SEO Autolinker &#8211; AI Internal Linking
Author: Web &amp; SEO
Published: <strong>2 de septiembre, 2026</strong>
Last modified: 4 de septiembre, 2026

---

Search plugins

![](https://ps.w.org/web-seo-autolinker/assets/banner-772x250.png?rev=3677147)

![](https://ps.w.org/web-seo-autolinker/assets/icon-256x256.png?rev=3677147)

# Web & SEO Autolinker – AI Internal Linking

 By [Web & SEO](https://profiles.wordpress.org/webandseofr/)

[Download](https://downloads.wordpress.org/plugin/web-seo-autolinker.0.3.0.zip)

 * [Details](https://pe.wordpress.org/plugins/web-seo-autolinker/#description)
 * [Reviews](https://pe.wordpress.org/plugins/web-seo-autolinker/#reviews)
 *  [Installation](https://pe.wordpress.org/plugins/web-seo-autolinker/#installation)
 * [Development](https://pe.wordpress.org/plugins/web-seo-autolinker/#developers)

 [Support](https://wordpress.org/support/plugin/web-seo-autolinker/)

## Description

Autolinker builds internal links between the posts you already have. It reads
 each
post, finds the most semantically related pages on your site, and asks a language
model to choose an anchor phrase that already exists, word for word, in the source
text. The link is then written into the post content and kept in a registry so it
can be tracked, repaired, or removed later.

There is no keyword list to maintain. Relevance comes from meaning, not from
 matching
strings.

#### How it works

 1. **Embedding.** Each post is converted to a vector with an OpenAI embeddings
     model,
    stored locally, and refreshed only when the content changes.
 2. **Candidate search.** Cosine similarity ranks every possible target above a
     configurable
    threshold.
 3. **Filtering.** A first model pass drops candidates that are topically close but
    
    editorially wrong.
 4. **Anchor selection.** A second model pass proposes an anchor phrase. The plugin
    
    verifies the phrase appears verbatim in the source; if it does not, the link is
    rejected rather than forced.
 5. **Writing.** The link is inserted with a marker attribute so the plugin can find
    
    its own links again without guessing.

Every rejection is written to a journal with a reason, so an empty result is never

indistinguishable from a broken plugin.

#### IMPORTANT: this plugin relies on a third-party service

Autolinker does not work without an OpenAI API key that you supply. The plugin
 
sends data to the OpenAI API (api.openai.com), a third-party service that is not
affiliated with this plugin or with WordPress.org.

**What is sent:** the text content of the posts you choose to process, the titles

and excerpts of candidate link targets, and the prompts the plugin builds around
them. Your API key is stored encrypted in your WordPress database and is sent to
OpenAI to authenticate each request.

**When it is sent:** only when a post is processed, either automatically on publish
(
if you enable that) or when you trigger a scan. Your post content is never sent 
to OpenAI at any other time.

**What is not sent:** no data is sent to the plugin author, and no post content

leaves your site other than to OpenAI, as described above.

**One clarification about link health.** The plugin also checks whether the links
in
 your content still resolve. That check runs on a schedule and makes ordinary
HTTP requests to the URLs already present in your posts, and to their robots.txt,
which it honors. It sends none of your content and involves no third-party service:
it only visits the addresses you already link to. Those requests identify themselves
with a user agent naming the plugin and your site URL, so the hosts you link to 
can see that the request came from your site.

Using this plugin means your content is processed under OpenAI’s terms. Please read

them before installing:

 * OpenAI Terms of Use: https://openai.com/policies/terms-of-use
 * OpenAI Privacy Policy: https://openai.com/policies/privacy-policy
 * OpenAI API data usage policies: https://openai.com/policies/api-data-usage-policies

You pay OpenAI directly for the tokens the plugin consumes. See the FAQ for cost

control.

#### Features

 * Semantic candidate search with a configurable similarity threshold
 * Verbatim anchor validation, so anchors are never invented
 * A per-post link budget and anchor length bounds (default 2 to 6 words)
 * Silo mode, to keep links inside the same category
 * Per-post exclusions: exclude entirely, as a source only, or as a target only
 * Link health: periodic checking, broken link detection with a failure threshold,
   
   and an orphaned state when a link disappears from the content
 * Slug refresh: when a target’s permalink changes, the links pointing at it are
   
   rewritten
 * Elementor support, including posts stored in Elementor’s own data structure
 * A decision journal covering every link placed and every candidate rejected

#### Multilingual

Sites running WPML or Polylang are detected automatically and links are kept inside

a single language. A French post never links to its English translation.

Detection requires at least two configured languages. Translation layers that render

on the fly without duplicating posts (TranslatePress, Weglot, GTranslate) are treated
as monolingual, because only the original content exists in the database.

On a multilingual site the plugin switches to a larger embedding model for better

cross-language separation. Posts are re-embedded lazily, at their next scan, which
means a one-off token cost the first time each post is processed after you add a
second language.

## Screenshots

[⌊Every link the plugin has placed, with its source, its target, the anchor it used
and the similarity that justified it. One click revokes a link and removes it from
the content.⌉⌊Every link the plugin has placed, with its source, its target, the
anchor it used and the similarity that justified it. One click revokes a link and
removes it from the content.⌉[

Every link the plugin has placed, with its source, its target, the anchor it used
and the similarity that justified it. One click revokes a link and removes it from
the content.

[⌊The whole configuration on a single screen: similarity threshold, link budget 
per post, anchor length, which post types are sources and which are targets.⌉⌊The
whole configuration on a single screen: similarity threshold, link budget per post,
anchor length, which post types are sources and which are targets.⌉[

The whole configuration on a single screen: similarity threshold, link budget per
post, anchor length, which post types are sources and which are targets.

[⌊Link health. Broken internal and external links, duplicate destinations, anchor
cannibalisation, and registry entries whose target no longer exists.⌉⌊Link health.
Broken internal and external links, duplicate destinations, anchor cannibalisation,
and registry entries whose target no longer exists.⌉[

Link health. Broken internal and external links, duplicate destinations, anchor 
cannibalisation, and registry entries whose target no longer exists.

[⌊The journal. Every candidate that was considered and dropped, with the reason 
next to it.⌉⌊The journal. Every candidate that was considered and dropped, with 
the reason next to it.⌉[

The journal. Every candidate that was considered and dropped, with the reason next
to it.

[⌊One button scans the whole catalogue. Progress is shown as it goes.⌉⌊One button
scans the whole catalogue. Progress is shown as it goes.⌉[

One button scans the whole catalogue. Progress is shown as it goes.

[⌊The result in the published article: ordinary HTML links in the text, which survive
in exports and feeds and do not depend on the plugin still running.⌉⌊The result 
in the published article: ordinary HTML links in the text, which survive in exports
and feeds and do not depend on the plugin still running.⌉[

The result in the published article: ordinary HTML links in the text, which survive
in exports and feeds and do not depend on the plugin still running.

## Installation

 1. Install and activate the plugin.
 2. Go to Autolinker > Settings and paste your OpenAI API key. You can create one at
    https://platform.openai.com/. Review the OpenAI terms linked in the description
    before you do.
 3. Set your similarity threshold and per-post link budget, or keep the defaults.
 4. Either enable automatic processing on publish, or run a scan by hand from the plugin
    screen.

Processing runs through WP-Cron. On a site with little traffic, consider a real 
system cron calling wp-cron.php so scans do not stall.

## FAQ

### Do I need an OpenAI API key?

Yes. The plugin has no bundled key and no free tier of its own. You create a key
on
 your own OpenAI account and pay OpenAI for what you use.

### How much does it cost to run?

It depends on how many posts you process and how long they are. Two levers reduce

it: the per-post link budget caps how many placements are attempted, and embeddings
are cached, so a post that has not changed is never re-embedded.

### Does it modify my post content?

Yes. Links are written into the post content, with a marker attribute so the plugin

can identify its own links later. This is deliberate: the links are real HTML, they
survive in exports, in feeds, and for search engines, and they do not depend on 
a filter running at display time.

### What happens if I deactivate the plugin?

The links stay in your content, because they are ordinary HTML. Link tracking,
 
health checks and repair stop until you reactivate.

### Can I stop it from touching a specific post?

Yes. Each post has controls to exclude it entirely, to stop it being used as a link

source, or to stop it receiving links.

### Does it work with page builders?

Elementor is supported, including content stored in Elementor’s own data structure.

Within an Elementor page, text editor widgets are linked; other widgets are left
alone.

Builders that store their layout as shortcodes in the post content, such as Divi,

are linked inside their text, and their shortcodes are left untouched. Text that
a builder keeps in a shortcode attribute rather than in the body, such as a module
title, is never linked: writing there would break the module and the link would 
be invisible. The journal records those as an anchor found only in a shortcode.

Builders that keep their content outside the post content field entirely, such as

SeedProd, are not supported yet. Nothing is written on those pages, and nothing 
is damaged either.

### Does it conflict with Yoast SEO, Rank Math, All in One SEO or SEOPress?

No, and the reason is structural rather than a list of integrations: the plugin 
adds
 nothing to the front end. No meta tag, no canonical, no sitemap, no filter
on the content at display time. The links are written into your content as ordinary
HTML, so an SEO plugin counts them exactly like a link you typed yourself.

The plugin does read the noindex setting of those four: a page you have marked
 
noindex is never chosen as a link target. Nothing to configure.

Two limits are worth knowing. It reads the setting you put on the page itself, not

a site-wide rule that makes a whole post type noindex. And it reads the four plugins
above; another SEO plugin is not recognised. In both cases the page can still be
chosen as a target, and the per-post controls in the sidebar exclude it. Developers
can also filter aial_target_is_noindex.

### Does it work with caching plugins?

Yes. Nothing is computed at display time, so a cached page can never serve a version

without the links: they are already part of the stored content. Writing to the post
content goes through the normal WordPress update path, which is the signal WP Rocket,
W3 Total Cache, LiteSpeed Cache, WP Super Cache, WP Fastest Cache and SG Optimizer
already watch in order to clear a page by themselves.

On an Elementor page, and in ACF fields, the plugin writes to post meta instead 
of the
 post content, which does not fire the post update hooks. Since 0.2.1 it 
signals the change itself on those paths: it calls clean_post_cache(), which WP 
Super Cache and W3 Total Cache listen to, and it clears Cache Enabler and LiteSpeed
Cache through their own per-post API. Measured against those four.

Two are not covered. WP Fastest Cache exposes no per-post purge that another plugin

can reach. WP Rocket could not be tested here, so nothing is claimed about it. If
a new link on an Elementor or ACF page does not appear on either of those, purge
that page in your caching plugin, or hook the aial_post_content_changed action to
call your cache’s own purge.

### Why did it place no links on a post?

Open the journal. Every candidate that was considered and dropped is recorded with
a
 reason: below the similarity threshold, rejected by the filtering pass, or an
anchor that did not appear verbatim in the source. The last one is the most common,
and it is working as intended: the plugin will not invent an anchor that is not 
in your text.

### Does it send my content anywhere other than OpenAI?

No. The only external service is the OpenAI API, and only for the posts you process.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Web & SEO Autolinker – AI Internal Linking” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ Web & SEO ](https://profiles.wordpress.org/webandseofr/)

[Translate “Web & SEO Autolinker – AI Internal Linking” into your language.](https://translate.wordpress.org/projects/wp-plugins/web-seo-autolinker)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/web-seo-autolinker/),
check out the [SVN repository](https://plugins.svn.wordpress.org/web-seo-autolinker/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/web-seo-autolinker/)
by [RSS](https://plugins.trac.wordpress.org/log/web-seo-autolinker/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 0.3.0

 * A page you have marked noindex is no longer chosen as a link target. Sending 
   internal links to a page you have deliberately kept out of the index is the opposite
   of what you asked for, and nothing on screen told you it was happening. Works
   with Yoast SEO, Rank Math, All in One SEO and SEOPress, and there is nothing 
   to configure.
 * Links already written to such a page are left where they are. Removing them by
   itself would rewrite your content without being asked; the Links screen lets 
   you revoke any of them.
 * This reads the setting you put on the page itself, not a site-wide rule that 
   makes a whole post type noindex. That limit is written in the FAQ.
 * New filter for developers, aial_target_is_noindex: force a target out, keep one
   in, or restore the previous behaviour entirely.
 * No settings or database changes.

#### 0.2.1

 * The working language now follows your site language instead of always starting
   at French. A fresh install on an English site was sending French instructions
   to the model, at the same cost and with no guarantee on anchor quality. Sites
   that had already saved their settings keep the language they chose.
 * Links written into Elementor pages and ACF fields now clear the page cache. They
   were only showing up once the cache expired: the link was in the stored content,
   but it read like a broken plugin. Measured against WP Super Cache, W3 Total Cache,
   Cache Enabler and LiteSpeed Cache.
 * New action for anyone whose cache is not one of those four: aial_post_content_changed,
   fired with the post id whenever the plugin writes to post meta.
 * No settings or database changes.

#### 0.2.0

 * The admin interface is now in English. It was written in French, which read oddly
   next to an English listing and left the plugin untranslatable for everyone else.
 * French is not gone. It ships with the plugin as a translation, so a site running
   in French keeps the interface it already had. Nothing to install, nothing to 
   configure.
 * The plugin can now be translated into any language, either on translate.wordpress.
   org or with your own .po file.
 * The reason codes in the journal are in English too: anchor_inside_link rather
   than ancre_dans_un_lien. Entries written before this update keep their old code
   until they age out of the journal.
 * No settings or database changes.

#### 0.1.3

 * The admin screens now carry the plugin’s own name. They still said «AI Auto Linker»,
   the name the plugin had before it was published.
 * The journal now shows the reason next to each dropped candidate. It was recorded
   but only readable from the database, which made the answer in the FAQ half true.
 * Documentation: page builders, SEO plugins and caching plugins each have their
   own entry in the FAQ, limits included.
 * No settings or database changes.

#### 0.1.2

 * Fixed: on a page whose layout is stored as shortcodes in the post content, such
   as Divi, a link could be written inside a shortcode attribute instead of the 
   visible text. The module broke and the link was invisible.
 * Fixed: removing or repointing a link no longer rewrites a raw ampersand inside
   a shortcode attribute, and no longer lets a raw angle bracket there swallow the
   rest of the field.
 * Text that a builder keeps in a shortcode attribute, such as a module title, is
   now never linked. The journal records those as an anchor found only in a shortcode.
 * No settings or database changes.

#### 0.1.1

 * Performance: inbound link counts for several pages are now read in a single grouped
   query instead of one query per page.
 * Performance: those counts are cached in the object cache and cleared whenever
   the link registry is written to. Sites without a persistent object cache still
   get the grouped query, which is the larger of the two gains.
 * No settings, database or behaviour changes.

#### 0.1.0

 * Initial release.

## Meta

 *  Version **0.3.0**
 *  Last updated **46 minutos ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.2 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/web-seo-autolinker/)
 * Tags
 * [AI](https://pe.wordpress.org/plugins/tags/ai/)[internal linking](https://pe.wordpress.org/plugins/tags/internal-linking/)
   [links](https://pe.wordpress.org/plugins/tags/links/)[openai](https://pe.wordpress.org/plugins/tags/openai/)
   [seo](https://pe.wordpress.org/plugins/tags/seo/)
 *  [Advanced View](https://pe.wordpress.org/plugins/web-seo-autolinker/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/web-seo-autolinker/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/web-seo-autolinker/reviews/)

## Contributors

 *   [ Web & SEO ](https://profiles.wordpress.org/webandseofr/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/web-seo-autolinker/)