All fix guides
WarningAccessibility

Fix Links Without Descriptive Text (Empty Anchors)

Your audit flagged links with no accessible text, or text that doesn't describe where the link goes. This covers icon-only links, image links missing alt text, and generic "click here" or "read more" anchors. Screen readers announce these as unusable, and search engines and AI crawlers lose the context anchor text is meant to carry. The fix is to give every link a clear, human-readable destination label: visible text, alt text on a linked image, or an aria-label for icon links.

What this means

This warning covers two related problems the audit found on your links.

The first is an "empty link" (audit code empty_link): an <a> element that has an href but no text a screen reader can announce. This usually happens when a link wraps only an icon (an <i> font-icon or inline SVG with no label), wraps an image whose alt attribute is empty or missing, or contains only whitespace. To assistive technology the link exists but has no name, so it gets read out as just "link" or as the raw URL.

The second is "empty anchor text" (audit code empty_anchor_text): links that have text, but text that tells the user nothing about the destination. Common offenders are "click here," "read more," "learn more," "this," and bare URLs. The link has a label, but the label is not descriptive.

Both fail the same principle: a link's purpose should be clear from its text alone, without relying on the surrounding paragraph. This maps to WCAG 2.4.4 Link Purpose (In Context), a Level A requirement, and the stricter Level AAA 2.4.9 Link Purpose (Link Only).

Why it matters

For accessibility this is a real barrier. Screen reader users often navigate by pulling up a list of every link on a page (NVDA's Elements List, JAWS's Links List, both on Insert+F7). Out of context, a list full of "read more," "read more," "click here" is useless. An empty icon link has no name at all, so the user cannot tell a search button from a menu toggle. The issue sits at warning rather than error severity because it rarely blocks the page outright, but it degrades the experience for anyone using assistive tech.

For classic Google ranking, anchor text is one of the oldest and most durable relevance signals. Google uses the words inside a link to understand what the destination page is about, for both internal and external links. "Click here" passes no topical signal; "2026 technical SEO checklist" passes a strong one. Descriptive internal anchors also help Google distribute topical authority across your site and improve how deep pages get discovered.

For AI answer engines the effect is similar. ChatGPT, Perplexity, and Google's AI Overviews parse your HTML to map entity relationships and decide which pages to cite. Descriptive anchor text gives them clean, machine-readable context about what each linked resource contains. An icon-only or "here" link is a dead end for a model trying to understand your content, which weakens your chances of being cited as a source.

How to fix it

  1. 1

    Rewrite generic anchors to describe the destination

    Replace vague link text with words that describe the page it points to. Change "click here" to "download the audit checklist (PDF)" and "read more" to "read our guide to internal linking." The text should make sense read on its own and ideally include the target page's main topic, without keyword-stuffing. If several "read more" links sit in a card grid, give each one unique text tied to its article title.

  2. 2

    Give icon-only links an accessible name

    Links that contain only an icon (a social share button, hamburger menu, or search magnifier) need a name screen readers can read while staying visually hidden. The cleanest option is an aria-label on the anchor: <a href="/cart" aria-label="View shopping cart">. For inline SVG icons you can add a <title> element inside the SVG or use a visually-hidden span of text. Do not leave a link with only a decorative <i> tag and nothing else.

  3. 3

    Add alt text to image links

    When a link wraps an image and nothing else, the image's alt attribute becomes the link's accessible name. An empty or missing alt on a linked logo or banner makes the whole link empty. Set the alt to describe the destination, not the picture: a header logo linking home should read alt="Acme Corp home", not alt="logo". If the image is decorative but the link still needs a name, put the label on the anchor with aria-label and keep alt="".

  4. 4

    Fix bare URLs and empty or whitespace links

    Turn raw pasted URLs like https://example.com/pricing into readable text such as "Acme pricing plans." Then find links that contain only whitespace, a non-breaking space, or an empty tag, which often come from page builders or broken template loops. These render as clickable dead zones. Either give them real content or remove the empty <a> so it stops being flagged.

  5. 5

    Re-crawl and confirm the accessible name is set

    After edits, re-run the audit so empty_link and empty_anchor_text drop to zero. Spot-check in Chrome DevTools: open the Accessibility pane, select a link, and read its computed "Name." If that field is blank, the link is still empty. You can also tab through the page with a screen reader to confirm each link announces something meaningful.

Example

<!-- BEFORE: empty icon link (no accessible name) -->
<a href="/search"><i class="icon-search"></i></a>

<!-- AFTER: accessible name via aria-label, icon hidden from AT -->
<a href="/search" aria-label="Search">
  <i class="icon-search" aria-hidden="true"></i>
</a>

<!-- BEFORE: image link with no alt = empty link -->
<a href="/"><img src="/logo.svg" alt=""></a>

<!-- AFTER: alt describes the destination, not the picture -->
<a href="/"><img src="/logo.svg" alt="Acme home"></a>

<!-- BEFORE: generic anchor, no context for users or crawlers -->
<p>To see plans, <a href="/pricing">click here</a>.</p>

<!-- AFTER: descriptive anchor text -->
<p>See our <a href="/pricing">pricing plans and features</a>.</p>

<!-- Keep a visible "Read more" but set a specific accessible name -->
<a href="/blog/internal-linking"
   aria-label="Read more about internal linking strategy">Read more</a>

Before and after: empty icon link, empty image link, and a generic anchor, all fixed.

Platform-specific steps

WordPress (Gutenberg / Classic)

In the block or classic editor, select the link and edit its visible text, or highlight the descriptive words first and then apply the link. For "read more" buttons generated by your theme, the label often lives in the theme Customizer or a template; where possible switch it to the post title. RankMath and Yoast will not auto-fix anchor text, but Yoast's readability analysis and RankMath's content analysis flag generic link phrases so you can rewrite them.

Shopify

Product and collection links in Liquid templates often wrap only an image, so make sure the image tag carries a real alt (set it in the product media or via alt="{{ product.title }}" in the theme). For icon links in header.liquid or the cart (search, account, cart), add an aria-label to the <a> or a visually-hidden span. Edit these under Online Store > Themes > Edit code.

Wix / Squarespace

In the editor, click the link element and set its display text to something descriptive instead of the default. For icon and button elements, open the element's accessibility or ARIA settings and add a label; Squarespace exposes a button label field and Wix has an ARIA label field in element settings. For image links, open the image settings and fill in the alt text field.

Raw HTML / Next.js / React

Make each link's children descriptive text rather than "click here." For icon links, add aria-label to the anchor or Next.js <Link>, and mark the icon aria-hidden="true" so it is not double-announced. Avoid passing only an <Icon /> as children with no label. Example: <a href="/cart" aria-label="View shopping cart"><CartIcon aria-hidden="true" /></a>.

Free tool
Check this with the Heading Checker

Frequently asked

What counts as "descriptive" link text?

Text that tells the user where the link goes when read on its own, with no surrounding context. "View 2026 pricing" is descriptive; "click here," "more," "this page," and a bare URL are not. A quick test: if you pulled every link on the page into a flat list, would each one still make sense? If yes, your anchor text is descriptive enough.

Is "read more" always wrong?

It is not forbidden, but it is weak and it will keep getting flagged when repeated. If you must keep a visible "Read more" for design reasons, set a descriptive accessible name with aria-label, for example <a href="/post" aria-label="Read more about technical SEO audits">Read more</a>. That keeps the clean UI while giving screen readers and crawlers real context.

How do I fix an icon link without adding visible text?

Use aria-label on the anchor, like <a href="/search" aria-label="Search">, or add a visually-hidden span of text inside the link (styled with the standard sr-only clip pattern so it is read but not seen). Both give assistive tech a name while keeping the icon-only look. Avoid relying on the title attribute alone, since screen reader support for it is inconsistent.

Does non-descriptive anchor text actually hurt SEO?

Yes, indirectly but meaningfully. Anchor text is a long-standing signal Google uses to understand what a linked page is about, so "click here" wastes a chance to pass topical relevance, especially on internal links. It will not trigger a penalty, but descriptive anchors help Google and AI crawlers understand your site structure and can improve how well linked pages rank and get cited.

An image is my only link content. Where does the link text come from?

From the image's alt attribute. When an <a> wraps only an <img>, the browser and assistive tech use that alt as the link's accessible name. So a linked logo or thumbnail with alt="" or no alt is treated as an empty link. Write an alt that describes the destination (for example alt="Homepage") rather than the image's appearance.

Does your site have this issue?

Run a free, AI-powered audit and we’ll flag this and 150+ other checks in about a minute. No signup.

No signup needed. Results in under 60 seconds.

Related fixes