Open any WordPress site that has been publishing for a few years and you will find posts that no other post links to. Nobody decided to strand them. They were written, published, shared once, and then the archive grew over them — a new post on the home page every week, each one pushing the older ones a little further down the pile.
Those posts are orphan pages, and they are one of the few SEO problems where the fix is almost entirely within your control: you do not need new content, new backlinks or a new theme. You need a list, and then a sentence or two in the right older posts. This guide covers how to get the list, four different ways, and what to do with it.
What counts as an orphan page
The strict definition, the one most SEO tools use, is simple: an orphan page is a page on your site that no other page on your site links to. A search engine crawling your site by following links would never reach it. The only ways anyone arrives are through your XML sitemap, an old social post, a newsletter, a link from another site, or somebody typing the address.
On a WordPress blog that definition is too generous, because almost no post is a strict orphan. Your theme lists every post on a category archive, a tag archive, an author archive and a date archive, and each of those paginates back to the very first post you ever wrote. So technically everything is linked — through page 12 of a category nobody has clicked since 2021.
The definition that is useful for decisions is narrower: a post is effectively orphaned when no other post links to it from inside its writing. Links from menus, sidebars, footers and archives still exist, and they still let a crawler find the address. But they carry no description of what the post is about, they sit on every page equally, and nobody reading an article on sourdough starters clicks through to page 12 of the “Bread” category. The link that actually brings readers and context is the one inside a sentence, in a related post.
It helps to keep three categories apart, because each needs a slightly different check:
- True orphans — no internal links at all, from anywhere. Found by comparing your sitemap with a crawl. Usually a small list: forgotten landing pages, posts removed from a menu, pages from a theme or plugin you no longer use.
- Archive-only posts — reachable only through category, tag, date or author archives, or through “older posts” pagination. On most blogs this is the big list, often a third or more of the archive.
- Weakly linked posts — one inbound link from a single unrelated post, or links that go through a redirect. Not orphans, but worth a look once the first two lists are done.
Why orphans cost you readers
Internal links do three jobs, and an orphan gets none of them.
Discovery. Search engines find pages mainly by following links. A sitemap tells them an address exists, but a page that is only ever seen in the sitemap is a page your own site never vouches for. Google has said for years that it uses internal links to understand which pages you consider important; an address with no links pointing at it is a quiet statement that it is not.
Context. The words of a link — the anchor text — and the sentence around it tell a search engine what the destination is about, in your own voice. A post on “repotting a root-bound fiddle-leaf fig” that is linked from four other plant-care posts, each with a phrase like “repot it into a pot one size up”, is described four times before anyone reads its title. An orphan is described by nothing except itself.
Readers. This is the one people forget. A reader who finishes one post and finds a relevant link in the middle of it is the cheapest visit your site will ever get: they are already there, already interested, already reading. Every orphan is a post that could be the second page view of a visit and is not. On many blogs the best evergreen posts from the first two years of publishing are exactly these — written when the site had no other posts to link from, and never revisited once it did.
How WordPress sites end up with them
Understanding where orphans come from tells you where to look first, and how to stop making new ones. On WordPress, almost all of them come from six places.
- Reverse-chronological archives. The home page and every category show the newest posts first. With ten posts per page, the 300th post on the site is 30 pages of “older posts” from the home page. Nothing else about the post changed; it just aged.
- Posts written before their neighbours existed. Your first post about budgeting apps could not link to your later posts on sinking funds or zero-based budgets, because they did not exist yet. And when those later posts went up, nobody went back to add the link the other way.
- Deleted or rewritten linking posts. A round-up that linked to twelve posts gets merged into a new guide that links to five. Seven posts lose their only inbound link and nobody notices, because nothing breaks.
- Menus and widgets that change. A post that was once in the main menu or a “start here” widget loses its place in a redesign. It looked well linked for years because every page linked to it — from the sidebar.
- Related-posts plugins that did the linking for you. Many related-posts blocks pick a different set of posts over time, some load with JavaScript after the page renders, and some are removed when a theme changes. If those were the only links to a post, the post was always one setting away from being orphaned.
- Landing pages and one-offs. Pages built for an ad campaign, a giveaway, a lead magnet, or a podcast guest spot, deliberately kept out of navigation. Some of these should stay orphans; most should at least be noindexed once the campaign ends.
Four ways to find them
There are four practical ways to get the list, and they answer slightly different questions. The first finds true orphans. The second and third show how many in-content links each post receives. The fourth is a free script that gives you the in-content orphan list directly from your database. Most sites will want to combine one of the first two with the fourth.
| Method | Finds | Cost | Good for |
|---|---|---|---|
| Sitemap vs crawl | True orphans | Paid crawler licence; free by hand under 500 URLs | Any site; the classic technical check |
| SEO plugin link counts | In-content links per post | Free (Rank Math, Yoast); Yoast's orphan filter is Premium | Sites already running one of them |
| Search Console links report | Pages Google sees as linked | Free | A sanity check against Google’s own view |
| WP-CLI script | In-content orphans, directly | Free | Anyone with command-line access to the host |
Method 1: compare your sitemap with a crawl
This is the classic check, and the one that catches true orphans. The idea: your XML sitemap lists every address you want indexed. A crawler that starts at your home page and only follows links lists every address that is reachable. Anything in the first list that is not in the second is an orphan.
With Screaming Frog SEO Spider, which is the tool most people use for this:
- Find your sitemap address. With Yoast SEO or Rank Math it is usually
/sitemap_index.xml; with WordPress’s built-in sitemap it is/wp-sitemap.xml. Open it in a browser to check it loads. - In the crawl configuration, turn on crawling of linked XML sitemaps and add your sitemap’s address. This tells the crawler to read the sitemap as well as follow links, and to remember which addresses came from where.
- Crawl from your home page. On a large site, this can take a while.
- When the crawl finishes, run crawl analysis, then open the Sitemaps tab and choose the Orphan URLs filter. That is the list.
- Export it to a spreadsheet so you can work through it.
Crawling the sitemap alongside the site, which is what fills the Orphan URLs filter, needs a paid licence. On a site under 500 addresses you can do the same comparison with the free version by hand: crawl normally, export every address it found, open your sitemap in a browser and copy its addresses into a second column, and flag the sitemap addresses the crawl never found — the spreadsheet formula in method 3 does exactly that. Other crawlers, such as Sitebulb and the site-audit tools in Ahrefs and Semrush, offer the same comparison under similar names.
Method 2: the link counters in your SEO plugin
If you already run an SEO plugin, you may already have a rough count of links for every post, visible in Posts → All Posts.
- Rank Math has a link counter module, in the free plugin, that adds columns for internal, external and incoming links to the posts list. Sort by incoming links, and everything at zero is an in-content orphan. It counts links written in post content, which is exactly the definition we want.
- Yoast SEO has a text link counter that shows, per post, how many internal links it contains and how many it receives. Yoast SEO Premium adds a filter for orphaned content and a guided “workout” for fixing it.
- Dedicated linking plugins such as Link Whisper have their own link reports, usually with an orphaned-posts view.
These counts are only as current as the last time the plugin processed your posts. If you installed the plugin after most of your archive was written, look for an option to scan or reindex existing content first, or the numbers will be mostly zeros.
Method 3: Google Search Console’s links report
Search Console shows internal links as Google sees them, which makes it a good check against what the other methods tell you.
- In Search Console, open Links, and under Internal links choose More to see the top linked pages.
- Export the table. Paste it into a spreadsheet tab called
Linked. - In a second tab, paste every address from your sitemap into column A. Most sitemaps can be opened in a browser and copied, or imported with your spreadsheet’s XML import.
- In column B, flag any sitemap address that does not appear in the links export:
Google Sheets or Excel, in B2, then fill down =IF(COUNTIF(Linked!A:A, A2)=0, "orphan", "")
Three caveats. Google counts every internal link, menus and archives included, so like the crawl it mainly surfaces true orphans. The table on screen stops at 1,000 rows, so always use the export, which goes much further. And Google describes the report as a sample of your links rather than every one of them, and it lags behind your site by days or weeks. Treat an address missing from the export as “check this”, not as proof.
Method 4: a WP-CLI script that reads your posts directly
If you or your host can run WP-CLI, this is the most direct route to the list that matters: published posts and pages that no other published post or page links to from inside its content. It reads every post’s content, collects every link that points back at your own site, resolves each one to a post with WordPress’s own url_to_postid(), and prints everything that was never a target.
<?php
/**
* orphans.php - lists published posts and pages that no other published
* post or page links to from inside its content.
*
* Read-only: it changes nothing. Run it from your WordPress folder:
* wp eval-file orphans.php > orphans.tsv
*/
$ids = get_posts( [
'post_type' => [ 'post', 'page' ],
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
] );
$bare = fn( $host ) => preg_replace( '/^www\./i', '', (string) $host );
$home = $bare( wp_parse_url( home_url(), PHP_URL_HOST ) );
$linked = [];
foreach ( $ids as $id ) {
$html = get_post_field( 'post_content', $id );
if ( ! preg_match_all( '/href\s*=\s*["\']([^"\'#]+)/i', $html, $m ) ) {
continue;
}
foreach ( array_unique( $m[1] ) as $href ) {
$host = wp_parse_url( $href, PHP_URL_HOST );
if ( $host && $bare( $host ) !== $home ) {
continue; // A link to another site.
}
$target = url_to_postid( $href );
if ( $target && $target !== $id ) {
$linked[ $target ] = ( $linked[ $target ] ?? 0 ) + 1;
}
}
}
echo "id\tword_count\ttitle\turl\n";
foreach ( $ids as $id ) {
if ( empty( $linked[ $id ] ) ) {
$words = str_word_count( wp_strip_all_tags( get_post_field( 'post_content', $id ) ) );
printf( "%d\t%d\t%s\t%s\n", $id, $words, get_the_title( $id ), get_permalink( $id ) );
}
}Open orphans.tsv in a spreadsheet and sort by word count, longest first. The long ones are usually your best candidates: posts somebody put real effort into that are currently invisible.
A few notes, so the output does not surprise you:
- Your home page, contact page and other pages linked from menus will appear — they are not linked from content. Ignore them.
- Links inside reusable blocks, synced patterns, widgets and your theme are not in post content, so they are not counted. That is deliberate; it matches the definition above.
- Links that go through a redirect — to an old slug, say — are usually still resolved to the right post by
url_to_postid(), but it is worth fixing those links to point at the current address anyway. - On a few thousand posts it takes a minute or two. It makes no changes, so it is safe to run on a live site, though running it on a staging copy is never a bad habit.
What to do with each orphan
Now you have a list — on a blog with a few hundred posts, typically somewhere between a few dozen and a hundred-plus entries. Resist the urge to start linking from the top. A minute of triage per post saves you from sending readers to pages you would rather they did not see.
For each orphan, ask three questions in order:
- Is it still right? Out-of-date prices, discontinued products, advice you no longer give, a destination guide written before everything reopened.
- Is it the best page you have on this topic? Or did you write a better, newer version that covers the same question?
- Would a reader of a related post want to go there next? This is the question that decides whether a link will actually be clicked.
| If the post is… | Do this | Example |
|---|---|---|
| Accurate, useful, and the only post on its topic | Link it from two or three related posts | A detailed guide to sharpening chisels that no woodworking post links to |
| Useful but out of date | Update it first, then link it | A 2022 comparison of high-yield savings accounts with old rates |
| One of several posts on the same question | Merge the best parts into the strongest post and 301-redirect the rest to it | Three separate posts on toddler sleep regressions written over four years |
| Deliberately standalone | Leave it unlinked; noindex it if it is not meant for search | A giveaway landing page, a thank-you page, a media-kit page |
| Of no use to anybody | Delete it; redirect it if it ever had traffic or backlinks | “We’re moving hosts this weekend!” from 2019 |
Linking an orphan back in, properly
For every orphan you keep, the job is to add a small number of good links to it, from the right places, in words that already belong in the linking post. Here is how to do that without it turning into a week of editing.
Find the posts that should link to it
The best linking posts are about a closely related topic, get some traffic of their own, and have a sentence where the orphan’s subject already comes up naturally. Three quick ways to find them:
- Search your own site. In Google, search
site:yourdomain.com "dovetail"for the orphan’s main subject. Every result that is not the orphan itself is a candidate. The WordPress admin search does the same job on post content, without the traffic ranking. - Use Search Console. In the Performance report, filter to the orphan’s page and look at the queries it appears for. Then search your site for those phrases: posts that use them are already talking about the orphan’s topic.
- Look up, then sideways. Is there a broader guide the orphan is a detail of? That guide should link down to it. Are there sibling posts at the same level — other recipes in the same cuisine, other neighbourhoods in the same city? One of them can link across.
Link from a sentence that already exists
The strongest internal link wraps words that are already in the post. You are not writing a new paragraph that says “check out my post on X”; you are noticing that the post already mentions X and making those words a link.
| Sentence | |
|---|---|
| Before | If you only have a day, the tram up to the castle is worth the queue. |
| Weak | If you only have a day, the tram up to the castle is worth the queue. Click here for my tram guide. |
| Better | If you only have a day, the tram up to the castle is worth the queue. |
The better version adds no words, reads exactly as before, and the linked phrase describes the destination. That is the pattern to repeat.
A few rules of thumb
- Two or three good links beat ten weak ones. Start with the most related post that gets traffic. Add more as you publish new related posts.
- Put the link in the body. Not in a heading, a caption, a button or a block of “related reading” at the very bottom that nobody reaches.
- Earlier is better than later, as long as it reads naturally. A link in the second paragraph is seen by far more readers than one in the last.
- Vary the words. Each linking post will describe the orphan slightly differently, and that variety is useful. Do not paste the orphan’s exact title as the anchor everywhere.
- Link to the final address. Copy the link from the live post, not an old bookmark, so it does not go through a redirect.
- Save a revision. WordPress keeps revisions by default; make sure your host has not disabled them before you edit a hundred posts.
Stopping new orphans from appearing
Fixing the backlog once is satisfying. Not having to do it again is better. Five habits stop most new orphans from appearing:
- Link to every new post from two or three older ones on the day it goes live. This is the single highest-value habit in internal linking. A new post is at its most visible on publish day and then starts sinking; links from older, established posts keep it reachable after it leaves the home page.
- Keep a hub page for every main topic. A guide to growing tomatoes, a Japan itinerary hub, a “start here” page for budgeting — a page that links to every post in its topic and is itself linked from your menu. New posts get added to the hub, so no post in that topic can be more than two clicks from home. The internal linking strategy guide covers how to build one.
- Redirect, never just delete. When you remove or merge a post, point its address at the closest remaining post with a 301 redirect, and update any links that pointed at it.
- Check before you restructure. Before changing menus, removing a sidebar widget or switching related-posts plugins, note which posts those were linking to. Some of them will have had no other links.
- Re-run the check every quarter. The script above takes two minutes. Put it in your calendar.
Checking that it worked
Internal linking is easy to feel good about and hard to measure honestly. A few habits keep you from fooling yourself:
- Write down the date you linked each post. A column in your orphan spreadsheet is enough. Without it, you will not know which changes to compare.
- Check that the link was seen. Search Console’s URL inspection shows, under page discovery, the referring pages Google knows about. Once a linking post has been recrawled, your new link should start to appear. You can request a recrawl of the linking post if you are impatient.
- Compare like with like. In the Performance report, compare the same number of weeks before and after for each page — and ideally for a handful of untouched posts too, so a seasonal swing or an algorithm update is not mistaken for your work.
- Give it time, and expect a spread. Links are usually picked up within days to weeks; changes in impressions tend to show over four to eight weeks. Some posts will move clearly, some a little, some not at all. That is normal. The ones that do not move are often the ones that need rewriting rather than linking.
- Watch clicks between posts, not only search. If you have analytics, look at how often readers move from the linking post to the orphan. A link nobody clicks is a hint that it is in the wrong place, or the wrong post.
Where Silotree fits
Everything above works by hand, and on a small site it is a satisfying afternoon. On a site with hundreds or thousands of posts, the finding is quick and the linking is the slog: reading candidate posts, finding a sentence that already says the right thing, editing, saving. That part is what Silotree was built for. The free internal link checker produces the in-content orphan list, click depth, broken links and links through redirects with no account. The paid plans then suggest links from sentences you already wrote, a few each week by email, and write the ones you approve — with a revision saved first and an undo for every batch.
Questions people ask
Is an orphan page the same as a page that isn't indexed?
No. An orphan can be indexed — often because it is in your XML sitemap — and a page with plenty of links can fail to be indexed for other reasons. Being orphaned makes a page harder to discover and weaker once it is found, which is why the two often go together.
Do links from category and tag pages stop a post being an orphan?
Technically yes: a crawler can reach it. In practice those links are weak. On a large archive the post may be dozens of pagination pages deep, the link carries no descriptive anchor text, and the post drops further down every time you publish. Treat a post with only archive links as an orphan for any decision that matters.
Does being in the XML sitemap fix an orphan?
It helps a search engine find the address. It does not tell the search engine the page matters, does not describe what it is about the way anchor text does, and sends no readers to it. A sitemap is a list of addresses; internal links are a vote.
How many links does an orphan need?
There is no threshold. Two or three links from genuinely related posts — ideally ones that already get visits — do far more than ten from unrelated ones. Start with one good link and add more as you publish related posts.
Should I delete orphan pages?
Only the ones with no value to anybody: out-of-date announcements, test posts, thin tag-style pages. Anything with useful content should be linked or merged. If you remove a page that has ever had traffic or backlinks, redirect it to the closest match rather than leaving a 404.
How long before a newly linked orphan shows any change?
The link itself is usually recrawled within days to a few weeks, depending on how often the linking post is crawled. Changes in impressions, if they come, tend to show over four to eight weeks. Compare the same period before and after, and expect some orphans not to move at all.