Skip to content
WP Visibility

Internal links and site structure guide

Rewrite Weak Internal Link Anchors Without Stuffing Keywords

Find anchors that hide where a link goes, rewrite them inside their sentences so readers can predict the destination, and avoid forcing search phrases into every link.

Published

On this page

A good anchor lets a reader predict what they will get before they click. To test one, read the linked words on their own. If they could point anywhere (“click here”, “this post”, “read more”), or they promise something the destination does not deliver, rewrite them. Rewrite inside the sentence, using the plain name of what the page offers, and stop there. Anchors do not need to repeat a search phrase to work.

Google’s link guidance, checked September 27, 2026, suggests reading only the anchor text and checking that it is “specific enough to make sense by itself”, and warns against stuffing: “Ask yourself, does the reader need these keywords to understand the next page?” The accessibility standard says much the same. WCAG’s Link Purpose (In Context) criterion, checked the same day, asks that a link’s purpose be clear from its text alone, or from its text together with the sentence, paragraph, list item or table cell it sits in. It recommends link text that works without that extra context whenever possible, because assistive technology can present a page’s links as a list.

Find anchors that hide the destination

If you have run the crawl from the small-site link audit, you already have the anchor of every link it found in links.csv. This script lists vague anchors and anchors that point to more than one page:

import csv, collections
rows = list(csv.DictReader(open("links.csv", encoding="utf-8")))
vague = {"", "click here", "here", "read more", "more", "learn more", "this", "this page", "link"}
for r in rows:
    if r["anchor"].strip().lower() in vague:
        print(r["source"], "|", r["anchor"] or "(empty)", "->", r["final_url"])
targets = collections.defaultdict(set)
for r in rows:
    if r["anchor"].strip():
        targets[r["anchor"].strip().lower()].add(r["final_url"])
for anchor, urls in targets.items():
    if len(urls) > 1:
        print("same anchor, different pages:", anchor, sorted(urls))

Add the phrases your site uses to the vague set. An empty anchor usually means a linked image with no alt text, or an icon link with no text. The crawl does not read aria-label, so check an icon link’s markup before you rewrite it.

Three kinds of weak anchor are worth finding:

Kind Example Problem
Vague “click here”, “this article”, “more” Says nothing about the destination
Ambiguous “pricing” linking to two different pages The same words lead to different answers
Misleading “free soil test” linking to a paid lab service The destination breaks the anchor’s promise

Misleading anchors matter most, because they send a reader somewhere they did not choose. Vague anchors are the easiest to find and usually the quickest to fix.

Three kinds of weak anchor. Vague: Could point anywhere: click here, read more. Ambiguous: Same words lead to different pages. Misleading: The page breaks the anchor's promise.
Each kind has a different fix. Read the anchor alone to catch the first two; compare it with the page it opens to catch the third. The categories are editorial, not a scoring system.

Do not just replace the linked words. Read the whole sentence, decide what the destination offers, and let the sentence carry the context while the anchor names the thing. These illustrative passages come from garden.example, a fictional garden business. The words in brackets are the anchor.

1. Vague anchor

  • Before: “We wrote about pruning tomatoes. [Click here] to read it.”
  • After: “Pruning is easier once you know [which tomato shoots to remove].”
  • Why: The anchor now says what the page teaches, and the sentence gives the reason to read it.

2. Anchor on the wrong words

  • Before: “For best results, [see this guide] on raised bed materials.”
  • After: “For best results, read our comparison of [raised bed materials].”
  • Why: The link moves to the words that name the destination.

3. Stuffed anchor

  • Before: “Our [best raised garden beds for vegetables cheap raised beds guide] covers costs.”
  • After: “Our [raised bed cost comparison] covers wood, metal and stone.”
  • Why: The reader needs to know it is a cost comparison. Search variations add nothing for them.

4. Misleading anchor

  • Before: “Get a [free soil test] before you plant.”
  • After: “Test your soil before you plant, with a [home kit] or our [lab soil analysis].”
  • Why: Two destinations, two honest anchors. The paid service is named as a service.

5. Whole-sentence anchor

  • Before: “[If you want to know when to plant garlic in a cold climate, our planting calendar has the dates for each month.]”
  • After: “If you garden in a cold climate, our [planting calendar] has garlic dates for each month.”
  • Why: A long anchor is hard to scan and makes nearby links harder to tell apart. Link the name.

Keep the anchor short enough to scan and long enough to be specific. There is no correct word count.

Avoid stuffing and false promises

Google’s link guidance gives no ratio of exact-match, partial-match or branded anchors, so it sets no target to hit. The practical rules are simpler:

  • Use the name a reader would use for the page. If that happens to contain a search phrase, fine.
  • Vary anchors when the context varies. Two articles can link to the same guide with different words, as long as both describe it accurately.
  • Do not use identical anchors for different destinations on the same page.
  • Leave space between links. Google’s guidance suggests surrounding links with context rather than chaining several together.

Google’s guidance says it uses an image’s alt attribute as the anchor text when an image is linked. A linked product photo with alt="IMG_2041" is a weak anchor; alt="Cedar raised bed kit" is a useful one. For an image already in a post, edit the Alternative text in the image block settings. WordPress’s Image block documentation, checked September 27, 2026, says alt text added in the block settings applies only to the image in that post, while alt text set in the media library is the default used when you insert the image elsewhere. Changing it in the media library is therefore not a reliable fix for an image already placed in a post.

Theme templates often print “Read more” after each excerpt on archive and blog pages. That text lives in the theme or its template, not in your posts. In a block theme, open the template in Appearance, then Editor, and change the text of the Read More block or of the Excerpt block’s own Read More link, whichever the template uses, or link the post title instead (WordPress documentation checked September 27, 2026). In a classic theme, the change belongs in a child theme, so a theme update does not remove it. Buttons follow the same rule as links: “Book a site survey” describes the action; “Submit” or “Go” does not.

Review the edits before publishing

Anchor edits change meaning, so review them the way you would review any copy change:

  1. Read each edited sentence aloud. It should read naturally without the link.
  2. Click the link and confirm the destination matches the anchor’s promise.
  3. Read the page’s links on their own, top to bottom. Each should be distinguishable from the others.
  4. Run the crawl again (it overwrites links.csv), then the anchor script, and confirm the vague list is shorter.

If an assistant drafts the rewrites for you, treat its output as a draft and review each sentence in context before it is published. How to control an assistant’s SEO changes explains how to limit what an assistant can change and check its work.

Anchor checklist

  • Vague, ambiguous and misleading anchors listed from the crawl.
  • Each rewrite names what the destination offers, in its own sentence.
  • No anchor promises something the page does not deliver.
  • Linked images have descriptive alt text.
  • Theme “Read more” links handled in the template.
  • Links read on their own still make sense.

Read next

WordPress SEO with your own assistant.

WP Visibility is $99 a year for unlimited sites, client sites included, with a 30-day refund. Use its SEO tools in WordPress or connect a supported assistant. Read how proposal review and permissions work.