When a Multisite Subsite Vanishes: Reaching a Blog Whose Mapped Domain Is Parked

Date:

A subsite whose mapped domain is parked looks deleted from every angle — the front end shows a parking page, the REST API returns nothing, and no URL you guess resolves. It isn’t gone. Here’s why it hides, and the thirty-second fix.

The short answer: a domain-mapped Multisite subsite whose custom domain is parked has no fallback address — a full-domain subsite’s only address is that domain, so when the domain lapses the blog answers nowhere even though its rows are still in the database. Re-home it: in Network Admin → Sites, change the subsite’s Site Address (URL) to a path on a live domain (or repair the domain’s DNS). And a parked domain returns 200 OK from the host’s placeholder, so read the response body, not the status code, when a domain’s routing is in doubt.

We needed three articles off one subsite of a WordPress Multisite network. The subsite simply would not load — and chasing it down turned into a useful lesson about how Multisite addressing actually works. Here is what we hit, in order, and the fix that finally worked.

It was never goneEverything points at a deleted site. Nothing was deleted.
The symptom

The mapped domain shows a registrar parking page. The subsite answers on no address you still know.

looks deleted
The dead ends

Network admin lists it. The database holds its rows. Neither hands you a URL that actually resolves.

The insight

The mapping is a ROW, not the site. The site never moved; the only thing pointing at it did.

The fix

Edit the mapping, not the site. Nothing about the content, the IDs or the uploads ever changed.

The site was reachable throughout, at an address the mapping had quietly taken out of service.

The symptom

The network has several subsites. Some live under the primary domain as subdirectories (network.example/shop); others are mapped to their own domains (brandx.example). The one we wanted was domain-mapped — and that domain had lapsed into a parked state. The front end showed a placeholder, and the REST API returned nothing we could use. The content was clearly still somewhere; we just had no working address for it.

The dead ends

We worked through the obvious routes, and each one taught us something worth writing down.

  • Public DNS. The mapped domain did not resolve at all. The resolver even appended a local search suffix and matched a wildcard, which is easy to misread as “the domain exists.” It does not — a name that only resolves with a suffix tacked on is effectively unresolved.
  • Pinning the hostname to the network’s server. We forced the request to the network’s IP with the right Host header. It returned 200 OK — but the body was the host’s generic “parked domain” placeholder, not WordPress. This is the trap: a managed host serves a parking page for any hostname it does not recognize as an active site, so a 200 proves nothing. Always read the response body, not just the status code — the same habit as auditing any other HTTP response — when a domain’s routing is in doubt.
  • Subdomain forms. Guesses like brandx.network.example did not resolve — this network is subdirectory-based, not subdomain-based.
  • Subdirectory guesses. Every network.example/brandx-style path returned a hard 404, the same as any made-up path. That 404 was the real clue, though we did not see it yet.
  • A header-versus-certificate trick. We tried connecting to the live origin while presenting the dead domain’s Host header. The content delivery layer refused the mismatch and closed the connection. Fronted sites generally require the server name and the host header to agree.
  • A REST endpoint for the site list. Core WordPress does not expose one. There is no built-in route that enumerates a network’s blogs, so you cannot discover a missing subsite that way.

The hard 404 on every subdirectory guess was the answer hiding in plain sight.

The insight

The hard 404 on every subdirectory guess was the answer hiding in plain sight. There are two kinds of subsites on a subdirectory network:

  • A subdirectory subsite keeps a path on the primary domain even when it is also mapped to a custom domain. network.example/shop keeps answering regardless of the mapped domain’s health.
  • A full-domain subsite is added with its own domain and a root path. It has no subdirectory fallback. Its only address is that domain.

Our subsite was the second kind. The blog still existed in the database, but with its domain parked it had nowhere to answer — no path on the primary domain, no subdomain, nothing. That is why no guess could ever land: there was no second address to find.

A full-domain subsite has no fallback; its only address is that domain.

The fix

The clean fix takes about thirty seconds in the dashboard. In Network Admin → Sites, edit the site, and on the Info tab change Site Address (URL) from the dead domain to a path on a live domain — for example network.example/brandx/ — then save. That re-homes the blog onto an address that actually answers, and the front end and the REST API both come back immediately. The alternative is to repair the domain itself — re-point its DNS records at the host and clear the parking — so the original address works again. Re-pathing is faster when you only need to read the content; repairing DNS is right when the custom domain has to stay public.

Two gotchas worth keeping

  • Application Passwords authenticate the REST API and XML-RPC, not the dashboard. Browser pages under wp-admin need a real cookie session, so an application password will not script you into Network Admin. A human makes the site-address change in the dashboard; automation can read over REST afterward.
  • A status code is not proof of arrival. A parked domain happily returns 200 — the same 200-that-isn’t-what-it-looks-like trap as a maintenance page. When a domain’s routing is uncertain, confirm you reached the application by checking the body — the REST root’s site name is a good, cheap signal.

A parked domain happily returns 200 — that’s not proof you ever reached the site.

The short version

StepWhat it tells you
Resolve the domainA name that only resolves with a search suffix is not really resolving
Pin host to server IPA 200 parked page is not your site — read the body
Try subdirectory pathsA hard 404 everywhere means there is no path fallback
Check the subsite typeFull-domain subsites have only one address; subdirectory ones keep a path
Re-path or repair DNSRe-path to read now; repair DNS to keep the public domain

The lesson that stuck: on a Multisite network, a subsite’s type decides whether it survives losing its domain. A subdirectory subsite degrades gracefully; a full-domain subsite disappears entirely until you give it a living address. Knowing which kind you are dealing with turns an afternoon of guesswork into a single dashboard edit.

Frequently Asked Questions

Is my subsite’s content gone if the mapped domain is parked?

No. A parked domain only kills the address, not the data — the blog’s rows are still in the Multisite database. The site looks deleted because a full-domain subsite has no fallback address to answer on, but the moment you give it a living address (a path on a live domain, or a repaired domain) the front end and REST API return immediately.

How do I list all the subsites in a Multisite network?

Through Network Admin → Sites in the dashboard. Core WordPress exposes no REST route that enumerates a network’s blogs, so you can’t discover a missing subsite over the API — the dashboard (or WP-CLI on the server) is the authoritative list.

Can I reach a domain-mapped subsite without fixing the domain?

Yes. In Network Admin → Sites, edit the site and change its Site Address (URL) to a path on a domain that already resolves (for example network.example/brandx/). That re-homes the blog onto a working address instantly. Repairing the domain’s DNS is the alternative when the custom domain has to stay public.

Why does the parked domain return 200 OK if the site is unreachable?

Because the host serves a generic parking placeholder for any hostname it doesn’t recognise as an active site — and that placeholder is a real page, so it answers 200. The status code only tells you something responded, not that you reached your site. Read the response body (the REST root’s site name is a cheap signal) to confirm.

Share post:

Subscribe

Popular

More like this
Related

How to Merge Spreadsheets by URL (and Why Our Tool Reported 5 Misses That Weren’t)

Matching two spreadsheets on a URL column is the same job as matching a stock list to a price list by product code. It goes wrong in the same two places: how you clean the code, and how you count what didn't match.

Many-to-One: Why a Mapping Backlog Outgrows Its Target Taxonomy

You're mapping a messy source vocabulary onto a clean target taxonomy. The target has about 5,600 slots, so the job must be roughly 5,600 decisions — right? The backlog is already past 8,900, and still climbing.

The Fix That Didn’t Take: When a Content-Hash Gate Skips Your Code Change

You shipped a fix to how one field is computed, re-ran the pipeline across everything, and it reported a clean run. Then the consistency check still flags those records as wrong. The fix is in the code, the rebuild "ran" — and the records never changed. Your own optimisation skipped them.

Your Dedup Scan Is Over-Counting — Because It Forgot What You Already Fixed

The report said 80 duplicate groups still to resolve. You'd been resolving them for days. You run it again after a big batch and it *still* says 80-ish. The backlog isn't stubborn — the scan is counting work you already finished.