• Resolved mariosem

    (@editor)


    Hello,
    Running the diagnostics tool, I see that the main problems come from template_redirect priority conflicts. Since this conficts are involving many plugins, I think RankReady should adapt itself and its priority, and not asking the user to contact other plugins developers.

    The page I need help with: [log in to see the link]

Viewing 6 replies - 1 through 6 (of 6 total)
  • Plugin Author Aditya Ranjan Sharma

    (@adityaarsharma)

    Hi @editor ,

    Thanks for using RankReady.

    I had a look at your site, and I’m glad to say nothing seems to be conflicting there. Your llms.txt is serving correctly, the Markdown version of your homepage is serving correctly, and both discovery links are in place on your home page.

    The two that come back empty, the full index and WebMCP, are switched off in your settings rather than blocked by anything.

    Sorry for the confusion that warning caused. It flags anything sitting near RankReady on the same WordPress hook whether or not it’s causing trouble, so it ends up showing on almost every site. That’s on us, and we’re reworking it to only speak up when something is genuinely broken, and to stop pointing at other plugins.

    So there’s nothing you need to do here. But if you have seen something actually misbehaving beyond that warning, please tell me what you noticed and I’ll look into it properly.

    Thanks again for flagging it, it’s genuinely useful.

    Thread Starter mariosem

    (@editor)

    Hello,

    Thanks for your reply. The llms.txt actually gave a 404 message. I turned it off, I’m currently using a code snippet and your plugin finds it. Quite strange.

    I think your plugin is very promising, I hope it will be further improved in the next releases.

    Mario

    Plugin Author Aditya Ranjan Sharma

    (@adityaarsharma)

    Hello,

    The file is served through a WordPress rewrite rule rather than a real file on disk, so a few things can make it 404: the rules going stale, permalinks set to Plain, or your host caching the 404 before the rules got refreshed.

    Your site sits behind a page cache, so that last one would explain why it looked permanent.

    I can’t tell which it was from outside. If RankReady is still installed, go to Settings → Advanced → Diagnostics, hit Run Diagnostics, then Copy Diagnostic Report and paste it here.

    That covers all three. Leave your snippet running, it won’t affect the result.

    One heads up before you do: that report lists your plugins and versions, so trim anything you’d rather not have in a public thread.

    Thanks for the patience, and for the kind words.

    Thread Starter mariosem

    (@editor)

    ╔══════════════════════════════════════════════════════════════════════╗
    ║ RankReady Diagnostic Report — Support Bundle ║
    ╚══════════════════════════════════════════════════════════════════════╝

    Generated: 2026-09-23 18:26:25 UTC
    Site URL:
    Plugin: RankReady 1.3.1
    WordPress: 7.1.2
    PHP: 8.4.25 (SAPI: fpm-fcgi)
    MySQL: 11.8.9
    Theme:
    Server: nginx
    Multisite: no
    HTTPS: yes
    Permalinks: /%year%/%monthnum%/%day%/%postname%/
    WP_DEBUG: false WP_DEBUG_LOG: false

    Summary: 11 pass · 1 warn · 3 fail · 8 info

    ═══ PROBE RESULTS ═════════════════════════════════════════════════════════

    ℹ INFO /llms.txt loads
    Toggle is OFF in AI Visibility → LLMs.txt.
    FIX → Enable LLMs.txt to expose your site index to AI engines.

    ℹ INFO /llms-full.txt loads
    Requires LLMs.txt to be enabled (it’s OFF).
    FIX → Enable AI Visibility → LLMs.txt first.

    ✗ FAIL Homepage .md route
    HTTP 200 but Content-Type is text/html; charset=UTF-8 (HTML returned).
    FIX → Theme template is winning. Add ?format=md to URL as a workaround.
    (url: )
    (content_type: text/html; charset=UTF-8)

    ✗ FAIL Post .md route
    HTML returned instead of Markdown.
    FIX → Page builder intercepting. Check template_redirect priority conflicts.
    (url: )
    (content_type: text/html; charset=UTF-8)

    ✓ PASS /robots.txt has RankReady block
    RankReady block present with crawler directives.
    (url: https://…./robots.txt)
    (body_len: 1486)

    ℹ INFO /.well-known/mcp.json loads
    WebMCP toggle is OFF.
    FIX → Enable AI Visibility → WebMCP Manifest to expose 16 abilities to Claude/Cursor/VS Code.

    ✓ PASS Rewrite rules flushed
    107 rewrite rules registered.

    ℹ INFO Webserver detected
    Nginx — Nginx requires server-block configuration (no .htaccess support). RankReady ships an Nginx snippet via the “Server bypass snippet” section below. The standard WP server block “try_files $uri $uri/ /index.php?$args;” rule is required for REST routes.
    (family: nginx)
    (server_software: nginx)
    (recommended_snippet: nginx)

    ✗ FAIL REST API reachable (loopback)
    HTTP 401 from https://xxxxxxxx/wp-json/rankready/v1 — REST API is not routing. Diagnostics + bulk operations + freshness scan will fail until this resolves.
    FIX → Visit Settings → Permalinks → Save (rewrites .htaccess on Apache/LiteSpeed). On Nginx, add the “Server bypass snippet → Nginx” block from below to your server config.
    (url: https://xxxxxxxx/wp-json/rankready/v1)
    (code: 401)

    ✓ PASS Cron firing
    31 events scheduled (WP-Cron). None overdue.

    ✓ PASS Crawler log DB table
    Table exists, 1,892 rows logged.
    (table: wp_3878964_rnrd_crawler_log)
    (rows: 1892)

    ✓ PASS WP Abilities API (6.9+)
    wp_register_ability() is available — MCP uses native registration.

    ✓ PASS Page cache plugin
    Perfmatters — RankReady bypass rules applied

    ℹ INFO Page builder
    No major page builder detected.

    ✓ PASS SEO plugin
    xxxxxx detected. Schema merging active, double meta-robots tag prevented.
    (plugin: xxxxxxx)

    ℹ INFO Cache constants
    WP_CACHE = true; DONOTCACHEPAGE = defined; DISABLE_WP_CRON = false

    ℹ INFO Edge cache HIT scan
    /llms.txt is disabled; skipped.

    ✓ PASS Markdown endpoint (/index.md)
    Markdown is served at the distinct /index.md URL (cache-safe path). Same-URL Accept negotiation is off by default — the canonical homepage correctly returns HTML, so no cache can be poisoned. AI agents discover /index.md via the Link header and llms.txt.
    (content-type: text/markdown; charset=utf-8)

    ⚠ WARN template_redirect priority race
    5 competing hook(s) at priority ≤ 5: priority 0: _wp_admin_bar_init; priority 0: xxxxxxx\Extension\Origin_go; priority 1: xxxxxx_opengraph_meta_tags
    FIX → If /llms.txt or /.well-known/mcp.json returns HTML, ask the conflicting plugin to lower its template_redirect priority below 1. RankReady cannot go any earlier.

    ✓ PASS Brand Identity filled
    All 3 core fields are populated (name, summary, about).

    ✓ PASS PHP version
    PHP 8.4.25

    ✓ PASS WordPress version
    WordPress 7.1.2

    ℹ INFO LLM provider keys
    Not tested — click “Test API keys” to verify reachability (uses 1 API call per provider).

    ═══ WHAT TO FIX FIRST (plain English) ═════════════════════════════════════

    1. Homepage .md route
      What we saw: HTTP 200 but Content-Type is text/html; charset=UTF-8 (HTML returned).
      What to do: Theme template is winning. Add ?format=md to URL as a workaround.
      Why it matters: AI bots request your homepage with Accept: text/markdown. If you return HTML, they parse it inefficiently or skip you.
    2. Post .md route
      What we saw: HTML returned instead of Markdown.
      What to do: Page builder intercepting. Check template_redirect priority conflicts.
      Why it matters: Each post needs a .md route so AI bots can grab clean Markdown instead of parsing your full HTML/JS bundle.
    3. REST API reachable (loopback)
      What we saw: HTTP 401 from https://xxxxxxx/wp-json/rankready/v1 — REST API is not routing. Diagnostics + bulk operations + freshness scan will fail until this resolves.
      What to do: Visit Settings → Permalinks → Save (rewrites .htaccess on Apache/LiteSpeed). On Nginx, add the “Server bypass snippet → Nginx” block from below to your server config.
      Why it matters: See the FIX line above for the action to take.

    ═══ LIVE ENDPOINT RESPONSE HEADERS ════════════════════════════════════════
    (What an AI crawler actually sees when it fetches each URL right now.)

    ── GET /llms.txt ──
    HTTP status: 200
    Body bytes: 19264
    server: cloudflare
    content-type: text/plain; charset=utf-8
    cache-control: public, max-age=3600, s-maxage=300
    cf-cache-status: DYNAMIC
    link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”

    ── GET /llms-full.txt ──
    HTTP status: 404
    Body bytes: 100474
    server: cloudflare
    content-type: text/html; charset=UTF-8
    cache-control: no-cache, must-revalidate, max-age=0, no-store, private
    cf-cache-status: DYNAMIC
    link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
    Body preview: Pagina non trovata | xxxxxxxx <!– Jetpack Site Verification Tag

    ── GET /robots.txt ──
    HTTP status: 200
    Body bytes: 1486
    server: cloudflare
    content-type: text/plain; charset=utf-8
    age: 41
    cf-cache-status: HIT
    link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
    Body preview: User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php User-agent: AhrefsBot User-agent: AhrefsSiteAudit User-agent: barkrowler User-agent: DataForSeoBot User-agent: dotbot User-agent: rogerbot User-agent: S

    ── GET /.well-known/mcp.json ──
    HTTP status: 503
    Body bytes: 30
    server: cloudflare
    content-type: application/json; charset=utf-8
    cache-control: no-cache, must-revalidate, max-age=0, no-store, private
    cf-cache-status: DYNAMIC
    link: ; rel=”alternate”; type=”text/markdown”, ; rel=”describedby”; type=”text/plain”
    Body preview: {“error”:”WebMCP is disabled”}

    ═══ PHYSICAL FILES IN WEBROOT ═════════════════════════════════════════════
    (These trump WordPress rewrite rules. A physical robots.txt wins at the
    webserver level before WP even runs.)
    robots.txt (not present) /wordpress/core/7.1.2/robots.txt
    llms.txt (not present) /wordpress/core/7.1.2/llms.txt
    llms-full.txt (not present) /wordpress/core/7.1.2/llms-full.txt
    .htaccess (not present) /wordpress/core/7.1.2/.htaccess

    ═══ REWRITE RULES MATCHING llms.txt / robots / .md / mcp ══════════════════
    ^(?!wp-admin|wp-content|wp-includes|wp-json)(.+)\… → index.php?rnrd_md_path=$matches[1]
    robots.txt$ → index.php?robots=1

    ═══ HOOKS ON robots_txt FILTER (priority order, lower = earlier) ════════
    priority 10 SEO\RobotsTXT\Main::get_robots_txt
    priority 12 Automattic\Jetpack\Jetpack_Mu_Wpcom\Blog_Privacy\robots_txt
    priority 9223372036854775807 RNRD_Robots::add_to_robots_txt

    ═══ HOOKS ON template_redirect (early priorities only — these race for /llms.txt etc.) ═
    ⚠ priority 1 xxxxxx_opengraph_meta_tags
    ⚠ priority 1 Automattic\Jetpack\Stats\Main::template_redirect
    ⚠ priority 1 wpcom_handle_post_like_from_email
    ✓ priority 1 RNRD_Llms_Txt::handle_request
    ✓ priority 1 RNRD_Markdown::handle_request
    ✓ priority 1 RNRD_MCP::handle_request
    ⚠ priority 1 Closure@20-llms-txt.php:140
    ⚠ priority 2 Closure@atomic-platform-virtual-patches.php:28267
    ✓ priority 2 RNRD_Markdown::handle_accept_header

    Legend: ✓ = RankReady (expected), ⚠ = other plugin/theme racing us

    ═══ SEO PLUGIN ACTUAL CONFIG (what RankReady defers to vs. takes over) ════
    xxxxxxx
    • schema_enabled managed by (default ON when active)

    ═══ CACHE PLUGIN EXCLUSION STATUS ═════════════════════════════════════════
    xxxxxx unknown — RankReady applies exclusion filters but cache plugin doesn’t expose verification API

    ═══════════════════ End Diagnostic Report ═══════════════════

    Here it is. Please consider I’m on a wordpress.com Business Plan, with their own edge cache. I’m also on Cloudflare

    Plugin Author Aditya Ranjan Sharma

    (@adityaarsharma)

    Thanks @editor, that report clears it up.

    The llms.txt / llms-full.txt 404s as RankReady’s own llms.txt output is turned off on this setup, and the snippet is answering instead, so there’s nothing to fix there.

    The real findings are the two FAILs around the homepage and post .md routes returning HTML. From what I understand, this isn’t a RankReady bug.

    The site is on WordPress.com Business behind Cloudflare, and Cloudflare doesn’t vary its cache by the Accept header by design. So same-URL content negotiation can’t reliably work in this setup.

    The good news is that it isn’t actually needed here. The report shows that /index.md is already passing with the correct Markdown content and content type. That’s the distinct, cache-safe URL RankReady points AI crawlers to through the Link header on every page, so it looks like the setup is already working as intended.

    The REST 401 and priority warning also appear to be the same cosmetic issues mentioned earlier.

    Thread Starter mariosem

    (@editor)

    Good news, then, thanks!

Viewing 6 replies - 1 through 6 (of 6 total)

You must be logged in to reply to this topic.