---
title: Skyboot AI Markdown Developer Hooks
description: "Every Skyboot AI Markdown filter with examples: Markdown requests, llms.txt exclusions, content types, product facts, AI crawler lists and IP verification."
url: "https://skybootstrap.com/docs/skyboot-ai-markdown/developer-hooks/"
canonical_url: "https://skybootstrap.com/docs/skyboot-ai-markdown/developer-hooks/"
date: "2026-10-24T21:01:57+06:00"
modified: "2026-10-24T21:01:57+06:00"
author: Skybootstrap Team
type: article
site: SkyBootstrap
language: en-US
---

# 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](https://developer.wordpress.org/plugins/hooks/filters/).

## 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](https://skybootstrap.com/docs/skyboot-ai-markdown/permissions/#how-can-developers-check-a-permission) 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.