Most advice about getting cited by AI opens with the same diagnosis: your content is built in the browser and crawlers cannot run JavaScript. On WordPress that is almost never the problem. WordPress assembles a page on the server and sends finished HTML — classic themes, block themes and full site editing alike. Which is good news and awkward news at once: the easy explanation is off the table, and the real reason an engine cannot find you is something you cannot see by looking at your site.
There are four places it usually hides. One of them is a single checkbox whose behaviour changed in WordPress 5.3 — and almost every guide still describes the old behaviour.
First, rule out the setting that quietly deletes you
Settings → Reading → Discourage search engines from indexing this site. It sets the blog_public option to off. It exists so you can build in peace, it gets ticked on staging, and it survives the clone to production more often than anyone admits.
What every write-up tells you it does is out of date. They say it adds Disallow: / to your robots.txt. WordPress removed exactly that in 5.3 — the changelog entry on do_robots() reads "Remove the 'Disallow: /' output if search engine visibility is discouraged in favor of robots meta HTML tag." Since 5.7, wp_robots_noindex() runs on the wp_robots filter and, when blog_public is off, puts noindex, nofollow in the robots meta tag on every page of the site.
# The whole diagnosis, in one line. Any noindex here and nothing else matters yet.
curl -s https://yourdomain.com/ | grep -i '<meta name="robots"'
# Same check on a page you actually want cited, not just the homepage.
curl -s https://yourdomain.com/your-best-page/ | grep -i '<meta name="robots"'If a noindex comes back, stop and fix that before touching anything else. And note that the Reading checkbox is not the only thing that can produce one: an SEO plugin can set noindex per post type or per archive, a theme can inject it, and a three-line wp_robots filter left in a child theme by whoever built the site will do it silently and forever.
Your robots.txt is not a file — until somebody makes it one
WordPress generates robots.txt at request time. do_robots() builds it, and the default body is small: a User-agent: *, a Disallow on the admin path, an Allow for admin-ajax.php, and a Sitemap: line added by core's sitemap class. Everything else you see in yours was appended through the robots_txt filter — that is the hook your SEO plugin's robots.txt panel writes into.
# What the internet actually gets. Compare this against your plugin's panel;
# if they disagree, a physical file is shadowing WordPress.
curl -s https://yourdomain.com/robots.txtAllowing the right crawlers — and the layer above WordPress
Vendors split their crawlers along two independent axes, and the distinction decides whether a robots.txt line costs you anything. One token governs whether your content may be used to train future models — a content-rights decision. A different token governs whether the retrieval crawler may fetch your pages so you can be cited in an answer right now — a visibility decision. Separate strings, separate published IP ranges. Blocking one says nothing about the other.
| Token | Vendor | What it actually controls | Keep allowed? |
|---|---|---|---|
Googlebot | The search index that grounds AI Overviews and Gemini | Yes — baseline | |
OAI-SearchBot | OpenAI | Fetches pages so ChatGPT search can cite them | Yes — the one that matters |
Claude-SearchBot | Anthropic | Retrieval for Claude's answers | Yes |
PerplexityBot | Perplexity | Crawls and refreshes Perplexity's answer index | Yes |
Bingbot | Microsoft | Bing's index, reported to also feed Copilot | Yes |
GPTBot | OpenAI | Model-training collection only | Optional — a policy choice, not a visibility one |
Google-Extended | Gemini training plus prompt-time grounding; no effect on Search inclusion | Allow to keep grounding links |
The common mistake is to add GPTBot to the allow list and call it done. GPTBot is the training token; it does not gate a single ChatGPT citation. OAI-SearchBot does, and it is the one most copied snippets never mention. Match strings exactly — a User-agent line written for a token no crawler sends is a rule that reads like protection and does nothing.
You almost certainly have two sitemaps, and one of them is wrong
WordPress core has shipped XML sitemaps since 5.5. WP_Sitemaps serves an index at /wp-sitemap.xml, registers three providers by default — posts, taxonomies and users — and appends the Sitemap: line to the generated robots.txt itself.
Install an SEO plugin and it will usually switch core's off through the wp_sitemaps_enabled filter and serve its own index at a different URL. There is a detail in how core handles that which bites people: when sitemaps are disabled by filter, the rewrite rules stay registered specifically so the URL returns a 404. So /wp-sitemap.xml does not vanish — it becomes a dead address that used to work, and anything still pointing at it now points at nothing.
Decide which sitemap is the real one
Core's or the plugin's, not both. Fetch each URL and see which returns XML and which returns a 404.
Make robots.txt and Search Console agree with that answer
The Sitemap: line in your live robots.txt and the sitemap submitted in Search Console should be the same URL. This disagrees more often than you would expect, because the two were set up months apart by different people.
Look at what is actually in it
Core includes a users provider, which means author archives. On a one-author site those are duplicate listings of content that already has a home. Tag archives created by accident, date archives, and attachment pages belong in the same bucket.
Keep it honest about dates
A sitemap that re-stamps every URL with today's date each time it regenerates teaches an engine that your dates mean nothing. Freshness only helps while it is true.
What WordPress renders, and the few places it stops
Content lives in post_content and comes back inside the HTML response. That is why the rendering panic does not transfer here — and why the test is genuinely simple. WordPress serves the same markup to everybody, so curl is a valid stand-in for a crawler in a way it is not on a JavaScript-rendered site.
# Pick a sentence you would want quoted, and prove it is in the served HTML.
curl -s https://yourdomain.com/your-best-page/ | grep -c "the exact sentence you want cited"
# 0 means it is being added after load, and no non-Google crawler will see it.The exceptions are worth knowing because they are the only rendering failures WordPress actually produces:
- Load-more and infinite scroll. Tabs and accordions usually ship their content in the HTML and merely hide it with CSS, which is fine. Anything fetched on click or on scroll is not there at all.
- A headless setup. Point a JavaScript front end at the WordPress REST API and you have traded away the one thing WordPress was giving you for free. That is a rendering problem again, and it needs a rendering answer.
- Facts locked in images. A number that exists only inside an infographic is invisible to text extraction. Put it in a sentence as well.
- A stale full-page cache. Caching is not the enemy, but a crawler can be handed a copy generated before your last edit. Purge after publishing, and re-fetch the live URL rather than trusting the editor preview.
Schema: the usual problem is too much of it, not too little
WordPress core emits no structured data at all. Every bit of it on your site comes from a plugin or a theme, which is why the failure mode here is duplication rather than absence. Two SEO plugins left active produce two entity graphs making overlapping claims; a theme that adds its own Organization block on top produces a third. An engine resolving who you are then has several same-named nodes to choose between, which is the exact ambiguity structured data exists to remove. Run one source of schema and turn the others off.
The one rule that matters more than any type choice: schema must describe the page, not aspire to describe it. Marking up a review score, a price or an FAQ that a reader cannot find on the page is a claim that every system reading your site can check.
After the settings, the settings stop mattering
Everything above buys candidacy: the engine can reach your pages, read them, and index them. None of it buys selection, which is the separate question of whether the engine picks you over everything else it retrieved for that question. Conflating the two is why people fix all four things and see nothing move. We pull them apart in discoverability vs selectability.
WordPress creates its own version of the selection problem, and it comes from its greatest strength: publishing is nearly free, so sites accumulate. Forty near-identical posts circling one topic compete with each other and give an engine no reason to choose any of them. Eight pages carrying real numbers, a named process and a stated professional judgment give it a reason. The thing a model cannot synthesise from everywhere else is the thing that gets quoted.
Structure the writing so a passage can survive being lifted. Lead each section with the claim and follow with the evidence, keep one idea per paragraph, and make sure a paragraph still means something when it is quoted without the three above it. Most citations in AI answers also point at pages you do not own — roundups, review sites, community threads — which is slower work on a longer clock. Which sources AI engines cite maps that ground.
How to tell whether any of it worked
Not by asking an assistant once. Across 2,961 brand-recommendation prompts run against ChatGPT, Claude and Google's AI surfaces, the engines returned the same ordered brand list in under one percent of runs for an identical prompt. A single query measures the noise. It will tell you the fix failed on Tuesday and worked on Thursday, and both readings will feel convincing.
- Freeze a prompt set first — fifteen to thirty questions a buyer would really type, written down before you change anything.
- Run each one several times per cycle and keep every raw answer, with its date and the model version that produced it.
- Tag each result with the engine and the surface. A model API answer and a Google AI Overview are different products with different citation behaviour; averaging them hides half your exposure.
- Report ranges, not points. With a handful of runs per prompt the interval around any percentage is wide, and hiding that is how teams celebrate noise.
- Wait a full refresh window before judging a change. Crawl and index refresh runs on each engine's clock — days to weeks, not hours.
- Watch impressions, not just sessions. If you only count clicks, a channel that answers the question without one will always look like pure loss.
Does WordPress need a plugin to be visible to AI search?
No. Core already serves rendered HTML, generates a robots.txt with a sitemap reference, and publishes an XML sitemap at /wp-sitemap.xml. A plugin gives you per-page control over titles, descriptions, canonicals and structured data, which is worth having — but a clean core install is not invisible, and adding a second SEO plugin on top of the first actively makes things worse.
The Discourage setting is off, so why do my pages still say noindex?
Because the Reading checkbox is not the only thing that writes that tag. An SEO plugin can apply noindex per post type or per archive, a theme can inject one, and a custom callback on the wp_robots filter in a child theme or a must-use plugin will do it invisibly. Fetch the live URL and read the meta robots tag; if it says noindex while the setting says otherwise, something else is adding it.
My robots.txt does not match what my plugin shows. Why?
Almost certainly a physical robots.txt file sitting in the web root. WordPress only generates one when nothing exists at that path, so a real file makes the web server answer directly and the robots_txt filter never runs. The plugin panel keeps displaying rules nobody is being served. Delete or reconcile the file, then re-fetch the live URL to confirm.
Should I add an llms.txt file to WordPress?
No. Google has said it does not support the file and is not planning to, measured adoption sits around ten percent of sites, and no major engine has published that it reads one. There are plugins that will generate it for you in a click, and that click buys nothing today. If real support ever arrives the file takes ten minutes to write.
Should I block GPTBot in robots.txt?
That is a content-rights decision, not a visibility one. GPTBot collects training data; OAI-SearchBot is the token that lets ChatGPT fetch your pages in order to cite them. You can block GPTBot and remain fully citable, or allow it and gain nothing in citations. Decide the two separately, and never block the retrieval token by accident while opting out of training.
How long after fixing this should I expect to appear in AI answers?
Longer than most guides suggest, and the timing belongs to the engines rather than to you. Re-crawl and re-index run on each vendor's own schedule, typically days to weeks, and being crawled again only returns you to the candidate pool. Whether you then get named depends on what exists about you elsewhere, which does not move on a publishing timescale.
The short version for WordPress: read the live meta robots tag before you believe any setting, read the live robots.txt before you believe any plugin panel, pick one sitemap and one source of schema, and then accept that the technical layer was only ever the entry fee. For the baseline to measure the rest against, run the free audit.
Sources
- WordPress — do_robots() — First-party source and changelog: since 5.3, discouraging search engines no longer emits a site-wide Disallow; output passes through the robots_txt filter.
- WordPress — wp_robots_noindex() — First-party: since 5.7, an unset blog_public adds noindex to the robots meta tag site-wide via the wp_robots filter.
- WordPress — WP_Sitemaps — First-party: core XML sitemaps since 5.5 at /wp-sitemap.xml, posts/taxonomies/users providers, the robots.txt Sitemap line, and the 404 left behind by wp_sitemaps_enabled.
- OpenAI — Overview of OpenAI crawlers — First-party: the GPTBot (training) vs OAI-SearchBot (search citation) token split.
- Perplexity — Crawlers — First-party: PerplexityBot, plus the documented note that the user-triggered fetcher generally ignores robots.txt.
- Anthropic — Web crawling and blocking the crawler — The ClaudeBot / Claude-SearchBot token split. Widely corroborated; the support page did not respond at verification time, so treat the exact token semantics as first-party-reported rather than first-party-confirmed.
- Cloudflare — Content Independence Day: no AI crawl without compensation — First-party: from 1 July 2025 newly onboarded domains default to blocking AI crawlers, which is why an edge check belongs in this diagnosis.
- Google — AI features and your website — First-party: no special schema and no AI-specific text files are required for AI Overviews or AI Mode.
- Google — Search documentation changelog — First-party: HowTo rich result removed September 2023; FAQ rich result stopped appearing in Search from 7 May 2026.
- Search Engine Journal — Google confirms structured data won't make a site rank better — Quotes Mueller and Sullivan directly on structured data not being a ranking factor.
- Search Engine Journal — Google's llms.txt guidance depends on which product you ask — Illyes on non-support, plus the SE Ranking adoption study at roughly ten percent of sites.
- SparkToro / Search Engine Journal — AI recommendations change with nearly every query — 2,961 prompts across ChatGPT, Claude and Google AI: the identical ordered brand list came back in under 1% of runs.