{"id":11936,"date":"2026-10-10T23:38:45","date_gmt":"2026-10-10T15:38:45","guid":{"rendered":"https:\/\/aeosub.com\/anchormender\/"},"modified":"2026-10-10T23:38:45","modified_gmt":"2026-10-10T15:38:45","slug":"anchormender","status":"publish","type":"post","link":"https:\/\/aeosub.com\/zh\/anchormender\/","title":{"rendered":"Anchormender \u2013 Internal Link Suggestions, Orphan Post Finder &amp; Bulk Internal Linking"},"content":{"rendered":"<div class=\"post-img\" style=\"margin-bottom: 25px\"><img decoding=\"async\" src=\"https:\/\/ps.w.org\/anchormender\/assets\/banner-1544x500.png?rev=3738259\" alt=\"Anchormender \u2013 Internal Link Suggestions, Orphan Post Finder &amp; Bulk Internal Linking\" loading=\"lazy\" style=\"width: 100%;height: auto;border-radius: 12px\"><\/div>\n<div class=\"plugin-expert-review\" style=\"border: 1px solid #e2e8f0;border-left: 4px solid #4a3bca;border-radius: 10px;padding: 20px;margin-bottom: 25px;background: #fff;font-family: -apple-system, system-ui, sans-serif\">\n<div style=\"font-weight: bold;font-size: 1.1em;color: #4a3bca;margin-bottom: 10px\">LethaldiranMX Insight<\/div>\n<div style=\"color: #4a5568;font-size: 14px;line-height: 1.6\">\n<div>\n<p>Anchormender addresses a critical operational bottleneck in content publishing by integrating context-aware internal linking directly into the WordPress editing workflow. By generating a local content index to surface precise sentence-level placement and editable anchor phrases while drafting, it removes the manual overhead typically associated with internal link audits. Its dual support for the Block Editor and Classic Editor\u2014along with the ability to trigger inbound links from existing published content\u2014provides immediate semantic SEO value. The plugin serves as a practical, developer-friendly solution for resolving orphan pages and reinforcing site architecture without forcing external workflow dependencies.<\/p>\n<p><strong>Best Fit &amp; Operational Role:<\/strong> Content-heavy WordPress sites, digital publishers, and SEO teams managing broad archives will benefit most from Anchormender. Positioned within the editing environment as a real-time workflow aid, it solves the recurring challenge of missed internal linking opportunities and isolated content. It streamlines operational workflows by bringing contextual link suggestions and orphan post remediation directly into the writing phase, reducing reliance on post-publish manual link sweeps.<\/p>\n<p><strong>Potential Limitations &amp; Pitfalls:<\/strong> Running local search indexing and automated suggestion refreshes based on draft word counts (~50 words in the Block Editor) introduces background processing that site operators should monitor on large database installs. Additionally, when utilizing the Classic Editor fallback logic, heavy manual editing of a paragraph after a suggestion is rendered can lead to anchor mismatch warnings or automatic placement fallbacks to the next suitable phrase. Outside of optional AI reranking, no operational or security risks were identified based on available information.<\/p>\n<\/div>\n<\/div><\/div>\n<div class=\"plugin-info-card\" style=\"border: 1px solid #e2e8f0;border-radius: 10px;overflow: hidden;margin-bottom: 30px;font-family: -apple-system, system-ui, sans-serif;background: #fff\">\n<div style=\"padding: 20px;border-bottom: 1px solid #edf2f7;background: #fafafa;display: flex;align-items: flex-start\">\n                <img decoding=\"async\" src=\"https:\/\/ps.w.org\/anchormender\/assets\/icon.svg?rev=3738259\" alt=\"Anchormender \u2013 Internal Link Suggestions, Orphan Post Finder &amp; Bulk Internal Linking icon\" loading=\"lazy\" style=\"width: 45px;height: 45px;border-radius: 8px;margin-right: 15px\"> <\/p>\n<div style=\"flex: 1;line-height: 1.2\">\n<div style=\"font-weight: bold;font-size: 1.1em;color: #1a202c\">Plugin Specification<\/div>\n<p>                    <small style=\"color: #718096\">WordPress.org Official Data<\/small>\n                <\/div>\n<\/p><\/div>\n<table style=\"width: 100%;border-collapse: collapse;font-size: 14px\">\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;width: 35%;color: #4a5568;background: #fcfcfc\">Developer<\/th>\n<td style=\"padding: 12px 20px;font-weight: 500\"><a href=\"https:\/\/profiles.wordpress.org\/emtiazzahid\/\" target=\"_blank\" rel=\"noopener\">Emtiaz Zahid<\/a><\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Version<\/th>\n<td style=\"padding: 12px 20px\">v1.0.0<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Active Installs<\/th>\n<td style=\"padding: 12px 20px\">0 +<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Requires \/ Tested<\/th>\n<td style=\"padding: 12px 20px\">6.6 \/ 7.1.3<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Last Updated<\/th>\n<td style=\"padding: 12px 20px\">2026-10-10 3:37pm GMT<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Official Link<\/th>\n<td style=\"padding: 12px 20px\"><a href=\"https:\/\/wordpress.org\/plugins\/anchormender\/\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: none;color: #4a3bca;font-weight: bold\">View Details -&gt;<\/a><\/td>\n<\/tr>\n<\/table><\/div>\n<div class=\"plugin-short-desc\" style=\"margin: 20px 0;padding: 12px 15px;background: #f9fafb;border-left: 4px solid #4a3bca;border-radius: 6px;font-style: italic;color: #4a5568\">Suggests internal links while you write, shows the sentence to link from, and fixes orphan pages in bulk. AI rerank is optional.<\/div>\n<p>Internal links are the cheapest SEO win there is, and the easiest one to forget. Anchormender builds a small search index of your own content and uses it to suggest links <strong>at the moment you are writing<\/strong>, in the sentence where they belong.<\/p>\n<h4>In the editor<\/h4>\n<ul>\n<li><strong>Block editor sidebar<\/strong>: lists related posts, each with the sentence in your draft that fits best and the proposed anchor phrase highlighted in it. <strong>Insert<\/strong> links the first occurrence of the anchor in the paragraph that holds that sentence, using the editor&#8217;s own link format, so it looks exactly like a link you added by hand. <strong>Change the anchor<\/strong> before inserting, or <strong>Skip<\/strong> a suggestion so it stops showing for this post.<\/li>\n<li><strong>Link from other posts on the same topic<\/strong> (block editor sidebar): find published posts on the same topic that could link <em>to<\/em> the one you are editing and add the link in one of them with &#8220;Add link in that post&#8221;, without leaving the editor. That other post is saved right away; a revision is saved when the post type supports revisions.<\/li>\n<li><strong>Classic editor meta box<\/strong>: lists related posts with the target title, a relevance score and an editable anchor, with <strong>Insert<\/strong> and <strong>Skip<\/strong> for each and a <strong>Refresh<\/strong> button. Insert links the anchor in the paragraph the suggestion was made for, in the text currently in the editor, following the same rules as bulk linking (see &#8220;Built to be light&#8221;). In classic HTML, when no paragraph matches (the suggestion came without a matching sentence, or you edited that paragraph since), it falls back to the first suitable occurrence of the anchor; if the anchor cannot be placed it says so and adds nothing.<\/li>\n<li>Insert in the sidebar or the meta box only changes the post in the editor. Nothing is saved until you save the post.<\/li>\n<li>Suggestions are based on the text currently in the editor, unsaved changes included. In the block editor they refresh automatically once the word count has changed by about 50 words (you can turn this off under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Suggestions) and whenever you click Refresh. The classic editor box loads suggestions when the screen opens and updates them when you click Refresh.<\/li>\n<\/ul>\n<h4>Site-wide<\/h4>\n<ul>\n<li><strong>Link report<\/strong>: inbound and outbound internal link counts for every post, with <strong>orphans<\/strong> and &#8220;fewer than 2 inbound&#8221; one click away, search, sort, CSV export.<\/li>\n<li><strong>Fix an orphan<\/strong> from the report: pick from suggested source posts and insert links straight into them.<\/li>\n<li><strong>Bulk linking<\/strong>: choose up to 50 posts per batch (orphans, posts with fewer than 2 inbound links or all indexed posts, each taken fewest inbound links first, or up to 50 specific post IDs), review every proposal with its sentence and anchor, then apply. Every changed post is saved right away; a revision is saved when the post type supports revisions. <strong>Undo<\/strong> removes the links a batch added in one click and keeps their text; if you removed one of those links or changed its text after the batch ran, Undo leaves that post alone and says so.<\/li>\n<li><strong>Link audit<\/strong> (weekly and on demand): links to posts that were unpublished, trashed or deleted after the link was indexed, generic anchors like &#8220;click here&#8221;, anchors that are over-used for one target, and links to noindex pages.<\/li>\n<\/ul>\n<h4>How relevance works<\/h4>\n<p>Titles, headings, taxonomy terms and the first part of the body are tokenised, stemmed and stop-word filtered per language, and stored as TF-IDF vectors in custom tables. Candidates are retrieved from a postings list, scored by cosine similarity with a bonus for shared title words and taxonomy terms, then matched to the best sentence by word overlap. It is fast, runs entirely on your server, and re-indexes a post in the background about a minute after you save it.<\/p>\n<h4>Optional AI rerank<\/h4>\n<p>Off by default. On WordPress 7.0 and later it uses the AI provider you connect under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Connectors, through WordPress&#8217;s built-in AI Client, so there is no separate key to manage. On any version you can instead bring your own key for OpenAI, Anthropic, Google Gemini or an OpenAI-compatible endpoint. When you ask for it in the block editor sidebar, the title, headings and up to the first 1,500 characters of text of the post you are editing, plus the titles and short excerpts of up to 20 candidate posts, go to the provider you chose, and a re-ranked list with suggested anchor phrases comes back. You see a token estimate first and none of your content is sent until you confirm. Details under External services.<\/p>\n<h4>Built to be light<\/h4>\n<ul>\n<li>Custom tables, no post meta bloat, indexing in Action Scheduler batches that stop once they have run for half of PHP&#8217;s <code>max_execution_time<\/code> (at least 5 and at most 20 seconds; 20 seconds when there is no limit) and then continue in smaller batches<\/li>\n<li>Never places links inside headings, existing links, code or buttons<\/li>\n<li>Bulk linking, &#8220;Add link in that post&#8221;, fixing an orphan from the report and Insert in the classic editor box only link a paragraph that has fewer links than &#8220;Max links per paragraph&#8221; (1 by default, so a paragraph that already has a link is left alone). Insert in the block editor sidebar links the paragraph of the suggestion you click and does not count the links already in it.<\/li>\n<li>Polylang and WPML aware: suggestions stay within the post&#8217;s language<\/li>\n<li>WP-CLI: <code>wp anchormender index rebuild|status|update<\/code>, <code>wp anchormender report [all|orphans|low]<\/code>, <code>wp anchormender suggest &lt;id&gt;<\/code><\/li>\n<\/ul>\n<h4>Hooks for developers<\/h4>\n<pre><code>anchormender_capability, `anchormender_excluded_post_types`, `anchormender_exclude_post`, `anchormender_index_text`, `anchormender_stopwords`, `anchormender_post_language`, `anchormender_candidates`, `anchormender_before_insert`, `anchormender_after_insert`, `anchormender_generic_anchors`, `anchormender_index_on_save`, `anchormender_batch_time_budget`, `anchormender_after_index`, `anchormender_is_builder_post`.\n<\/code><\/pre>\n<h3>External services<\/h3>\n<p>Anchormender&#8217;s link index, suggestions, link report, audit and bulk linking run entirely on your own server and never contact any outside service. The index stores stemmed keywords derived from the titles, headings, taxonomy terms and text of your published posts, plus the anchor text of the internal links between them, in custom database tables; it does not store the full post text. Nothing is indexed for drafts, private or password-protected posts. The tables are removed on uninstall unless you turn on &#8220;Keep data&#8221; in Settings.<\/p>\n<h4>Optional AI rerank<\/h4>\n<p>AI rerank is off by default. To use it you turn it on under Anchormender <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> AI assist and choose where requests go:<\/p>\n<ul>\n<li><strong>WordPress AI<\/strong> (WordPress 7.0 and later, the default there): the request goes through WordPress&#8217;s built-in AI Client to the AI provider you connected under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Connectors. WordPress chooses the provider and model and keeps the API key; Anchormender stores no key for it. The connectors WordPress offers are for the providers listed below, and the terms and privacy policy of the one you connected apply.<\/li>\n<li><strong>Your own key<\/strong>: you enter an API key for one of the providers below, and the request goes directly from your server to that provider.<\/li>\n<\/ul>\n<p>None of your content is sent until you click &#8220;AI rerank&#8221; in the block editor sidebar and then &#8220;Run&#8221; after seeing the token estimate. With WordPress AI, clicking &#8220;AI rerank&#8221; can make WordPress ask the connected provider which models it offers; that request carries the API key but none of your content. Each run sends one request containing:<\/p>\n<ul>\n<li>the title, headings and up to the first 1,500 characters of text of the post you are editing, including unsaved changes in the editor;<\/li>\n<li>the titles and short excerpts, up to 160 characters each, of up to 20 candidate posts from your site;<\/li>\n<li>the API key, in the request header (your own key, or the one WordPress holds for the connected provider).<\/li>\n<\/ul>\n<p>It does not send visitor data, user accounts or settings. Requests made with your own key do not include your site URL; requests made through WordPress AI use WordPress&#8217;s standard HTTP User-Agent, which includes your site&#8217;s address. The provider replies with a ranked list of candidate IDs and suggested anchor phrases. Anchormender does not store the reply; it only logs the token counts of each call locally so you can see usage in Settings. If you use your own key, it is stored encrypted in the WordPress options table and is never displayed again beyond its last four characters.<\/p>\n<p>Providers and their terms:<\/p>\n<ul>\n<li>OpenAI (api.openai.com) \u2013 Terms: https:\/\/openai.com\/policies\/terms-of-use \u2013 Privacy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<li>Anthropic (api.anthropic.com) \u2013 Terms: https:\/\/www.anthropic.com\/legal\/commercial-terms \u2013 Privacy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>Google Gemini (generativelanguage.googleapis.com) \u2013 Terms: https:\/\/ai.google.dev\/gemini-api\/terms \u2013 Privacy: https:\/\/policies.google.com\/privacy<\/li>\n<li>OpenAI-compatible endpoint \u2013 any server you enter as the Base URL, including one on your own network. The plugin does not restrict this address; the data above is sent to that server and its terms and privacy policy apply.<\/li>\n<\/ul>\n<p>Anchormender bundles Action Scheduler for background indexing; it makes requests only to your own site. The plugin registers a suggested paragraph under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Privacy <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Policy Guide.<\/p>\n<h3>Privacy<\/h3>\n<p>Anchormender keeps a search index of your published posts and pages in its own database tables. For each post it stores stemmed keywords derived from its title, headings, taxonomy terms and text, with their weights, plus the post&#8217;s language, word count and a checksum of its content; it does not store the full text. It also stores the internal links between posts with their anchor text, which links it added, the suggestions skipped for each post and who skipped them, bulk-linking jobs, and the token counts of AI rerank calls. For each job it records the user who started it and the links the job added (post, target URL and anchor text), which Undo removes again, and the ids of the revisions WordPress saved (a revision is saved when the post type supports revisions), so you can also restore one of those revisions by hand. Nothing about your visitors is stored and no cookies are set.<\/p>\n<p>Nothing leaves your site unless you turn on the optional AI rerank, with a provider connected under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Connectors or your own API key; what is sent is listed under External services. The bundled Action Scheduler only talks to your own site.<\/p>\n<p>Uninstalling removes the tables, options, scheduled jobs and the encrypted API key unless you enable &#8220;Keep data on uninstall&#8221;. The plugin suggests a paragraph for your privacy policy under Settings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Privacy <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Policy Guide.<\/p>\n<div class=\"plugin-editorial-note\" style=\"margin-top: 25px;padding: 12px 15px;background: #f8fafc;border-radius: 6px;color: #64748b;font-size: 13px;line-height: 1.5\">Editorial note: This overview combines WordPress.org official plugin metadata with an AI-assisted LethaldiranMX editorial review. Plugin data should be verified on the official WordPress.org listing before installation.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Suggests internal links while you write, shows the sentence to link from, and fixes orphan pages in bulk. AI rerank is optional.<\/p>","protected":false},"author":1,"featured_media":11937,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[252],"tags":[641,1049,1887,3132,554,555],"class_list":["post-11936","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-trends","tag-gutenberg","tag-internal-links","tag-link-building","tag-orphan-pages","tag-seo","tag-wordpress-plugin"],"_links":{"self":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/comments?post=11936"}],"version-history":[{"count":0,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11936\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media\/11937"}],"wp:attachment":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media?parent=11936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/categories?post=11936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/tags?post=11936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}