---
title: "RankReady hooks and filters for developers"
url: https://hostmy.blog/docs/rankready/hooks-and-filters/
date: 2026-08-24
modified: 2026-08-24
lang: en
author: "Aditya Sharma"
description: "The four verified RankReady extension points, what each one does, and a working code example for every one."
word_count: 727
---

# RankReady hooks and filters for developers

RankReady exposes four documented extension points. This page covers all four, with a short example for each. If a hook is not on this page, treat it as private: it may change without notice.

Put the snippets below in your child theme's `functions.php` or, better, in a small site-specific plugin so they survive a theme change.

## Summary table

| Name | Type | Purpose |
| ---- | ---- | ------- |
| `rankready_llms_txt_content` | Filter | Override or edit the generated `/llms.txt` body. |
| `rankready_force_llms_txt` | Filter | Force RankReady to serve `/llms.txt` even when another SEO plugin's module is active. |
| `rnrd_is_pro` | Filter | A boolean gate other code can read. |
| `rnrd_loaded` | Action | Fires once RankReady has loaded, giving add-on code a safe boot point. |

## rankready_llms_txt_content

This filter hands you the generated body of `/llms.txt` before it is sent. Return it modified, or return something else entirely. Use it when you need a section the admin screens do not produce, or when you want to generate the file yourself and keep RankReady only as the routing layer.

### Append a section

`add_filter( 'rankready_llms_txt_content', function ( $content ) {
$extra = "## Company";
$extra .= "- Support: https://example.com/support";
$extra .= "- Status: https://status.example.com";

return $content . $extra;
} );`

### Replace the body entirely

```
add_filter( 'rankready_llms_txt_content', function ( $content ) {
$custom = get_option( 'my_handwritten_llms_txt' );

return $custom ? $custom : $content;
} );
```

Two things to keep in mind. First, you are responsible for what you return: RankReady does not re-validate a body you replaced. Second, whatever you return is what gets an ETag, so a body that changes on every request defeats the 304 response that `/llms.txt` would otherwise send.

## rankready_force_llms_txt

Some SEO plugins ship their own llms.txt module. When RankReady detects one, it stands down rather than fighting over the same URL. This filter overrides that decision and tells RankReady to serve the file anyway.

`add_filter( 'rankready_force_llms_txt', '__return_true' );`

Use it when you have deliberately chosen RankReady's output over the other plugin's and you do not want to disable the other plugin's module. Only one of the two can win the URL, so decide which one you want and be consistent. If you would rather the other plugin served the file, leave this filter alone and turn RankReady's llms.txt off under AI Visibility instead.

You can also gate it, for example while you compare the two outputs on a staging site:

`add_filter( 'rankready_force_llms_txt', function ( $force ) {
return defined( 'WP_ENVIRONMENT_TYPE' ) && 'staging' === WP_ENVIRONMENT_TYPE;
} );`

## rnrd_is_pro

A boolean filter that other code can read as a gate. It is a single value with no side effects of its own, and the plugin's own behaviour is unchanged by reading it.

`// Set it.
add_filter( 'rnrd_is_pro', '__return_true' );

// Read it.
$gate = apply_filters( 'rnrd_is_pro', false );`

If you are writing companion code that needs its own switch, prefer your own option or constant. Reuse this filter only when you specifically need the value RankReady already carries.

## rnrd_loaded

An action that fires once RankReady has finished loading. This is the safe point at which to run code that depends on RankReady being present. Hooking earlier risks running before the plugin exists; hooking here means you never have to guess at plugin load order.

`add_action( 'rnrd_loaded', function () {
// RankReady is loaded. Safe to register your own additions here.
add_filter( 'rankready_llms_txt_content', 'my_llms_txt_additions' );
} );`

Because `rnrd_loaded` only fires when RankReady is active, an add-on that does all its work inside this action is inert when the plugin is deactivated. That is usually what you want: no fatal errors, no orphaned filters, nothing to clean up.

## Practical notes

- **Do not hook what is not listed.** These four are the documented surface. Anything else you find by reading the source is internal.
- **Return the right type.** The two `rankready_*` filters expect a string and a boolean respectively. Returning the wrong type gives you output you did not intend.
- **Test the endpoint, not the code.** After changing a filter, fetch the URL and read what actually came back. `curl https://example.com/llms.txt` is the check that matters.
- **Watch your caches.** If a page cache or CDN sits in front of the site, clear it after changing filter output, otherwise you will be reading a stored copy of the old body.

These hooks change what RankReady publishes. They do not change what any AI system does with it. Publishing a file makes your content readable. Whether it is fetched, and what happens after, is outside the plugin's control.