Reference

RankReady hooks and filters for developers

The four verified RankReady extension points, what each one does, and a working code example for every one.

Last updated August 24, 2026

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.