Skyboot AI Markdown Developer Hooks

Skyboot AI Markdown has 14 WordPress filters for changing how Markdown, llms.txt, product facts, content types and AI analytics behave. Add them in a small custom plugin or your child theme’s functions.php. The callbacks run on every request that uses the feature, so keep them fast. New to filters? Read the WordPress filters handbook.

Markdown and llms.txt #

skyboot_ai_md_is_markdown_request #

Decide whether the current request is answered with Markdown.

// Never serve Markdown for /checkout-preview/.
add_filter( 'skyboot_ai_md_is_markdown_request', function ( $wants ) {
	$uri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
	return false !== strpos( $uri, '/checkout-preview/' ) ? false : $wants;
} );

skyboot_ai_md_llms_exclude_post #

Exclude a post from llms.txt, llms-full.txt, IndexNow and the readiness audit. Also use it to support an SEO plugin that is not built in.

add_filter( 'skyboot_ai_md_llms_exclude_post', function ( $exclude, WP_Post $post ) {
	return $exclude || has_term( 'internal', 'category', $post );
}, 10, 2 );

skyboot_ai_md_meta_description #

Change the description used in the Markdown front matter and llms.txt.

add_filter( 'skyboot_ai_md_meta_description', function ( $desc, WP_Post $post ) {
	return '' !== $desc ? $desc : get_post_meta( $post->ID, 'my_summary', true );
}, 10, 2 );

skyboot_ai_md_max_list_items #

The maximum number of items listed on archive Markdown pages. Default 100.

add_filter( 'skyboot_ai_md_max_list_items', function () {
	return 50;
} );

skyboot_ai_md_noise_shortcodes #

Shortcodes removed completely from Markdown pages (page chrome, not content). By default this covers the breadcrumb shortcodes of Rank Math, Yoast, AIOSEO, SEOPress and Slim SEO.

add_filter( 'skyboot_ai_md_noise_shortcodes', function ( $tags ) {
	$tags[] = 'social_share_buttons';
	return $tags;
} );

Content types #

skyboot_ai_md_content_post_types #

The post types treated as real content by the readiness scan, IndexNow, llms.txt and Markdown. By default: public, searchable post types without builder templates (Elementor templates and floating buttons, Divi layouts, Bricks and Oxygen templates and others), minus the types unticked under AI Visibility > Settings > Content types. The filter runs after that setting.

add_filter( 'skyboot_ai_md_content_post_types', function ( $types ) {
	return array_diff( $types, array( 'portfolio' ) );
} );

E-commerce #

skyboot_ai_md_commerce_platforms #

The detected store plugins. Each entry has label, post_type and taxonomies. Use it to add a store plugin that is not supported yet.

add_filter( 'skyboot_ai_md_commerce_platforms', function ( $platforms ) {
	$platforms['mystore'] = array( 'label' => 'My Store', 'post_type' => 'my_product', 'taxonomies' => array( 'my_product_cat' ) );
	return $platforms;
} );

skyboot_ai_md_product_facts #

The product facts used in Markdown, llms.txt and the readiness audit. Keys: price, price_min, price_max, regular_price, on_sale, currency, availability (a schema.org word such as InStock), availability_label, sku, gtin, brand, rating, review_count, attributes (name => value), categories, short_description and type.

add_filter( 'skyboot_ai_md_product_facts', function ( $facts, WP_Post $post ) {
	if ( '' === $facts['brand'] ) {
		$facts['brand'] = get_post_meta( $post->ID, '_my_brand', true );
	}
	return $facts;
}, 10, 2 );

Citation Readiness #

skyboot_ai_md_audit_post_types #

The post types that get a readiness score. Default: the content post types above.

add_filter( 'skyboot_ai_md_audit_post_types', function ( $types ) {
	return array_diff( $types, array( 'landing_page' ) );
} );

AI analytics #

skyboot_ai_md_ai_bots #

The AI crawler list, keyed by user-agent token. Each entry has owner, category (user, search, index or training) and product.

add_filter( 'skyboot_ai_md_ai_bots', function ( $bots ) {
	$bots['NewAIBot'] = array( 'owner' => 'Example AI', 'category' => 'search', 'product' => 'Example Search' );
	return $bots;
} );

skyboot_ai_md_ai_referrers #

AI assistants that send visitors, as referrer host suffix => assistant name.

add_filter( 'skyboot_ai_md_ai_referrers', function ( $refs ) {
	$refs['chat.example.ai'] = 'Example AI';
	return $refs;
} );

skyboot_ai_md_bot_ip_sources #

The official crawler IP range lists used for verification, as token => array of URLs. Each URL may return JSON or plain text with CIDR ranges.

add_filter( 'skyboot_ai_md_bot_ip_sources', function ( $sources ) {
	$sources['NewAIBot'] = array( 'https://example.ai/crawler-ips.json' );
	return $sources;
} );

skyboot_ai_md_bot_dns_rules #

Reverse-DNS host suffixes for crawlers verified by DNS, as token => array of suffixes.

add_filter( 'skyboot_ai_md_bot_dns_rules', function ( $rules ) {
	$rules['NewAIBot'] = array( '.crawl.example.ai' );
	return $rules;
} );

skyboot_ai_md_client_ip #

The detected visitor IP. Behind Cloudflare the plugin already uses CF-Connecting-IP. For other reverse proxies, return the real client IP, and only trust the header when the request comes from your proxy.

add_filter( 'skyboot_ai_md_client_ip', function ( $ip ) {
	if ( '10.0.0.5' === $ip && ! empty( $_SERVER['HTTP_X_REAL_IP'] ) ) {
		return sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_REAL_IP'] ) );
	}
	return $ip;
} );

skyboot_ai_md_referral_daily_cap #

The maximum number of AI visitor records accepted per day, site-wide. Default 20000.

add_filter( 'skyboot_ai_md_referral_daily_cap', function () {
	return 50000;
} );

Capabilities #

Each permission under AI Markdown > Permissions is a capability, so you can check it with current_user_can(). See Permissions for the full list.

Shortcode #

[skyboot_ai_markdown_link text="Read as Markdown"]

Prints a link to the current post’s Markdown version.

FAQ #

How do I exclude a post from llms.txt with code? #

Use the skyboot_ai_md_llms_exclude_post filter and return true for the posts to leave out. The same filter removes them from llms-full.txt, IndexNow and the readiness audit.

How do I remove a custom post type from llms.txt? #

Untick it under AI Visibility > Settings > Content types, or remove it in code with the skyboot_ai_md_content_post_types filter.

How do I add a new AI crawler to the analytics? #

Add its user-agent token with skyboot_ai_md_ai_bots. If the vendor publishes an IP list, add it with skyboot_ai_md_bot_ip_sources so visits can be verified. Otherwise, add reverse-DNS suffixes with skyboot_ai_md_bot_dns_rules.

My site is behind a reverse proxy. How do I get the real visitor IP? #

Return the real client IP from the skyboot_ai_md_client_ip filter, and only trust the forwarded header when the request comes from your proxy’s address. Cloudflare is handled automatically.

Updated on October 24, 2026

What are your feelings

  • Happy
  • Normal
  • Sad