{"id":377559,"date":"2026-09-30T05:15:48","date_gmt":"2026-09-30T05:15:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/internal-link-map\/"},"modified":"2026-09-30T05:23:56","modified_gmt":"2026-09-30T05:23:56","slug":"anchormap","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/anchormap\/","author":12569545,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1.2","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Anchormap \u2013 AI Internal Linking & Link Map","header_author":"Sanjay Shankar M","header_description":"Maps how your content links to itself and finds internal linking opportunities using WordPress's AI Client (or an endpoint of your choice). Graph view + opportunity table with one-click link insertion.","assets_banners_color":"b0d2e7","last_updated":"2026-09-30 05:23:56","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/buymeacoffee.com\/sanjayshankar","header_plugin_uri":"https:\/\/github.com\/sanjuacodez","header_author_uri":"https:\/\/sanjayshankar.me","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"Sanju Shankar","date":"2026-09-30 05:15:24","revision":3720351},"1.0.1":{"tag":"1.0.1","author":"Sanju Shankar","date":"2026-09-30 05:23:56","revision":3720360}},"upgrade_notice":{"1.0.1":"<p>Housekeeping release with no functional changes.<\/p>","1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3720351,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3720351,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3720351,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3720351,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3720360,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Anchormap demo: a small blog with a populated link map\",\"description\":\"Installs Anchormap, adds a dozen interlinked sample posts and runs a scan, then opens the Link Map.\",\"author\":\"sanju-shankar\",\"categories\":[\"SEO\"]},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=anchormap\",\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"features\":{\"networking\":false},\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"anchormap\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Brew Notes (Anchormap demo)\",\"permalink_structure\":\"\\\/%postname%\\\/\"}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\\/**\\n * Demo content for the WordPress Playground \\\"Live Preview\\\".\\n *\\n * Runs inside Playground (see bin\\\/build-blueprint): creates a small coffee\\n * blog where some posts already link to each other, a few are orphans, and\\n * many mention each other's topics without linking -- then runs a full\\n * Anchormap scan so the preview opens on a populated map and opportunity list.\\n *\\n * Not shipped with the plugin.\\n *\\\/\\n\\nrequire_once '\\\/wordpress\\\/wp-load.php';\\n\\n\\\/\\\/ Pretty permalinks with fresh rewrite rules, so the demo's links resolve to posts.\\nglobal $wp_rewrite;\\n$wp_rewrite->set_permalink_structure( '\\\/%postname%\\\/' );\\nflush_rewrite_rules( false );\\n\\n$posts = array(\\n\\t'pour-over' => array(\\n\\t\\t'The Complete Guide to Pour Over Coffee',\\n\\t\\t'<p>Pour over coffee rewards attention. You control every variable, from the coffee to water ratio to how fast you pour, and each one shows up in the cup.<\\\/p>\\n<p>Start with freshly roasted beans and a burr grinder. A medium-fine grind size is the usual starting point, but it depends on your dripper and your beans. If the cup tastes sour, grind finer; if it tastes bitter, grind coarser.<\\\/p>\\n<p>Water temperature matters more than most people think. Aim for water just off the boil, around 93 to 96 degrees Celsius. Too cool and you under-extract; too hot and you pull out harsh flavours.<\\\/p>\\n<p>Lighter coffee roast levels shine in a pour over because the method highlights acidity and origin character. If you prefer body over brightness, try a <a href=\\\"\\\/french-press-brewing-guide\\\/\\\">French press<\\\/a> instead.<\\\/p>\\n<p>Finally, keep your equipment clean. Mineral build-up changes flavour over time, so descaling your kettle and brewer every few months is worth the ten minutes.<\\\/p>',\\n\\t),\\n\\t'grind-size' => array(\\n\\t\\t'How to Choose the Right Coffee Grind Size',\\n\\t\\t'<p>Grind size controls how quickly water extracts flavour from coffee. Finer grounds extract faster; coarser grounds extract slower.<\\\/p>\\n<p>A French press needs a coarse grind so the metal filter can hold the grounds back. Pour over coffee needs medium-fine. Espresso needs very fine. Cold brew concentrate uses the coarsest setting of all because it steeps for many hours.<\\\/p>\\n<p>Consistency matters as much as the setting. A blade grinder produces a mix of dust and boulders, which extract unevenly. Choosing a burr grinder is the single biggest upgrade most home brewers can make.<\\\/p>\\n<p>Adjust one step at a time and taste. Change the grind before you change the coffee to water ratio, because grind has the bigger effect.<\\\/p>',\\n\\t),\\n\\t'french-press' => array(\\n\\t\\t'French Press Brewing: A Step-by-Step Guide',\\n\\t\\t'<p>The French press is the most forgiving brewer in the kitchen. It makes a heavy, full-bodied cup with almost no technique.<\\\/p>\\n<p>Use a coarse grind size, about the texture of sea salt. Add coffee, pour water at the right water temperature, stir once and wait four minutes.<\\\/p>\\n<p>Press slowly, then pour everything out immediately. Coffee left sitting on the grounds keeps extracting and turns bitter.<\\\/p>\\n<p>Darker coffee roast levels work well here, and a slightly stronger coffee to water ratio than you would use for a pour over keeps the cup rich.<\\\/p>',\\n\\t),\\n\\t'cold-brew' => array(\\n\\t\\t'How to Make Cold Brew Concentrate at Home',\\n\\t\\t'<p>Cold brew concentrate is coffee steeped in cold water for 12 to 18 hours, then diluted to taste. It is smooth, low in acidity and keeps in the fridge for a week.<\\\/p>\\n<p>Use a very coarse grind and a strong coffee to water ratio, around 1:5. Because there is no heat, the grind size and steeping time do all the work.<\\\/p>\\n<p>Medium and dark coffee roast levels give the classic chocolatey cold brew flavour. Single origin beans can taste thin when brewed cold.<\\\/p>',\\n\\t),\\n\\t'water-temperature' => array(\\n\\t\\t'Why Water Temperature Matters for Coffee',\\n\\t\\t'<p>Extraction is chemistry, and temperature speeds chemistry up. That is why water temperature changes the taste of your cup so much.<\\\/p>\\n<p>For hot brewing, 93 to 96 degrees Celsius is the sweet spot. Lighter coffee roast levels often need the top of that range; darker roasts taste better slightly cooler.<\\\/p>\\n<p>If you do not own a thermometer kettle, let boiling water rest for thirty seconds. And if your kettle is full of scale, descaling your coffee maker and kettle will help it heat evenly again.<\\\/p>',\\n\\t),\\n\\t'burr-grinder' => array(\\n\\t\\t'Choosing a Burr Grinder on a Budget',\\n\\t\\t'<p>A burr grinder crushes beans between two plates at a fixed distance, which is why it produces an even grind size. Blade grinders just chop at random.<\\\/p>\\n<p>You do not need to spend a fortune. A good hand grinder costs less than an electric one and grinds more consistently at the same price.<\\\/p>\\n<p>Look for stepped or stepless adjustment, easy cleaning, and enough range to go from a fine pour over coffee setting to a coarse French press setting.<\\\/p>',\\n\\t),\\n\\t'single-origin' => array(\\n\\t\\t'Single Origin vs Blend: Which Coffee Beans Should You Buy?',\\n\\t\\t'<p>Single origin coffee comes from one farm or region and tastes of that place. Blends mix origins for balance and consistency.<\\\/p>\\n<p>Single origin beans are at their best in a pour over, where clarity lets their character come through. Blends are the safer choice for milk drinks and cold brew concentrate.<\\\/p>\\n<p>Whichever you choose, how you store coffee beans matters as much as what you buy.<\\\/p>',\\n\\t),\\n\\t'store-beans' => array(\\n\\t\\t'How to Store Coffee Beans So They Stay Fresh',\\n\\t\\t'<p>Coffee starts losing flavour days after roasting. Oxygen, light, heat and moisture all speed that up.<\\\/p>\\n<p>Keep beans whole until you brew, in an opaque airtight container at room temperature. Grinding just before brewing is the easiest way to taste the difference a burr grinder makes.<\\\/p>\\n<p>Do not keep beans in the fridge: they absorb odours and moisture every time you open the door.<\\\/p>',\\n\\t),\\n\\t'roast-levels' => array(\\n\\t\\t'Understanding Coffee Roast Levels',\\n\\t\\t'<p>Light, medium and dark coffee roast levels are not just about colour. Roasting changes acidity, sweetness and body.<\\\/p>\\n<p>Light roasts keep origin character and suit pour over coffee. Dark roasts bring chocolate and smoke and suit the French press and cold brew concentrate.<\\\/p>\\n<p>Roast level also changes the best water temperature and grind size, so adjust your recipe when you switch beans.<\\\/p>',\\n\\t),\\n\\t'ratio' => array(\\n\\t\\t'The Coffee to Water Ratio Explained',\\n\\t\\t'<p>The coffee to water ratio is the amount of coffee you use for a given amount of water. A ratio of 1:16 is a good starting point for filter coffee.<\\\/p>\\n<p>Weigh both. Scoops are inconsistent because beans vary in size and density, especially across coffee roast levels.<\\\/p>\\n<p>Once your ratio is fixed, fine-tune with grind size. A stronger ratio suits the French press; a much stronger ratio is what makes cold brew concentrate.<\\\/p>',\\n\\t),\\n\\t'descaling' => array(\\n\\t\\t'Descaling Your Coffee Maker: A Simple Routine',\\n\\t\\t'<p>Hard water leaves mineral scale inside kettles and brewers. Scale slows heating, lowers water temperature and adds a flat, chalky taste.<\\\/p>\\n<p>Run a descaling solution or a citric acid mix through the machine every one to three months, then flush it with clean water twice.<\\\/p>',\\n\\t),\\n);\\n\\n$ids = array();\\nforeach ( $posts as $slug => $post ) {\\n\\t$ids[ $slug ] = wp_insert_post(\\n\\t\\tarray(\\n\\t\\t\\t'post_type'    => 'post',\\n\\t\\t\\t'post_status'  => 'publish',\\n\\t\\t\\t'post_name'    => 'french-press' === $slug ? 'french-press-brewing-guide' : $slug,\\n\\t\\t\\t'post_title'   => $post[0],\\n\\t\\t\\t'post_content' => $post[1],\\n\\t\\t)\\n\\t);\\n}\\n\\n\\\/\\\/ A few links that already exist, so the map has structure (and a couple of orphans).\\n$link = function ( $slug, $text ) use ( $ids ) {\\n\\treturn '<a href=\\\"' . esc_url( get_permalink( $ids[ $slug ] ) ) . '\\\">' . $text . '<\\\/a>';\\n};\\nwp_insert_post(\\n\\tarray(\\n\\t\\t'post_type'    => 'page',\\n\\t\\t'post_status'  => 'publish',\\n\\t\\t'post_title'   => 'Brewing Guides',\\n\\t\\t'post_content' => '<p>Start here. ' . $link( 'pour-over', 'The complete guide to pour over coffee' ) . ' covers the fundamentals, and ' . $link( 'french-press', 'our French press guide' ) . ' is the easiest place to begin. Once you are comfortable, try ' . $link( 'cold-brew', 'cold brew at home' ) . '.<\\\/p>',\\n\\t)\\n);\\nwp_update_post(\\n\\tarray(\\n\\t\\t'ID'           => $ids['grind-size'],\\n\\t\\t'post_content' => get_post_field( 'post_content', $ids['grind-size'] ) . '<p>Related: ' . $link( 'pour-over', 'pour over basics' ) . '.<\\\/p>',\\n\\t)\\n);\\nwp_update_post(\\n\\tarray(\\n\\t\\t'ID'           => $ids['roast-levels'],\\n\\t\\t'post_content' => get_post_field( 'post_content', $ids['roast-levels'] ) . '<p>Related: ' . $link( 'single-origin', 'single origin or blend?' ) . '.<\\\/p>',\\n\\t)\\n);\\n\\n\\\/\\\/ Tidy the default content so the map is only the demo blog.\\nwp_delete_post( 1, true );\\nwp_delete_post( 2, true );\\n\\n\\\/\\\/ Run a full scan, exactly as the \\\"Scan my site\\\" button does.\\n$queue = Anchormap_Indexer::queue();\\nAnchormap_Indexer::index_batch( $queue, true );\\nAnchormap_Indexer::build_idf( $queue );\\nAnchormap_Indexer::build_graph( $queue );\\nAnchormap_Analyzer::calibrate( $queue );\\nAnchormap_Analyzer::analyze_batch( $queue, $queue );\\n$graph = Anchormap_Store::graph();\\nAnchormap_Store::save_stats(\\n\\tarray(\\n\\t\\t'posts'       => count( $queue ),\\n\\t\\t'edges'       => count( (array) ( $graph['edges'] ?? array() ) ),\\n\\t\\t'suggestions' => (int) ( Anchormap_Store::status_counts()['new'] ?? 0 ),\\n\\t\\t'finished'    => current_time( 'mysql' ),\\n\\t)\\n);\\n\"}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.gif":{"filename":"screenshot-1.gif","revision":3720351,"resolution":"1","location":"assets","locale":"","width":1280,"height":720},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3720351,"resolution":"2","location":"assets","locale":"","width":2926,"height":2116},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3720351,"resolution":"3","location":"assets","locale":"","width":2612,"height":1540},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3720351,"resolution":"4","location":"assets","locale":"","width":2622,"height":1608},"screenshot-5.gif":{"filename":"screenshot-5.gif","revision":3720351,"resolution":"5","location":"assets","locale":"","width":1280,"height":720},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3720351,"resolution":"6","location":"assets","locale":"","width":2611,"height":1607},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3720351,"resolution":"7","location":"assets","locale":"","width":2598,"height":1608}},"screenshots":{"1":"The internal link map: every post and page as a node, every internal link as a line. Node size shows inbound links and a red ring marks an orphan page.","2":"Site-wide internal link stats at a glance: pages, internal links, orphan pages, broken links and link suggestions.","3":"Select any page to highlight what links to it and where it links out, with inbound, outbound and word counts.","4":"Internal link suggestions, ranked by score, with the anchor text highlighted in its sentence. Insert link, Ask AI or Dismiss in one click.","5":"One-click insertion: review a suggestion and add the internal link without opening the editor.","6":"The internal link audit table: sort by inbound or outbound links and filter to orphans, dead ends, broken links, links through old slugs or nofollow links.","7":"Settings: use the WordPress AI Client, your own OpenAI-compatible or Anthropic endpoint, or no AI at all."}},"plugin_section":[],"plugin_tags":[19933,6681,11851,252136,186],"plugin_category":[55],"plugin_contributors":[238683],"plugin_business_model":[],"class_list":["post-377559","plugin","type-plugin","status-publish","hentry","plugin_tags-internal-linking","plugin_tags-internal-links","plugin_tags-link-building","plugin_tags-orphan-pages","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-sanju-shankar","plugin_committers-sanju-shankar"],"banners":{"banner":"https:\/\/ps.w.org\/anchormap\/assets\/banner-772x250.png?rev=3720351","banner_2x":"https:\/\/ps.w.org\/anchormap\/assets\/banner-1544x500.png?rev=3720351","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/anchormap\/assets\/icon-128x128.png?rev=3720351","icon_2x":"https:\/\/ps.w.org\/anchormap\/assets\/icon-256x256.png?rev=3720351","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-1.gif?rev=3720351","caption":"The internal link map: every post and page as a node, every internal link as a line. Node size shows inbound links and a red ring marks an orphan page."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-2.png?rev=3720351","caption":"Site-wide internal link stats at a glance: pages, internal links, orphan pages, broken links and link suggestions."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-3.png?rev=3720351","caption":"Select any page to highlight what links to it and where it links out, with inbound, outbound and word counts."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-4.png?rev=3720351","caption":"Internal link suggestions, ranked by score, with the anchor text highlighted in its sentence. Insert link, Ask AI or Dismiss in one click."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-5.gif?rev=3720351","caption":"One-click insertion: review a suggestion and add the internal link without opening the editor."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-6.png?rev=3720351","caption":"The internal link audit table: sort by inbound or outbound links and filter to orphans, dead ends, broken links, links through old slugs or nofollow links."},{"src":"https:\/\/ps.w.org\/anchormap\/assets\/screenshot-7.png?rev=3720351","caption":"Settings: use the WordPress AI Client, your own OpenAI-compatible or Anthropic endpoint, or no AI at all."}],"raw_content":"<!--section=description-->\n<p>Anchormap is an internal linking plugin for WordPress. It shows you the internal links your site already has, finds orphan pages that nothing links to, and suggests the internal links you are missing, with the anchor text already highlighted in your own sentences. Review a suggestion, click <strong>Insert link<\/strong>, and you are done.<\/p>\n\n<p>Internal links are one of the few SEO levers you fully control. They help search engines crawl and understand your site structure, pass authority to the pages you want to rank, and keep readers moving to related content. But on a site with more than a few dozen posts, nobody remembers what links where. Anchormap does.<\/p>\n\n<p>\ud83d\udc49 <strong>Try it before you install:<\/strong> click <strong>Live Preview<\/strong> at the top of this page to open Anchormap on a demo blog in your browser.<\/p>\n\n<h4>What Anchormap does<\/h4>\n\n<ul>\n<li><strong>Visual internal link map:<\/strong> An interactive graph of every internal link on your site. Spot hub pages, isolated clusters and orphan pages at a glance.<\/li>\n<li><strong>Orphan page finder:<\/strong> Lists pages with no internal links pointing at them, the pages search engines struggle to discover.<\/li>\n<li><strong>Internal link suggestions:<\/strong> A ranked list of links you should add, showing the page to link from, the anchor text and the page to link to.<\/li>\n<li><strong>Smart anchor text:<\/strong> Anchors are real phrases that already exist in your content, chosen for how descriptive they are. Anchormap never writes new text into your posts.<\/li>\n<li><strong>One-click link insertion:<\/strong> <strong>Insert link<\/strong> adds the link in place and saves a post revision, so every change can be undone.<\/li>\n<li><strong>Internal link audit table:<\/strong> Sortable columns for inbound and outbound links, links to add, links wanted, broken links, nofollow links, links to drafts, links through old slugs that redirect, external links and word count.<\/li>\n<li><strong>Broken and redirected internal links:<\/strong> Find links pointing at deleted pages, drafts or old URLs that redirect.<\/li>\n<li><strong>AI relevance check:<\/strong> Press <strong>Ask AI<\/strong> on any suggestion and a language model judges whether the link helps the reader and picks the best wording.<\/li>\n<\/ul>\n\n<h4>Why it finds better internal links<\/h4>\n\n<p>A suggestion only appears when two things are both true:<\/p>\n\n<ol>\n<li><strong>The pages are about the same topic.<\/strong> With an embedding model this is true semantic matching, so related pages are found even when they share no keywords. Without one, Anchormap uses TF-IDF keyword similarity over your own content.<\/li>\n<li><strong>There is a natural place for the link.<\/strong> A phrase describing the destination must already sit in the source page's body text, somewhere a link is allowed, and never inside an existing link, a heading, a code block or a shortcode.<\/li>\n<\/ol>\n\n<p>Either signal alone produces noise. Requiring both turns \"these posts are related\" into \"put this link in this sentence\".<\/p>\n\n<h4>Works with or without AI<\/h4>\n\n<ul>\n<li><strong>No API key needed.<\/strong> Leave AI switched off and the link map, orphan detection, internal link suggestions, anchor matching and one-click insertion all work on keyword similarity. Nothing leaves your site.<\/li>\n<li><strong>Uses the WordPress AI Client.<\/strong> If your site already has an AI provider set up under Settings \u2192 AI, Anchormap uses it automatically. No extra key is needed.<\/li>\n<li><strong>Or bring your own endpoint.<\/strong> Sites without the AI Client can connect any OpenAI-compatible or Anthropic-format endpoint, including gateways and self-hosted models.<\/li>\n<\/ul>\n\n<h4>Internal linking tips that help your pages rank<\/h4>\n\n<p>Anchormap is built around these internal linking best practices. Use them as a checklist:<\/p>\n\n<ol>\n<li><strong>Fix orphan pages first.<\/strong> A page with no internal links pointing at it is hard for search engines to find and receives no internal authority. Filter the table to <em>Orphans<\/em> and give each one at least two or three relevant internal links.<\/li>\n<li><strong>Use descriptive anchor text.<\/strong> \"Choosing a burr grinder\" tells readers and search engines what the next page is about; \"click here\" does not. Anchormap rejects one-word anchors for this reason.<\/li>\n<li><strong>Vary your anchors.<\/strong> Linking to the same page with the exact same phrase everywhere looks unnatural. Use the different phrases that already occur in your writing.<\/li>\n<li><strong>Link from your strongest pages.<\/strong> Pages with the most inbound links carry the most authority. Sort the table by <em>Inbound<\/em> and add links from your top pages to the posts you want to rank.<\/li>\n<li><strong>Build topic clusters.<\/strong> Link a pillar page to every supporting article and each supporting article back to the pillar. The link map shows whether your clusters are really connected.<\/li>\n<li><strong>Link where it helps the reader.<\/strong> A contextual link inside a relevant sentence is worth more than a list of links in a footer. Only add links a reader would actually click.<\/li>\n<li><strong>Keep links in body content, and keep them healthy.<\/strong> Fix broken internal links, update links that go through redirects, and avoid nofollow on internal links, because nofollow passes no authority.<\/li>\n<li><strong>Re-scan after publishing.<\/strong> Every new post is a chance to link to older content and to link older posts to it. Re-scan, review the new suggestions, and your site structure improves with every article.<\/li>\n<\/ol>\n\n<h4>Who it is for<\/h4>\n\n<p>Bloggers, content marketers, SEO consultants, agencies and publishers who want a clearer site structure and better rankings without spending an afternoon on a manual internal link audit. Anchormap works alongside any SEO plugin and any theme, and supports posts, pages and public custom post types.<\/p>\n\n<h4>Privacy friendly<\/h4>\n\n<p>No tracking, no account and no external calls unless you configure an AI provider yourself. See <em>External services<\/em> below for exactly what is sent, and when.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin can send content to a third-party AI service, but <strong>only when you configure one<\/strong>. With no provider configured, no data leaves your site.<\/p>\n\n<p>What is sent, and when:<\/p>\n\n<ul>\n<li><strong>Indexing (embeddings).<\/strong> If you set an embedding model, the title and up to the first 6,000 characters of each published post in the post types you select are sent to the embeddings endpoint you configure, to compute a similarity vector. This happens when you press \"Scan my site\" (or \"Re-scan site\"), and only for posts whose content changed since the last scan.<\/li>\n<li><strong>Ask AI (chat).<\/strong> If you press the \"Ask AI\" button on a single row, that row's anchor text, the surrounding sentence from the source page, and up to 1,200 characters of the destination page are sent to the chat endpoint you configure, so the model can judge the link and suggest wording.<\/li>\n<\/ul>\n\n<p>Nothing else is transmitted, and nothing is sent on a schedule or in the background.<\/p>\n\n<p>Which service receives this data is entirely your choice: you supply the endpoint URL, the API key and the model name. If you route through WordPress's AI Client instead, the request goes to whichever provider you configured in WordPress. Because the destination is your own configuration, you should consult the terms and privacy policy of whichever provider you point it at. For the common providers:<\/p>\n\n<ul>\n<li>OpenAI terms: https:\/\/openai.com\/policies\/terms-of-use\/ , privacy: https:\/\/openai.com\/policies\/privacy-policy\/<\/li>\n<li>Anthropic terms: https:\/\/www.anthropic.com\/legal\/consumer-terms , privacy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>Google Gemini terms: https:\/\/ai.google.dev\/gemini-api\/terms , privacy: https:\/\/policies.google.com\/privacy<\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<p>Questions and bug reports: please use the support forum on this page.<\/p>\n\n<p>Built by Sanjay Shankar M (https:\/\/sanjayshankar.me). If Anchormap saved you an afternoon of manual link auditing, a review helps other site owners find it. You can also buy me a coffee: https:\/\/buymeacoffee.com\/sanjayshankar<\/p>\n\n<!--section=installation-->\n<ol>\n<li>In your WordPress dashboard go to <strong>Plugins \u2192 Add New<\/strong>, search for <strong>Anchormap<\/strong>, then click <strong>Install Now<\/strong> and <strong>Activate<\/strong>. (Or upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.)<\/li>\n<li>Go to <strong>Internal Links \u2192 Settings<\/strong> and choose which post types to analyse. Connecting an AI provider is optional.<\/li>\n<li>Go to <strong>Internal Links \u2192 Link Map<\/strong> and click <strong>Scan my site<\/strong>.<\/li>\n<li>Open <strong>Internal Links \u2192 Opportunities<\/strong> to review internal link suggestions and insert the ones you like.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20internal%20linking%20help%20seo%3F\"><h3>Does internal linking help SEO?<\/h3><\/dt>\n<dd><p>Yes. Internal links help search engines discover and crawl your pages, understand which pages are related, and decide which pages are most important. They also spread authority from strong pages to newer ones and keep visitors on your site longer. Anchormap makes finding and adding them fast.<\/p><\/dd>\n<dt id=\"what%20is%20an%20orphan%20page%3F\"><h3>What is an orphan page?<\/h3><\/dt>\n<dd><p>A page with no internal links pointing to it from the rest of your site. Search engines may crawl it rarely or not at all, and it receives no internal authority. Anchormap marks orphan pages with a red ring on the map and lets you filter the table to show only orphans.<\/p><\/dd>\n<dt id=\"how%20many%20internal%20links%20should%20a%20post%20have%3F\"><h3>How many internal links should a post have?<\/h3><\/dt>\n<dd><p>There is no fixed number. Add a link wherever it genuinely helps the reader: typically a handful in a normal-length article, more in long guides. The <em>Max suggestions per page<\/em> setting keeps Anchormap's suggestions focused.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20api%20key%3F\"><h3>Do I need an API key?<\/h3><\/dt>\n<dd><p>No. Without one, matching uses TF-IDF keyword similarity over your own content and everything still works. An embedding model makes the matching semantic rather than keyword-based.<\/p><\/dd>\n<dt id=\"will%20it%20edit%20my%20posts%20without%20asking%3F\"><h3>Will it edit my posts without asking?<\/h3><\/dt>\n<dd><p>No. Links are only written when you press \"Insert link\" on a specific row, one row at a time. Each insertion creates a post revision, so it can be undone from the editor.<\/p><\/dd>\n<dt id=\"can%20the%20ai%20put%20words%20into%20my%20content%20that%20i%20did%20not%20write%3F\"><h3>Can the AI put words into my content that I did not write?<\/h3><\/dt>\n<dd><p>No. When the model suggests different anchor text, it is used only if that exact string already exists in the source post. The plugin wraps existing text in a link; it never writes new text.<\/p><\/dd>\n<dt id=\"where%20will%20it%20not%20place%20a%20link%3F\"><h3>Where will it not place a link?<\/h3><\/dt>\n<dd><p>Inside an existing link, a heading, a code or preformatted block, a blockquote, a shortcode, or a block comment. Only body prose is considered.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20my%20seo%20plugin%2C%20theme%20and%20page%20builder%3F\"><h3>Does it work with my SEO plugin, theme and page builder?<\/h3><\/dt>\n<dd><p>Anchormap works alongside any SEO plugin and any theme; it only reads and edits post content. Content that lives in the normal post content (the block editor and the classic editor) is fully supported. Page builders that store text elsewhere, or blocks that keep their text in block attributes, leave little body text to link from, so those pages still appear on the map but may get fewer suggestions.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. Any public post type can be enabled in the settings.<\/p><\/dd>\n<dt id=\"is%20this%20ai%2C%20or%20just%20text%20matching%3F\"><h3>Is this AI, or just text matching?<\/h3><\/dt>\n<dd><p>Both, and it matters which half does what. Which pages are related is decided by AI (embeddings), or by keyword similarity when AI is off. Which words become the anchor is decided by a scoring heuristic, not AI. Whether a specific link is worth making is decided by AI only when you press \"Ask AI\" on that row.<\/p><\/dd>\n<dt id=\"how%20is%20the%20score%20calculated%3F\"><h3>How is the score calculated?<\/h3><\/dt>\n<dd><p>0.55 \u00d7 similarity + 0.45 \u00d7 anchor quality, plus a bonus when the destination has no inbound links. Similarity is the cosine similarity between the two pages, rescaled against your own site's distribution on every scan. Anchor quality combines phrase length, word rarity, overlap with the destination's title weighted by how distinctive the shared words are, and a check that the destination really is the page most about that phrase.<\/p><\/dd>\n<dt id=\"what%20does%20the%20%22ask%20ai%22%20button%20do%3F\"><h3>What does the \"Ask AI\" button do?<\/h3><\/dt>\n<dd><p>It sends one row to your chat model with the anchor, the sentence around it and a summary of the destination, and asks whether the link helps the reader. It adopts a different anchor only if that exact text already exists in your post, blends its confidence into the score rather than replacing it, and explains its reasoning under the anchor. It costs a fraction of a cent per press, and nothing until you press it.<\/p><\/dd>\n<dt id=\"why%20are%20anchors%20always%20two%20or%20more%20words%3F\"><h3>Why are anchors always two or more words?<\/h3><\/dt>\n<dd><p>Because one-word anchors like \"services\", \"analysis\" or \"reports\" match a related page but tell the reader nothing about where they are going. Single words are rejected unless the destination's whole title is one word. The <code>anchormap_min_anchor_words<\/code> filter overrides this.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20bold%2C%20italic%20or%20other%20html%20around%20the%20text%3F\"><h3>Does it work with bold, italic or other HTML around the text?<\/h3><\/dt>\n<dd><p>Yes, including when formatting splits the phrase: AI <strong>visibility<\/strong> tracking is matched and linked as a whole. A phrase is skipped only when wrapping it would split a tag pair and produce invalid HTML, or when it sits in a heading, an existing link or a code block.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. Anchormap only runs in the admin when you start a scan, in small batches. It adds nothing to your front end: no scripts, no styles and no markup for visitors.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Clearer plugin description.<\/li>\n<li>Removes an empty folder that was accidentally included in 1.0.0.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release: internal link map, orphan page finder, internal link audit table, ranked internal link suggestions with one-click insertion, and optional AI via the WordPress AI Client or your own endpoint.<\/li>\n<\/ul>","raw_excerpt":"AI internal linking for WordPress: visual link map, orphan page finder and one-click internal link suggestions with smart anchor text. No API key.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/377559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=377559"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sanju-shankar"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=377559"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=377559"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=377559"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=377559"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=377559"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=377559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}