# GEO best practices for a WordPress site

> Most WordPress GEO problems are settings, not content. Check the search visibility box, the robots.txt your plugins write, and any firewall or CDN that blocks bots. Then keep one sitemap and one structured data source, and measure from logs and search reports.

- URL: https://geo.casa/best-practices/wordpress/
- Guide · Officially documented
- Reviewed: 2026-10-28

This guide is for people who run a WordPress site and want it to show up in AI answers from Google, ChatGPT, Perplexity and Copilot. It walks through the WordPress settings, plugins and hosting layers that decide whether AI search can read your pages. A first pass takes an afternoon if you have admin access and can see your CDN or firewall settings.

## The short version

1. Make sure WordPress itself isn't asking search engines to stay away.
2. Check the robots.txt that WordPress and your plugins actually serve, and allow the AI search crawlers.
3. Check that your security plugin, host and CDN don't block those crawlers.
4. Keep one XML sitemap, from core or one SEO plugin, and submit it.
5. Let one plugin output structured data, and keep it in line with what the page shows.
6. Make sure themes and page builders put the main text in the HTML.
7. Measure with crawler logs and the search engines' AI reports.

## 1. Turn off "Discourage search engines"

The most common WordPress block is one checkbox. Staging sites are set up with it on, and it often stays on after launch.

> **Officially documented:**
> WordPress's Settings › Reading screen has a "Discourage search engines from indexing this site" option. Since version 5.3, ticking it adds a `noindex,nofollow` robots meta tag to every page that calls `wp_head()`, which standard themes do. WordPress notes that the option doesn't block access. It is a request that search engines may honour.
>
> Sources: [WordPress.org: Settings Reading screen](https://wordpress.org/documentation/article/settings-reading-screen/)

> **Officially documented:**
> To appear as a supporting link in AI Overviews or AI Mode, a page "must be indexed and eligible to be shown in Google Search with a snippet".
>
> Sources: [Google Search Central: AI features and your website](https://developers.google.com/search/docs/appearance/ai-features)

A `noindex` page fails that test. Check the box is clear, then view the source of a live page and search for `noindex`.

## 2. Read the robots.txt you actually serve

WordPress generates a virtual robots.txt when no file exists. SEO plugins can edit it, and a physical `robots.txt` file on the server replaces it. Open `https://your-site/robots.txt` and read what is there, not what a settings screen says.

> **Officially documented:**
> OpenAI: "Sites that are opted out of OAI-SearchBot will not be shown in ChatGPT search answers, though can still appear as navigational links." Disallowing GPTBot, its training crawler, is a separate setting and does not affect search.
>
> Sources: [OpenAI: Overview of OpenAI crawlers](https://developers.openai.com/api/docs/bots)

- Allow `Googlebot`, `Bingbot`, `OAI-SearchBot`, `Claude-SearchBot` and `PerplexityBot` if you want to appear in those products.
- Decide training crawlers (`GPTBot`, `ClaudeBot`, `Google-Extended`) separately. Rules per token: [Configure robots.txt for AI crawlers](https://geo.casa/crawling-indexing/robots-txt-ai-crawlers/).
- Watch for "block AI bots" toggles in plugins. Check which tokens they actually write.

## 3. Check the security plugin, host and CDN

A robots.txt that allows a crawler doesn't help if a firewall answers it with `403` or a challenge page. On WordPress, that firewall can be a security plugin, the host's bot protection, or a CDN in front of the site.

> **Officially documented:**
> Google lists "ensuring that crawling is allowed in robots.txt, and by any CDN or hosting infrastructure" among the practices that still matter for its AI features.
>
> Sources: [Google Search Central: AI features and your website](https://developers.google.com/search/docs/appearance/ai-features)

> **Officially documented:**
> Cloudflare's legacy "Block AI bots" setting blocks verified bots it classifies as AI training crawlers, and is marked for deprecation on September 15, 2026. From that date, new domains get defaults that block training and agent bots on pages that show ads, while search crawlers stay allowed. Mixed-purpose crawlers that do both search and training are blocked under the AI-training options.
>
> Sources: [Cloudflare: Block AI Bots](https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/)

- List every layer between the internet and WordPress: CDN, host firewall, security plugin, rate limiter.
- In each, find the bot or AI setting and note what it blocks.
- Confirm in logs that verified search crawlers get `200` responses (step 7).

> On WordPress, the robots.txt is rarely the only gatekeeper. Check every layer that can say no before you write a word of new content.

## 4. One sitemap, submitted

> **Officially documented:**
> Since WordPress 5.5, core provides a sitemap index at `/wp-sitemap.xml`. It lists public post types, taxonomies and author archives, and the virtual robots.txt points to it. Core sitemaps are switched off when the site discourages search engines. Each sitemap holds up to 2,000 URLs by default.
>
> Sources: [WordPress.org (Make WordPress Core): New XML Sitemaps Functionality in WordPress 5.5](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/)

SEO plugins usually replace the core sitemap with their own. Pick one. Then:

- Check the sitemap URL loads and lists your important pages, not tag archives or attachment pages.
- Submit it in Google Search Console and Bing Webmaster Tools. Bing feeds Copilot.
- Background: [XML sitemaps](https://geo.casa/crawling-indexing/xml-sitemaps/) and [XML sitemaps vs IndexNow](https://geo.casa/tools-protocols/sitemaps-vs-indexnow/).

## 5. One structured data source, matching the page

SEO plugins output schema.org markup automatically. Problems start when a theme, a plugin and a page builder each add their own, or when the markup describes things the page doesn't show.

> **Officially documented:**
> Yoast SEO outputs a connected schema graph as JSON-LD automatically. The types it lists include Organization, Person, WebPage, Article and Breadcrumb.
>
> Sources: [Yoast: Structured data - Yoast SEO Features](https://yoast.com/features/structured-data/)

> **Officially documented:**
> "Don't mark up content that is not visible to readers of the page." Google also does not guarantee that correct markup will appear in results.
>
> Sources: [Google Search Central: General structured data guidelines](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)

> **Officially documented:**
> Google says there is no special schema.org structured data needed to appear in AI Overviews or AI Mode.
>
> Sources: [Google Search Central: AI features and your website](https://developers.google.com/search/docs/appearance/ai-features)

So treat structured data as housekeeping. Use it to state who publishes the site ([Organization structured data](https://geo.casa/content-structured-data/organization-structured-data/)) and what each page is ([Article structured data](https://geo.casa/content-structured-data/article-structured-data/)). Whether it changes AI citations is an open question: [Does structured data change AI search citations?](https://geo.casa/playbooks/schema-ai-citations/).

- Run a page through the Rich Results Test and count how many plugins emit markup.
- Turn off duplicate output in the theme or extra plugins.
- Fill in the organization name, logo and profiles in the SEO plugin's settings.

## 6. Keep the text in the HTML

Classic WordPress themes render on the server, so the text is in the HTML. Some sliders, tabs, "load more" blocks and headless front ends load content with JavaScript.

> **Officially documented:**
> Google recommends server-side or pre-rendering because "not all bots can run JavaScript".
>
> Sources: [Google Search Central: Understand JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)

Fetch a page with `curl` and search for a sentence from the middle of the article. If it's missing, see [JavaScript sites (Next.js, Vue and others): making sure AI crawlers can read your content](https://geo.casa/best-practices/javascript-sites/).

Two more template checks:

> **Officially documented:**
> `nosnippet` prevents content from being used as a direct input for AI Overviews and AI Mode, and `max-snippet` limits how much may be used.
>
> Sources: [Google Search Central: Robots meta tag, data-nosnippet, and X-Robots-Tag specifications](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)

Some SEO plugins expose these as per-post or site-wide "advanced robots" options. Search the page source for `nosnippet`, `max-snippet` and `data-nosnippet`. See [Snippet controls for AI Overviews and AI Mode](https://geo.casa/crawling-indexing/snippet-controls/).

> A setting you forgot about can undo a year of writing. Audit the template once, then audit it again after every plugin update.

## What not to do

- **Don't install several SEO plugins at once.** They output competing sitemaps, canonicals and markup (see step 5).
- **Don't block every "AI bot" in one click.** Search crawlers and training crawlers are separate decisions, and blocking OAI-SearchBot removes you from ChatGPT search (step 2).
- **Don't treat an llms.txt plugin as a fix.** There is no evidence it improves AI search visibility: [Claim: llms.txt improves AI search visibility](https://geo.casa/tools-protocols/llms-txt/).
- **Don't mass-produce posts with AI plugins.** Volume made to manipulate rankings is a spam policy issue: [Scaled content abuse](https://geo.casa/content-structured-data/scaled-content-abuse/).
- **Don't mark up FAQs, reviews or ratings that aren't on the page** (step 5).

## How you'll know it's working

> **Officially documented:**
> Google's crawlers can be verified with a reverse DNS lookup followed by a forward lookup, or against Google's published IP lists.
>
> Sources: [Google: Verify requests from Google crawlers and fetchers](https://developers.google.com/crawling/docs/crawlers-fetchers/verify-google-requests)

- **Crawler access.** In server or CDN logs, count verified visits from Googlebot, Bingbot, OAI-SearchBot and PerplexityBot, and their status codes: [Verify AI crawler traffic in server logs](https://geo.casa/implementation/verify-ai-crawlers/).
- **Google.** Use the Generative AI performance report in Search Console: [Generative AI performance report: AI Overviews and AI Mode in Search Console](https://geo.casa/measurement/search-console-ai-features/).
- **Bing and Copilot.** Use Bing's AI Performance report: [Bing AI Performance report](https://geo.casa/measurement/bing-ai-performance/).
- **Answers.** Run a fixed set of prompts monthly and record citations: [Measuring AI visibility by sampling prompts](https://geo.casa/measurement/ai-visibility-measurement/).

> **Officially documented:**
> Bing Webmaster Tools has an AI Performance report showing how often a site is cited in Copilot and Bing's AI-generated answers.
>
> Sources: [Microsoft Bing: AI Performance report (Bing Webmaster Tools help)](https://www.bing.com/webmasters/help/ai-performance-9f8e7d6c)

> **Officially documented:**
> The Generative AI performance report "shows data about how your site performs in generative AI features on Google Search".
>
> Sources: [Google Search Console Help: Generative AI performance report (Search) - Search Console Help](https://support.google.com/webmasters/answer/16984139)

## Evidence at a glance

| Recommendation | Evidence |
|---|---|
| Clear "Discourage search engines" | Official (WordPress, Google) |
| Allow AI search crawlers in robots.txt | Official (OpenAI) |
| Check CDN, host and security plugin | Official (Google, Cloudflare) |
| One submitted sitemap | Official (WordPress) |
| One structured data source that matches the page | Official (Google, Yoast) |
| Structured data raises AI citations | Unestablished |
| Main text in server HTML | Official (Google) |
| Measure via logs and AI reports | Official (Google, Bing) |

## Sources

- [WordPress.org: Settings Reading screen](https://wordpress.org/documentation/article/settings-reading-screen/)
- [WordPress.org (Make WordPress Core): New XML Sitemaps Functionality in WordPress 5.5](https://make.wordpress.org/core/2020/07/22/new-xml-sitemaps-functionality-in-wordpress-5-5/)
- [Google Search Central: AI features and your website](https://developers.google.com/search/docs/appearance/ai-features)
- [OpenAI: Overview of OpenAI crawlers](https://developers.openai.com/api/docs/bots)
- [Google Search Central: Robots meta tag, data-nosnippet, and X-Robots-Tag specifications](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag)
- [Cloudflare: Block AI Bots](https://developers.cloudflare.com/bots/additional-configurations/block-ai-bots/)
- [Yoast: Structured data - Yoast SEO Features](https://yoast.com/features/structured-data/)
- [Google Search Central: General structured data guidelines](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
- [Google Search Central: Understand JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics)
- [Google: Verify requests from Google crawlers and fetchers](https://developers.google.com/crawling/docs/crawlers-fetchers/verify-google-requests)
- [Microsoft Bing: AI Performance report (Bing Webmaster Tools help)](https://www.bing.com/webmasters/help/ai-performance-9f8e7d6c)
- [Google Search Console Help: Generative AI performance report (Search) - Search Console Help](https://support.google.com/webmasters/answer/16984139)
