
AI-Only Pages gives you granular control over which search engine bots can index each page on your WordPress site — while simultaneously making those pages more discoverable and useful for AI crawlers like ChatGPT, Claude, and Perplexity.
The core idea: you have content that is perfect for AI training pipelines and retrieval-augmented generation (RAG) systems, but you do not want that content competing for rankings in Google, Bing, or Yahoo.
AI-Only Pages lets you mark those pages as AI-only: they disappear from traditional search engine indexes while becoming first-class citizens in the AI ecosystem.
<meta> tags and HTTP headers — Both <meta name="googlebot" content="noindex, nofollow"> HTML meta tags and X-Robots-Tag HTTP headers are emitted, covering all crawling contexts. Works correctly on all public post types including Pages and custom post types.<meta name="robots"> tag on AI-only pages so there is no conflict between the global tag and your per-bot tags./llms-index.txt — A plain-text AI discovery file served at yoursite.com/llms-index.txt listing all AI-only pages with their titles and last-modified dates. AI crawlers can use this file to find your AI-optimised content directly. Can be toggled on/off from the settings page.A full settings page is available under AI-Only Pages in the WordPress admin sidebar. It provides:
Section 1 — Instructions & Status: A “How It Works” guide covering the meta box, Token Diet, and LLM Index. A live, clickable URL to your /llms-index.txt file with a green/red status indicator showing whether the index is active.
Section 2 — LLM Index Settings: A toggle to enable or disable /llms-index.txt globally. When disabled, the endpoint returns a 404.
Section 3 — Token Diet Master Control: A master toggle to enable or disable Token Diet entirely. When off, AI bots receive raw, full HTML — identical to what human visitors see.
Section 4 — Granular Token Diet Stripping: Individual toggles for each category of content stripped:
<style> tags and embedded CSS<svg> elements (major token bloaters)<iframe> elements (maps, embeds, social widgets)<form> elements (Warning: removes WooCommerce Add to Cart buttons)<script> tags (Note: application/ld+json schema is always preserved)Googlebot (Web), Googlebot-Image, Googlebot-News, Googlebot-Video, AdsBot-Google, Bingbot, Slurp (Yahoo), DuckDuckBot, Baiduspider, YandexBot.
GPTBot, ChatGPT-User, ClaudeBot, PerplexityBot, YouBot, Meta-ExternalAgent, Amazonbot, Bytespider, Diffbot, cohere-ai, anthropic-ai, AI2Bot, OAI-SearchBot, and more. These bots are detected automatically and served cleaned content when they visit an AI-only page.
Every major behaviour is extensible via WordPress filters. See the Developer Reference section below. The Settings class hooks into filters at priority 5, leaving priorities 10 and above free for developer overrides — so your custom add_filter() calls always win.
yoursite.com/llms-index.txt to confirm your page appears in the AI content index.Note: The master toggle requires JavaScript. The individual checkboxes always work regardless of JS state.
/llms-index.txt URL is live.All filters are applied inside AIOnly\Pages\Plugin. The Settings class hooks at priority 5; standard developer priority is 10+.
aionly_ai_crawler_signatures
Array of User-Agent substrings used for Layer 1 bot detection.
@param string[] $signatures
@return string[]
aionly_strip_selectors
CSS-style selector strings passed to Pass 1 of Token Diet (structural removal). Supports element tag, #id, and .class (one class, no combinators).
@param string[] $selectors
@return string[]
aionly_strip_token_bloat_tags
XPath query strings passed to Pass 2 of Token Diet (tag removal).
@param string[] $queries
@return string[]
aionly_allowed_attributes
HTML attribute names kept on every element by Pass 3 of Token Diet. Everything else is stripped.
@param string[] $attributes
@return string[]
aionly_should_clean_output
Boolean. Return false to disable Token Diet entirely for a specific post.
@param bool $enabled Default: true.
@param \WP_Post $post
@return bool
aionly_enable_xrobots_headers
Boolean. Return false to suppress X-Robots-Tag HTTP headers.
@param bool $enabled Default: true.
@param \WP_Post $post
@return bool
aionly_cache_ttl
Filter the transient TTL in seconds.
@param int $ttl Default: 600 (10 minutes).
@return int
aionly_llms_index_lines
Filter the array of text lines that make up llms-index.txt before output.
@param string[] $lines Array of lines (including comment lines).
@param int[] $active_ids Post IDs included in the index.
@return string[]
aionly_supported_post_types
Array of public post type slugs the plugin should support.
@param string[] $post_types
@return string[]
aionly_use_heuristic_bot_detection
Boolean. Return false to disable Layer 2 heuristic bot detection.
@param bool $enabled Default: true.
@return bool
Disable heuristic bot detection (uptime monitors):
add_filter( 'aionly_use_heuristic_bot_detection', '__return_false' );
Preserve WooCommerce forms (developer override — wins over settings page):
add_filter( 'aionly_strip_token_bloat_tags', function( $queries ) {
return array_filter( $queries, function( $q ) {
return $q !== '//form';
} );
} );
Add a custom strip selector:
add_filter( 'aionly_strip_selectors', function( $selectors ) {
$selectors[] = '.advertisement';
$selectors[] = '#newsletter-popup';
return $selectors;
} );
Keep class attributes in AI output:
add_filter( 'aionly_allowed_attributes', function( $attrs ) {
$attrs[] = 'class';
return $attrs;
} );
Add a custom AI crawler signature:
add_filter( 'aionly_ai_crawler_signatures', function( $sigs ) {
$sigs[] = 'FutureBot';
return $sigs;
} );
Restrict to specific post types:
add_filter( 'aionly_supported_post_types', function( $types ) {
return [ 'post', 'page' ]; // Only posts and pages.
} );
Disable Token Diet on a specific post (always wins, priority 10 > settings priority 5):
add_filter( 'aionly_should_clean_output', function( $enabled, $post ) {
if ( 42 === $post->ID ) {
return false; // Post 42 serves full HTML to AI bots.
}
return $enabled;
}, 10, 2 );
Read a single setting value in custom code:
$token_diet_on = '1' === \AIOnly\Pages\Settings::get( 'token_diet_enabled' );
$all_settings = \AIOnly\Pages\Settings::get_settings(); // Full array.