Make your content machine-readable for ChatGPT, Perplexity, Claude, Gemini and Google AI Overviews — alongside your existing SEO plugin, not instead of it.
Download from WordPress.org → · Official page · Support forum
RankReady handles the machine-readability layer of your site: the files, endpoints, headers and structured data that AI crawlers and agents consume.
It does not promise citations, rankings or AI visibility. Nobody can promise those, and we don't claim them anywhere in the plugin. What RankReady guarantees is narrower and verifiable: your content is served in the formats AI clients ask for, your crawler policy is explicit, and your structured data is valid. Whether an engine then quotes you is its decision.
Everything runs in the WordPress admin. Zero frontend impact — no API calls on page load, no third-party scripts, no extra requests for visitors.
Serves the llmstxt.org convention at /llms.txt (curated index) and /llms-full.txt (concatenated Markdown). Configurable post types, max post count, category/tag exclusions, per-domain brand identity. Programmatic override via the rankready_llms_txt_content filter.
Every post is also served as clean Markdown at /post-slug.md with YAML frontmatter, plus Accept: text/markdown negotiation on the canonical URL and a <link rel="alternate" type="text/markdown"> discovery tag.
Reality check on reach: per acceptmarkdown.com's matrix, only ~7 clients actually send Accept: text/markdown (Claude Code, Copilot Chat/CLI, Cursor, Microsoft Copilot, OpenClaw, OpenCode). ChatGPT browse, Claude.ai, Gemini, Grok and Perplexity do not. That's exactly why the distinct .md URLs, the <link rel="alternate"> tag and llms.txt carry the reach — Accept negotiation alone would cover a small minority of traffic.
"Key Takeaways" via OpenAI, Anthropic, Google Gemini or DeepSeek, with Speakable JSON-LD. Unlimited manual generation, no monthly cap, bring your own API key.
Pulls real "People Also Ask" questions for your focus keyword, then your chosen LLM writes the answers. Output is valid FAQPage JSON-LD.
Author Box (photo, bio, headline, topics, credentials, year started) plus Article, Speakable, FAQPage, HowTo and ItemList JSON-LD. E-E-A-T here follows Google's Search Quality Rater Guidelines — we describe what the guidelines ask for, not what any model does internally.
Per-bot allow/block for 29 AI crawlers — GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Google-Extended, GoogleOther, Applebot-Extended, Bingbot, Meta-ExternalAgent, Meta-ExternalFetcher, FacebookBot, MistralAI-User, Bytespider, Amazonbot, cohere-ai, DuckAssistBot, YouBot, PhindBot, CCBot, AI2Bot, Diffbot, Omgilibot, PetalBot, Brightbot, magpie-crawler, DataForSeoBot. Auto-syncs to both the virtual and physical robots.txt, plus Content Signals (ai-train, search, ai-input) per contentsignals.org.
Googlebot and FacebookExternalHit are emitted in their own group that mirrors your site's User-agent: * rules — never folded into the permissive AI group, because a crawler obeys only its most specific matching group (RFC 9309 §2.2.1).
A Model Context Protocol manifest at /.well-known/mcp.json listing what agents can do on your site, plus Google's Open Knowledge Format output at /okf/.
Server note: nginx blocks dotfile paths by default, so
/.well-known/*returns 403 on many hosts (RunCloud, stock openresty). No plugin can override that — it needs a server config change. See Troubleshooting.
Training bots, citation bots, real AI referrals (chatgpt.com, perplexity.ai, claude.ai, gemini.google.com, copilot.microsoft.com) and content freshness. 100% server-side, no third-party scripts. A crawler hit tells you your page was fetched — not that it was quoted.
WP Rocket · LiteSpeed Cache · W3 Total Cache · WP Super Cache · WP Fastest Cache · Breeze · SG Optimizer · Hummingbird · NitroPack · Perfmatters · Cloudflare APO · Nginx FastCGI · BunnyCDN · Varnish/Fastly · Akamai · Pantheon · Kinsta · WP Engine.
Cache-bypass entries are persisted to each cache plugin's stored config so server-level caches honour the bypass before PHP runs. Full header ruleset: docs/CACHE-HEADER-AUDIT.md.
Detects WPML, Polylang, TranslatePress, Weglot and GTranslate, and emits hreflang Link headers for each variant. Per-language llms.txt generation is not yet implemented — only the default language is generated today.
26 live probes that actually fetch every endpoint, check status codes and headers, detect SEO-plugin conflicts, inspect edge-cache HIT/MISS, and list template_redirect callbacks at priority < 5 that could race our handlers. One-click plaintext report for support tickets.
| Plugin | How RankReady coexists |
|---|---|
| Rank Math | Person + Article schema merged via rank_math/json_ld into the existing graph |
| Yoast SEO | Merged via wpseo_schema_graph — no duplicate Person nodes |
| All in One SEO | Merged via aioseo_schema_output |
| SEOPress | Merged via seopress_schemas_single_data |
| SEO Framework · Slim SEO | Coexists; RankReady supplies AI-only fields none of them cover |
RankReady never emits a standalone JSON-LD block when one of those is handling schema. You don't replace your SEO plugin — you add RankReady on top.
- WordPress admin → Plugins → Add New → search "RankReady" → Install → Activate
- Add an AI provider API key (OpenAI, Anthropic, Gemini or DeepSeek) in Settings
- Enable llms.txt, Markdown endpoints and crawler controls in AI Crawlers
- Visit
/llms.txton your site to confirm it's serving
Requires WordPress 6.9+ and PHP 7.4+.
/.well-known/mcp.json returns 403. nginx blocks dotfile paths. The tell: /.well-known/acme-challenge/test returns 404 (allowed) while everything else returns 403 — a location ~ /\. rule with a single Let's Encrypt exception. Fix at the server (^~ must outrank location ~ /\.):
location ^~ /.well-known/ {
allow all;
default_type text/plain;
try_files $uri $uri/ /index.php?$args;
}Cloudflare APO ignores Vary: Accept. APO's cache key is URL + querystring + device type, so negotiation on the canonical URL can't work through it. The plugin detects APO and surfaces the exact Cache Rule to paste. Distinct .md URLs are unaffected — they're different URLs.
Endpoints return the right content under a 404. Fixed in 1.2.1. If you're on an older build with LiteSpeed + Rank Math, upgrade.
git clone https://github.com/eticastudio/rankready.git
cd rankready
php -l rankready.php # no build step — vanilla ES5, no JSX/webpackArchitecture: rankready.php holds a PSR-4-style autoloader (RNRD_Foo → includes/class-rnrd-foo.php). All classes boot on init, then do_action( 'rnrd_loaded' ) fires as the extension point.
Non-negotiables before any PR:
- Backward compatibility is the top rule.
rnrd_*options,_rnrd_*meta keys,rnrd_*hooks,/wp-json/rankready/v1/*routes, blocksave()output and public CSS class names are permanent contracts. Renames go through a ≥2-version dual-write/dual-read cycle. - Copy honesty. Claim crawlability, never citations, rankings or visibility. No fabricated statistics. This grep must return empty:
grep -rnE "[0-9]+×|[0-9]+% more|[0-9]+% of AI|Get cited by|will rank|guaranteed result" includes/*.php assets/*.js readme.txt
- Assert contracts, don't assume them. Every
wp_remote_*+json_decodemust check WP_Error, the HTTP status and the task-level status (DataForSEO returns HTTP 200 on billing failures). Everytemplate_redirecthandler that serves a body must callstatus_header( 200 )on success. (bool) 'off'istrue. Options stored bysanitize_on_offare the strings'on'/'off'— always compare'on' === get_option(...).- Never load admin code on the frontend. Gate admin assets by post type, not by hook — every CPT shares
post.php. - No duplicate schema. Check for Rank Math / Yoast / AIOSEO and merge via their filters.
- Every REST route needs a real permission callback. Never
__return_true.
Release process — WordPress.org goes first, GitHub mirrors after. Never tag a version or publish a GitHub release before that exact version is approved and live on WordPress.org. A GitHub tag for a version WP.org later rejects means users install a non-compliant build via Composer, WP-CLI or Git Updater. Builds are cut with build-release.sh and must pass orbit-wporg-release-gate with zero errors on the extracted zip.
Everything stays on your own site. Your API keys, DataForSEO credentials, generated summaries, FAQs and author profiles live in your own wp_options and wp_postmeta tables. We don't see, collect or transmit your data.
Third-party services are contacted only when you enter credentials and trigger a generation action: OpenAI · Anthropic · Google Gemini · DeepSeek · DataForSEO. Plugin usage data goes to Freemius only if you opt in on activation. Full disclosure in readme.txt.
RankReady is maintained on WordPress.org, which is its canonical home. Install and auto-update from there. This repository is the public source mirror for code review, issues and community contributions; tagged releases here always match the version approved on WordPress.org and are never ahead of it.
| Version | Highlights | Links |
|---|---|---|
| 1.3.0 (current) | Reorganised settings and post-edit metaboxes, in-editor Generate Summary/FAQ, homepage Markdown, AI Snippet defaults, Freemius opt-in | WordPress.org · Release notes |
| 1.1.2 | Google Open Knowledge Format (OKF) bundle at /okf/, auto-synced on publish |
Release notes |
| 1.0.1 | Cache content-negotiation fix, homepage Markdown URL fix, full cache-header audit | Release notes |
- Install or update: WordPress.org → rankready-ai-llm-seo
- Full changelog: WordPress.org Changelog tab
- Report a bug: WordPress.org support forum or GitHub Issues
Requires WordPress 6.9+ and PHP 7.4+. Tested up to WordPress 7.1.
GPL-2.0-or-later. Full text in LICENSE.
Built and maintained by HostMyBlog — an Etica Studio product.