설명
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 (capitalisation aside). 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
- Embedding. Each post is converted to a vector with an OpenAI embeddings
model, stored locally, and refreshed only when the content changes. - Candidate search. Cosine similarity ranks every possible target above a
configurable threshold. - Filtering. A first model pass drops candidates that are topically close but
editorially wrong. - Anchor selection. A second model pass proposes an anchor phrase. The plugin
verifies the phrase appears in the source exactly, capitalisation aside; the
linked text keeps the capitalisation of your post. If the phrase is not there,
the link is rejected rather than forced. - 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 text of
your link targets (up to 8,000 characters each, to compute the embeddings
that match them), 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: in these four cases, and no others:
- When you publish a post or update a published one. This processing on publish
is on by default; you can switch it off in Settings (“Full auto on publish”). - When you trigger a scan yourself.
- When you add a post type to the link targets in Settings: its published content
is queued for embedding. - After a plugin update that changes the plugin’s database, or when the embedding
model changes (the plugin uses a larger model on multilingual sites): your link
targets are queued for embedding again.
The last two cases run in the background through WP-Cron, even with “Full auto on
publish” switched off. They only send content that has no embedding yet, or whose
text or embedding model has changed since its embedding was computed.
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
- Anchor validation against the source text (word for word, capitalisation
aside), 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 Autolinker placed to
it are rewritten. Links you added by hand are never rewritten automatically;
those that point to an old post slug are listed on the Link health screen, with
an “Update href” button for each one - 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 active languages, with WPML as with Polylang: a
site with a single language is treated as monolingual. 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. When the site changes mode (a second language added, or
removed), every post is queued once to be embedded again with the new model, which
means a one-off token cost for the whole catalogue.
스크린샷






설치
- Install and activate the plugin.
- 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.
- Set your similarity threshold and per-post link budget, or keep the defaults.
- 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. -
What happens if I uninstall the plugin?
-
By default, everything is kept. Tick “Delete data on uninstall” in Settings and
uninstalling removes everything the plugin created, except the links already written
into your posts and their revisions. To take links out, revoke them before you
uninstall: once its data is deleted, the plugin can no longer find them. On a
multisite network, each site where the box is ticked is cleaned up, and sites where
it is not ticked keep their data. With a persistent object cache (Redis, Memcached),
the robots.txt rules cached by the link checker are not deleted: they expire on their
own within 24 hours. -
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.SeedProd is supported on landing pages and on pages edited with SeedProd. Text
blocks are linked in both places SeedProd keeps them, so the link shows at once and
survives the next save in the SeedProd builder. Other blocks, such as headlines and
buttons, are left alone. Tested with SeedProd Lite. Pages built with the SeedProd Pro
theme builder use the same storage but were not tested. -
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.
후기
이 플러그인에 대한 평가가 없습니다.
기여자 & 개발자
“Web & SEO Autolinker – AI Internal Linking”(은)는 오픈 소스 소프트웨어입니다. 다음의 사람들이 이 플러그인에 기여하였습니다.
기여자변경이력
0.4.2
- On a multisite network, “Delete data on uninstall” now cleans up every site where the box is ticked. Until now only the main site was cleaned up, and only if its own box was ticked; the other sites kept their tables, settings and OpenAI key.
- No settings or database changes.
0.4.1
- An anchor is no longer linked in the middle of a word. Until now the plugin linked the first place where the anchor appeared, so “art guide” could be linked inside “smart guide”. It now skips any match glued to a letter or a digit and uses the next one that stands as whole words; when there is none, no link is placed and the journal records anchor_inside_word. Chinese, Japanese, Korean, Thai, Lao, Khmer and Burmese text, which does not separate words with spaces, is not affected.
- The readme now lists every case in which content is sent to OpenAI: publishing or updating a post, a scan, adding a post type to the link targets, and the background re-embedding after some updates or a change of embedding model. It also says that the text of link targets is sent.
- The readme now says that anchors are matched with capitalisation aside, and that slug refresh rewrites only the links Autolinker placed; links you added by hand to an old post slug are listed on the Link health screen.
- No settings or database changes.
0.4.0
- SeedProd support. Text blocks on SeedProd landing pages, and on pages edited with SeedProd, are now linked. Until now the plugin wrote into the copy of the page that SeedProd rebuilds on every save, so a link vanished the next time the page was saved in the builder, and headlines and buttons could be linked too. Links now go into both copies SeedProd keeps, and only into text blocks.
- Adding, removing or rewriting a link no longer strips the backslashes from your post. Until now every backslash in the content or excerpt was dropped when the plugin saved the post, silently, so a Windows path like C:Usersdemo came back as C:Usersdemo, and code samples, regular expressions and LaTeX were damaged. The same applied to ACF fields the plugin links. Backslashes are now kept.
- “Delete data on uninstall” now removes everything the plugin created, except the links already written into your posts. Until now it left behind one setting (the embedding model in use), the per-post boxes you ticked (exclusions and Force silo), its three scheduled tasks and the robots.txt rules cached by the link checker. With the box unticked, uninstalling still keeps everything.
0.3.3
- WPML now follows the same rule as Polylang: the multilingual mode starts at two active languages. A WPML site with a single language was treated as multilingual and used the larger embedding model for no benefit. It now uses the standard model, and each post is embedded again once with it, a one-off cost.
- When the site changes mode (a second language added or removed), every post is now queued once to be embedded again with the new model. Before, posts switched one by one at their next scan, and in the meantime a newly processed post could find no candidates at all.
- The readme now says plainly that processing on publish is on by default, and how to switch it off.
- For developers: AIAL_Link_Registry::targets_without_inbound() and AIAL_Link_Registry::first_inbound_between() now count the links you wrote yourself in your content, as recorded by the link inventory. A page that only receives manual links is no longer reported as receiving none.
- No settings or database changes.
0.3.2
- Silo mode now does what the setting says. Until this version the choice was saved but never applied, so a site set to Strict could still receive links between categories.
- Strict: a post only links to posts that share at least one category with it. Each post where the silo set candidates aside gets one line in the journal, with how many were set aside.
- Soft: posts from the same category are offered first and placed first, so they use the link budget before the others. Posts from other categories can still get a link.
- The “Force silo” box on a post applies Strict to that post, whatever the site setting.
- A post with no category is not affected by either mode. Only standard post categories are read; tags and custom taxonomies are not.
- No settings or database changes.
0.3.1
- The anchor-choice step now calls GPT-6 Sol instead of GPT-5.6 Terra. Sol is priced lower per token than Terra ($2 and $10 per million input and output tokens, against $2.50 and $15). The filtering step (GPT-5.6 Luna), the nano fallback and the embeddings are unchanged.
- For developers: AIAL_Linker::build_terra_input(), AIAL_Linker::terra_schema() and the TERRA constants still work and now point to Sol. They are deprecated; use the sol names.
- No settings or database changes.
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.
