Remove Theme Demo Content Before Launch: a WordPress REST API Audit

Date:

Premium WordPress themes ship a beautiful demo – and if you import it, that demo content is now your site. Before you go live (and especially before you apply for ad networks), you have to find and strip every leftover demo post, menu, and page-builder block. The fastest, most repeatable way to do it is through the WordPress REST API.

The short answer: To remove theme demo content before launch, treat it as an audit, not a hunt. Compare your posts to the theme’s official demo (same titles/slugs) via the REST API to find leftover demo articles; check menus, pages, and widgets for demo/placeholder entries; and inspect the page builder’s front page for demo blocks and ad banners. Fix what the REST API can reach directly (posts, pages, menus, settings), and for the parts it can’t – the theme panel and the builder’s own template store – use a small read-only snippet to locate them and a one-time setter snippet to change them. Then run a WordPress go-live audit (maintenance response, indexing, legal pages, broken nav, repetition) and verify anonymously.

Demo content isn’t just untidy. Ad networks reject sites that look like an unfinished template, search engines index the placeholder text, and visitors lose trust the moment they hit a “Books / Games / Movies” menu that goes nowhere. The good news: almost all of it is discoverable and fixable over REST.

From imported demo to launch-readyA REST API audit turns a demo-filled theme into a real site
Imported demo

Demo posts fill the categories. Menus point at #; fake top bars. Page-builder demo blocks + banner ads. Footer credits the theme. Ad networks reject it.

placeholder, not yours
Launch-ready

Real articles, real menus + categories. No demo banners. Real footer + legal pages. Gates pass: 503 wall, indexable, nav resolves, no repetition.

Why leftover demo content blocks a launch

A theme demo is designed to look full, so it plants content in several places at once:

  • Demo posts – often dozens, styled to fill category blocks.
  • Demo menus – fake top bars, “login/register” links, sample dropdowns, all pointing at #.
  • Page-builder blocks – the front page and post templates carry demo category blocks and demo ad banners advertising the theme itself.
  • Footer – a demo “about us” blurb and a “Made with <Theme>” copyright.

Left in place, this is the single most common reason a new site fails an ad-network review and reads as abandoned to a first visitor.

A theme demo is a showroom, not your house. Before launch, everything in it is a placeholder you haven’t replaced yet.

Find it: diff against the official demo

The reliable way to identify demo posts is to compare your site to the theme’s published demo. Both expose the REST API, so fetch the demo’s post list and your own and match on title and slug:

# the theme's official demo
curl -s "https://demo.example-theme.com/wp-json/wp/v2/posts?per_page=100&_fields=slug,title"
# your site (authenticated for drafts too)
curl -s -H "Authorization: Basic $APP_PW" "https://your-site/wp-json/wp/v2/posts?status=publish,draft&per_page=100&_fields=slug,title"
Code language: Bash (bash)

Any post whose title or slug matches the demo is demo content. Do the same read for pages (/wp/v2/pages), menus (/wp/v2/menu-items), and categories – leftover “Politics / Food / Celebrity” terms are a giveaway. This turns “hunt for demo stuff” into a deterministic list.

What the REST API can and can’t reach

The core content is fully REST-addressable, and that’s most of the job:

  • Posts, pages, menus, settings – read and write over /wp/v2/*. Demote demo posts to draft (status=draft), fix menu URLs, publish real pages, set the privacy page.
  • The static front page is a normal Page, so a page-builder’s blocks live in its editable content – you can fix a block’s category or remove a demo ad banner via the page content.

What standard REST cannot see is the page builder’s own storage: the theme options panel (footer, social, logo) and the builder’s template library (header/footer/archive templates). For those, add a small read-only REST endpoint with a code-snippet plugin that returns the relevant options and template bodies – enough to locate the exact demo strings. Then apply the change with a one-time setter snippet that writes fixed values and runs once. Resist the urge to build a general “set any option over REST” endpoint: that’s a backdoor, not a tool.

Read widely over REST; write narrowly with a one-time snippet. A generic option-writer endpoint is a security hole wearing a convenience costume.

Audit go-live readiness

Removing demo content is half of launch-readiness; the other half is a short, repeatable WordPress go-live audit you can run over REST:

  • Maintenance response – while a “coming soon” wall is up, it should return HTTP 503, not 200, or search engines can index the placeholder. (See our note on maintenance mode and the 503 status.)
  • Indexing – robots.txt and the sitemap resolve; no site-wide noindex; search visibility on at launch.
  • Legal pages – privacy policy, about, contact, and (for ad-supported sites) an advertising disclosure, all published and linked.
  • Navigation – every menu link resolves; custom links don’t 404 after a permalink change.
  • Repetition – if the homepage has more article “slots” than you have articles, the same posts repeat across blocks; trim blocks or publish more. Fast sites help here too – see WordPress speed optimization and confirm image sizes exist via the REST API image-size check.

Always verify the public-facing checks anonymously (no login): a maintenance plugin often exempts the logged-in admin, so an authenticated request can show you a clean page the public never sees.

The short version

Importing a theme demo makes the demo your content, and it must go before launch. Find it by diffing your posts/pages/menus against the theme’s official demo over the REST API. Fix the core (posts, pages, menus, settings) directly through /wp/v2/*; for the theme panel and page-builder templates that standard REST can’t reach, use a read-only snippet to locate the demo strings and a one-time setter snippet to change them – never a generic write endpoint. Finish with a go-live audit: maintenance returns 503, indexing is clean, legal pages exist and link, navigation resolves, and the homepage has enough real articles not to repeat. Verify every public check anonymously.

Frequently Asked Questions

How do I find which posts are theme demo content?

Compare your site to the theme’s official demo through the REST API: fetch both post lists (/wp-json/wp/v2/posts) and match on title and slug. Any post that matches the demo is demo content. Repeat for pages, menus, and categories. This gives you an exact list instead of guesswork.

Should I delete demo posts or set them to draft?

Set them to draft first. It removes them from the site and every feed/archive immediately but is fully reversible, so you can restore the demo set if a template still references one. Delete permanently only once you’re sure nothing depends on them.

Can I remove page-builder demo blocks over the REST API?

The front page is a normal Page, so its builder blocks are in editable page content you can change over REST. The header, footer, and archive templates live in the builder’s own store, which standard REST doesn’t expose – use a read-only snippet to read them and a one-time setter snippet to edit them.

Why does the maintenance page need to return 503 instead of 200?

A 200 response tells search engines the placeholder is the page’s real content, so they may index “Site under maintenance.” A 503 (Service Unavailable) with a Retry-After header tells them to come back later, protecting your rankings while the wall is up.

Why check the site while logged out?

Many maintenance and membership plugins exempt logged-in administrators. An authenticated request can return the finished page while anonymous visitors still get the wall or a demo view. Verify every public-facing check anonymously so you see what real visitors and crawlers see.

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.