Sitemaps tell Google a URL exists. Internal links tell Google (and humans) that you still stand behind it. On small WordPress sites — under a few hundred URLs — that endorsement gap is where indexation stalls more often than "missing XML."
This is not another sitemap rewrite. It is the link graph side: hub pages, orphan recovery, nav/footer bloat, and in-content anchors that help without looking like spam.
Why small sites still get this wrong
Enterprise playbooks push automated "link every post to every related post" plugins. Small sites copy that energy and end up with:
- A mega-footer that lists every service, city, and blog post
- A primary menu with 18 items and three dropdowns of thin pages
- Blog posts that never mention older, stronger URLs
- Money pages that only appear in the sitemap
Google can discover an orphan from XML and still leave it under Discovered - currently not indexed because nothing on your site vouches for it. Discovery ≠ endorsement.
Hub pages: one topic, many spokes
A hub is a page that exists to organize and link a cluster: a category landing, a "guides" index, a service overview that points to subpages, or a pillar post that summarizes and links out.
Good hubs on small WordPress sites:
- One clear intent (e.g. "WordPress technical SEO notes," not "everything we ever wrote")
- 5–15 contextual links to spoke pages that earn a click
- Short intro + scannable sections; not a dumping ground for every tag
- Updated when you publish a new spoke (add the link; do not only bump
lastmodon the hub)
Weak hubs: auto-generated tag archives with two posts, "Resources" pages that are just a bullet list of affiliate URLs, or category pages with no intro and zero internal context beyond the loop.
WordPress category archives can be hubs if you add a custom intro (Rank Math / Yoast category description, or a page that is the hub and links into the category). Prefer a real page you control when the default archive is thin.
Orphan recovery (without a six-figure crawler)
An orphan is a published, indexable URL with no internal links from other indexable pages (nav, footer, in-content, related modules — none).
Find them cheaply:
- Export URLs you care about (sitemap children, or WP export of posts/pages).
- Crawl the site with Screaming Frog free tier (or crawl menus + last 30 posts manually on a tiny site).
- Diff: in sitemap / published, zero inlinks from the crawl → orphan candidates.
- Drop thank-you, cart, account, and intentionally unlinked legal pages from the panic list.
Fix pattern (pick one per orphan):
| Situation | Action |
|---|---|
| Strong page, just forgotten | Add 1–3 contextual links from related hubs/posts |
| Thin / near-duplicate | Merge into a stronger URL; 301 the weak one; update links |
| Outdated, no traffic, no links | Unpublish or noindex; remove from sitemap |
| Money page | Link from home, hub, and 2–3 relevant posts — not only the footer |
Do not "fix" orphans by dumping them all into the footer. That creates a different problem.
Footer and nav bloat
Sitewide links pass discovery, but they dilute relevance when every URL is "important."
Symptoms I see on audits:
- Footer columns with 40+ links, half to city landing pages nobody updates
- Primary nav that includes Blog, every service, every location, Contact, and three CTAs
- "Useful links" widgets repeating the same URLs already in the menu
Practical caps for small sites:
- Primary nav: roughly 5–7 top-level items. Deeper pages live in hubs and in-content links.
- Footer: contact, legal, 1 hub, a few evergreen money URLs — not the whole sitemap.
- If a page only exists in the footer, ask whether it deserves a contextual mention somewhere above the fold on a relevant page.
Bloat also hurts humans. If visitors cannot find the three pages that make you money, the crawl path is probably messy too.
In-content anchors that help (without spam)
The highest-signal internal links are in the body, next to a reason to click.
Do:
- Link when you mention a topic you already covered ("I walked through canonical tags separately")
- Use descriptive anchors: "redirect audit checklist," not "click here" or exact-match stuffed phrases
- Prefer one strong link to the best URL over five links to near-duplicates
- Point to the final canonical URL (HTTPS, correct host, no leftover redirect hop)
Don't:
- Auto-link the first mention of every keyword sitewide
- Insert a "related posts" block that is pure title stuffing with no context
- Link the same money URL ten times in one article
- Point campaign or UTM variants from your own content — keep those for ads/email; on-site HTML should use clean URLs (a URL shortener is fine for external shares, not as your internal path)
Related-posts plugins are fine as a backstop. They are not a substitute for two thoughtful links in the paragraphs that readers actually finish.
A simple linking model for `50–150 URL sites
- Home → top hubs + 2–3 money pages
- Each hub → its spokes
- Each new post → at least one older relevant URL + its hub
- Money pages → appear in nav or hub and get occasional in-content mentions
- Legal / utility → footer only is OK
When you publish, spend two minutes on links before you spend twenty on social snippets. The graph compounds; the tweet does not.
WordPress gotchas
- Menus vs widgets vs block theme patterns. Links live in several places; updating one menu does not fix an old footer pattern or a reusable block.
- "Related posts" + tag clouds. Tag clouds are often thin-doorway magnets. Prefer curated hubs.
- Pagination and "next post." Useful for readers; weak as the only path to older money content.
- Hardcoded theme footers. Child theme or a footer block you can edit without a deploy every time.
-
Canonical mismatch. If you link
/page/but the canonical is/page, fix the links — do not hope the SEO plugin papers over a messy graph. Pair with solid self-canonicals when duplicates remain: how to fix duplicate content with canonical tags.
30-minute weekly habit
- Open the last 3 published URLs.
- Confirm each links to a hub and at least one related older URL.
- Confirm each money page gained or kept a contextual inlink this month.
- Skim footer/nav — remove anything that has not earned a click in ages.
- Spot-check 5 "Discovered - not indexed" URLs in GSC: orphan? thin? wrong canonical?
That habit beats a once-a-year "internal linking project" that never ships.
Closing
On small WordPress sites, internal links are not a ranking trick. They are how you tell crawlers and clients which pages still matter. Build a few honest hubs, recover real orphans with contextual links, keep nav/footer boring, and write in-content anchors like a human recommending the next useful page.
More practical notes live on the blog.
— Riichi Mirza
Top comments (0)