Every post you publish links backward. The new tutorial cites the guide from March, the March guide cites the explainer from 2022, and nothing ever links the other way, because nobody reopens an old post on publish day. Give an archive five years of this and the asymmetry compounds: your newest posts are densely connected, and because writers cite only what they still remember, the older half of the site drifts into orphanhood, posts that nothing on your own domain points to. WordPress out of the box offers exactly one fix, the editor, one post at a time. And the editing is not even the hard part. The hard part is the map: knowing which of your 600 posts should link to which, and from which sentence.
That map is the reason to pull the archive out from behind the admin screen. As files on a laptop, 600 posts give up the cross-reference in one grep: what each post covers, which other posts mention it. An AI agent that has read the whole corpus can then place each anchor with judgment about wording and position, and every inserted link can wait beside its original sentence for your approval. Measure the routes below against that bar: does anything read the sentence before putting a link in it, and does the anchor cross your desk on its way to the page.
Your options
By hand in the editor
Open an old post, read it, remember the newer post it should mention, find the sentence, write the anchor, save. This is the only route with perfect judgment, because it is all judgment, and the links it writes live in your post content permanently, with a revision saved at every step. For 12 posts it is a fine afternoon. The wall is not the editing, it is the cross-referencing: every link decision compares one post against every other post on the site, and at 600 posts nobody holds that matrix in their head. Hand-linking scales with your memory, and your memory filled up years ago.
Auto-linking plugins
Keyword rules at site scale: map a phrase to a URL and every occurrence becomes a link when the page renders, with caps on how many fire per post. As coverage, it works, and it is genuinely instant. What it lacks is judgment. A rule cannot tell the sentence that supports a link from the one that merely contains the string, and it repeats the same exact-match anchor everywhere, a risk so well known that plugins in this category ship settings to dilute it. Some never write the link into your content at all: anchors are injected at render time, so they vanish if the plugin does, and nothing that reads your stored post content, including the REST API's raw content, can see them.
SEO-suite link suggestions
If you run an SEO suite, link suggestions may already sit in your editor sidebar: targets ranked toward your cornerstone pages, sometimes a report with checkboxes for adding links in bulk. Real help, already installed. Two limits. First, suggest is the verb. Most of these features surface targets while you are editing a post, so retrofitting an old archive still means opening every old post. Second, relevance is computed at the post level, from keywords or word-frequency analysis of the whole text, not from reading the paragraph the link would land in, so suggestion quality drops exactly where the judgment matters. Usually a paid tier, and usually at its best in the block editor and in English.
An agent on the REST API
Wire an agent to the REST API, through an MCP server or a script, and you get real judgment across the whole archive, with links written into post content where they belong. The API even supplies the undo: every update saves a revision, for post types that support them. The cost is the keyhole. List endpoints cap at 100 posts per request, so a script reads a 1,000-post archive in 10 paginated calls, and an MCP server that fetches posts by ID reads it in 1,000. Writes are one post per request; the core batch route just staples up to 25 of those together, so a 1,000-post pass is still 1,000 individual updates, plus backoff whenever your host, CDN, or security plugin decides the burst looks like an attack. And every write lands live the moment it runs. Nobody shows you the anchor first.
Scratch
Your archive comes down once, as files on your laptop, and the agent keeps its judgment while losing the keyhole: one grep builds the topic and anchor map in seconds, and a small script confirms each target URL resolves before a link goes in. Nothing installs on your WordPress site, no plugin and no server to host; the connection runs over the REST API from a desktop app. Templates are excluded and post meta is hidden by default, so your theme and your SEO plugin's fields sit outside the blast radius. Every inserted anchor comes back as a word-level diff in its sentence, and only what you approve publishes. The cost is plainly stated: you read those diffs yourself, and a 600-post pass is an evening of reading.
| Option | Whole archive | Judgment per link | Links live in your content | Review before live | Undo after publish |
|---|---|---|---|---|---|
| By hand in the editor | Not past a few dozen | Yes, yours | Yes | You wrote it | Revisions, per post |
| Auto-linking plugin | Yes | No, keyword match | Sometimes render-time only | No | Turn the rule off |
| SEO-suite suggestions | Post by post | Suggests, you decide | Yes, once applied | In the editor | Revisions, per post |
| Agent on the REST API | Yes | Yes | Yes | Only if you build it | Revisions, post by post |
| Scratch | Yes | Yes, your agent | Yes | Every anchor, as a diff | Per post, in one click |
How the loop works on your archive
- Scratch pulls your archive into files. Posts, pages, and any custom post types land in a folder on your laptop, one file each, block markup preserved as raw content. 600 posts become 600 files the agent can search like any other folder. The live site has not heard about any of this yet.
- Your AI builds the link map and places the anchors. Point Claude, Codex, Cursor, or Copilot at the folder. One grep indexes what every post covers and which posts mention it, in less time than the API route spends fetching its first page. Then the agent works through the files with your brief. Give every orphan post at least 3 inbound links from posts that cover the same ground, vary the anchor text, place links only where the sentence already carries the idea, never link inside a heading, and check that every target URL resolves before you link it. For that last rule the agent writes a small script instead of trusting its eyes. It does 99% of the job and holds no credential to your site.
- You review every anchor and publish. Scratch shows each inserted link as a word-level diff inside its sentence, new anchor against original prose. Validators run first if you set them: a cap on links per post, no anchors over 8 words, no links in headings. Only the posts you approve go back over the REST API, and the run summary lists every anchor that shipped and the post it landed in. The last 1%, judging whether each link earns its sentence, stays with you. So does the way back: reject a published post and the original body returns.
Four minutes of watching beats another section of reading. Here is the same loop on a live WordPress site:
What people use it for
- Give every orphan post inbound links from the posts that actually discuss its topic, so years of archive stop depending on the sitemap alone.
- Point old posts at the newer guide that superseded them, instead of letting outdated advice carry the topic by itself.
- Wire a topic cluster properly: every supporting post links to the pillar page, and the pillar links back, with varied anchors.
- Spread anchor text so one target collects 12 different natural phrasings instead of 12 copies of the same keyword.
- Catch anchors pointing at redirects or deleted posts in the same pass, since the brief has every target checked before a link is written. The same loop fixes broken links across the whole site.
Questions people ask
Can I review every inserted link before it goes live?
Yes. Each anchor appears in Scratch as a word-level diff inside its sentence, next to the original prose. Nothing publishes until you approve it, and the agent holds no credential to your site, so it cannot publish around you.
Will the links survive if I change tools later?
Yes. The anchors are written into your post content as plain links, the same markup you would have typed in the editor. Render-time auto-linkers do not give you that; their links exist only while the plugin is active. Written-in links are also visible to everything else that reads your content: revisions, the REST API, your next migration.
Can the AI vary the anchor text?
It can. The brief should ask for it, because repeating one exact-match phrase across 60 posts is the auto-linker failure mode. The agent reads the sentence it is linking from, so each anchor can use the phrasing the prose already has. A validator can cap repeats per target if you want that rule enforced.
Will it link to URLs that 404 or redirect?
Not when the brief includes the check. The agent writes a small script that confirms every target resolves before a link is written, so a dead or redirected URL gets flagged in the run summary instead of linked into a post.
Will it touch my templates or my SEO plugin's fields?
No. Templates and template parts are excluded from edits, and post meta is hidden by default, so plugin-owned SEO fields are not edited by accident. The pass edits post content, and only in the posts you approve.
Can I undo the pass after it publishes?
Yes. Twice, in fact. In Scratch, reject any published post and the original body goes back, per post, in one click. Underneath that, WordPress saves a revision on every update anyway, for any post type with revisions enabled, so the site keeps its own history.
Will adding hundreds of links at once hurt my SEO?
It can. The risk is the spam pattern: one repeated anchor, placements no reader would follow, links stuffed where the prose does not support them. That is what the review step exists to catch. Ship in reviewed batches, ask for varied anchors and relevant placements in the brief, and reject the diffs that read like SEO instead of writing.
Does it work with Gutenberg block content?
Yes. Scratch pulls the raw content with the block markup intact, the agent edits inside it, and the structure is preserved on writeback. Page builders that keep prose in serialized plugin data are a different shape; pull a sample first and check where your text actually lives.
Do I need to be technical?
No. The brief is plain English, and the technical half of the job, the grep, the link map, the URL checks, belongs to the agent. Your half takes no skill beyond reading: does this anchor belong in this sentence, yes or no.
See it on your own archive
The orphan list makes the argument better than this page can. See it run on your WordPress archive →, or download Scratch free, pull your first 50 posts, and ask your agent which of them nothing links to. Scratch brings no model of its own; the agent is the one you already use.