<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniil Lutsiuk</title>
    <description>The latest articles on DEV Community by Daniil Lutsiuk (@lutsiukdaniildesign).</description>
    <link>https://dev.to/lutsiukdaniildesign</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134424%2Fae32986c-d3d5-4bc9-b48a-659fe9f64a41.png</url>
      <title>DEV Community: Daniil Lutsiuk</title>
      <link>https://dev.to/lutsiukdaniildesign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lutsiukdaniildesign"/>
    <language>en</language>
    <item>
      <title>Yoast and All in One SEO store a GPTBot switch their free code never reads</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Mon, 21 Sep 2026 14:29:30 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/yoast-and-all-in-one-seo-store-a-gptbot-switch-their-free-code-never-reads-5g37</link>
      <guid>https://dev.to/lutsiukdaniildesign/yoast-and-all-in-one-seo-store-a-gptbot-switch-their-free-code-never-reads-5g37</guid>
      <description>&lt;p&gt;Of five free WordPress SEO plugins checked on September 21, 2026, one writes robots.txt rules that block AI crawlers. Two of the largest, Yoast SEO and All in One SEO, store a GPTBot setting in their free builds, and no code in those builds reads it. Rank Math and SEOPress contain no AI crawler names at all.&lt;/p&gt;

&lt;p&gt;Disclosure: the author develops Prime SEO, the fifth plugin in this comparison. Every claim below comes from the free packages downloaded from the WordPress.org plugin directory, searched for crawler names and for the code that acts on each setting; file paths are given so that anyone can repeat the check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yoast SEO free stores three switches it never reads
&lt;/h2&gt;

&lt;p&gt;Yoast SEO, active on 10 million sites according to the directory, defines three options in &lt;code&gt;inc/options/class-wpseo-option-wpseo.php&lt;/code&gt;: &lt;code&gt;deny_gptbot_crawling&lt;/code&gt;, &lt;code&gt;deny_ccbot_crawling&lt;/code&gt; and &lt;code&gt;deny_google_extended_crawling&lt;/code&gt;. All default to false. The settings screen even carries the label "Prevent OpenAI GPTBot from crawling" under Crawl optimization.&lt;/p&gt;

&lt;p&gt;What the free build lacks is a reader. Its robots.txt code, &lt;code&gt;src/integrations/front-end/robots-txt-integration.php&lt;/code&gt;, checks three neighbouring options, among them internal search and Google AdsBot, and stops there. In the settings script the GPTBot toggle receives &lt;code&gt;isDummy&lt;/code&gt; whenever the site's &lt;code&gt;isPremium&lt;/code&gt; preference is false, and the same component loads a link named &lt;code&gt;block-unwanted-bots-upsell&lt;/code&gt;. A free user sees the switch as a preview of Premium.&lt;/p&gt;

&lt;h2&gt;
  
  
  All in One SEO Lite follows the same pattern
&lt;/h2&gt;

&lt;p&gt;All in One SEO, installed on 2 million sites, declares an &lt;code&gt;unwantedBots&lt;/code&gt; group in &lt;code&gt;app/Common/Options/Options.php&lt;/code&gt; with &lt;code&gt;openAiGptBot&lt;/code&gt; and &lt;code&gt;commonCrawlCcBot&lt;/code&gt; next to a Google AdsBot entry. Across the Lite package those names appear in two option files and nowhere else. The only other code that touches the group resets or exports it.&lt;/p&gt;

&lt;p&gt;The Lite download ships the &lt;code&gt;app/Common&lt;/code&gt; and &lt;code&gt;app/Lite&lt;/code&gt; folders. No file in either one turns the setting into a robots.txt line, which places the working part in the paid tiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rank Math and SEOPress free have no AI crawler code
&lt;/h2&gt;

&lt;p&gt;A search of Rank Math (4 million active installs) for 14 crawler names, from GPTBot to Amazonbot, returns nothing outside a bundled user agent library. SEOPress returns nothing at all. Rank Math free generates an llms.txt file, and SEOPress keeps that feature for its PRO version.&lt;/p&gt;

&lt;p&gt;SEOPress PRO, a paid product, goes further: the 9.5 copy checked for this article offers a robots.txt template with rules for CCBot, GPTBot, Google-Extended and ClaudeBot. None of the four free builds logs visits from AI crawlers. Each package reads the visitor's user agent in at most one file, and no crawler name appears in any of them.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free version&lt;/th&gt;
&lt;th&gt;Checked&lt;/th&gt;
&lt;th&gt;Writes AI crawler rules to robots.txt&lt;/th&gt;
&lt;th&gt;llms.txt&lt;/th&gt;
&lt;th&gt;Logs AI crawler visits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yoast SEO&lt;/td&gt;
&lt;td&gt;28.5&lt;/td&gt;
&lt;td&gt;No (setting stored, not read)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rank Math&lt;/td&gt;
&lt;td&gt;1.0.278&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All in One SEO&lt;/td&gt;
&lt;td&gt;5.0.1.1&lt;/td&gt;
&lt;td&gt;No (setting stored, not read)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEOPress&lt;/td&gt;
&lt;td&gt;10.2&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No (PRO)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prime SEO&lt;/td&gt;
&lt;td&gt;1.2.0&lt;/td&gt;
&lt;td&gt;Yes, 15 crawlers&lt;/td&gt;
&lt;td&gt;Yes, plus llms-full.txt&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Three lines of robots.txt need no plugin
&lt;/h2&gt;

&lt;p&gt;Blocking a crawler does not require any of the five. OpenAI's &lt;a href="https://developers.openai.com/api/docs/bots" rel="noopener noreferrer"&gt;crawler documentation&lt;/a&gt; says "GPTBot is used to make our generative AI foundation models more useful and safe" and accepts an ordinary robots.txt rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same two lines work for ClaudeBot or for Google-Extended, the token that, in Google's words, "does not impact a site's inclusion in Google Search." On WordPress the catch is practical. The default robots.txt is virtual, many hosts offer no file access, and a list of 15 names kept by hand goes stale as vendors rename their agents.&lt;/p&gt;

&lt;p&gt;Few site owners bother either way. Among the robots.txt files that Cloudflare could read on top domains, GPTBot was the most refused AI agent and was still, João Tomé of Cloudflare wrote in &lt;a href="https://blog.cloudflare.com/from-googlebot-to-gptbot-whos-crawling-your-site-in-2025/" rel="noopener noreferrer"&gt;a July 2025 study&lt;/a&gt;, "disallowed by 312 domains" only. A rule also binds nobody: agents that fetch a page for a live user, ChatGPT-User and Perplexity-User among them, are documented by their vendors as outside robots.txt, a point covered in the &lt;a href="https://prime-seo-plugin.com/blog/ai-crawlers-wordpress-logs/" rel="noopener noreferrer"&gt;guide to AI crawlers in WordPress logs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prime SEO 1.2.0 writes rules for 15 crawlers
&lt;/h2&gt;

&lt;p&gt;Prime SEO puts the feature in its free version. The AI Bots Manager lists 15 crawlers with a switch each, plus three presets (allow all, block training crawlers only, block all). Matching robots.txt lines are appended to the virtual file, and a separate screen logs which AI agents visited and which page they opened.&lt;/p&gt;

&lt;p&gt;Its weak side is plain. Prime SEO has 100+ active installs against Yoast's 10 million and a record that starts in January 2026. Two of the names on its list (anthropic-ai and Claude-Web) are ones Anthropic no longer documents. Those two rules block nothing today.&lt;/p&gt;

&lt;p&gt;A site that needs one blocked crawler and nothing else is served as well by the three-line rule above (no plugin, no updates to follow). For the rest of the setup, see the &lt;a href="https://prime-seo-plugin.com/llms-txt-wordpress-plugin/" rel="noopener noreferrer"&gt;llms.txt plugin for WordPress&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The option keys are already in place
&lt;/h2&gt;

&lt;p&gt;Yoast and All in One SEO would need little work to change this table, because the settings exist and only the reader is missing from their free code. If either one moves the switch out of the paid tier, free AI crawler control stops being a reason to choose a smaller plugin. Until then the comparison stands at one in five.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://prime-seo-plugin.com/blog/block-ai-crawlers-wordpress-plugins-compared/" rel="noopener noreferrer"&gt;Prime SEO blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>ai</category>
      <category>php</category>
    </item>
    <item>
      <title>3,590 downloads, 100 active installs: what I changed in my WordPress plugin today</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Mon, 21 Sep 2026 09:42:05 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/3590-downloads-100-active-installs-what-i-changed-in-my-wordpress-plugin-today-343l</link>
      <guid>https://dev.to/lutsiukdaniildesign/3590-downloads-100-active-installs-what-i-changed-in-my-wordpress-plugin-today-343l</guid>
      <description>&lt;p&gt;Prime SEO, the WordPress plugin I've been building since January, has 3,590 downloads on WordPress.org as of September 21, 2026.&lt;/p&gt;

&lt;p&gt;The same API reports 100+ active installs. WordPress.org rounds that figure down, so the real number sits between 100 and 199, and at most one download in eighteen became a site that kept the plugin.&lt;/p&gt;

&lt;p&gt;I don't know yet why people leave. Version 1.1.9 added a deactivation survey yesterday (it sends nothing unless the user presses Submit, and never the site address), and the only two answers in it so far are my own tests. What I can look at today is the first-run path, and the hole in it is easy to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ten menu items and no next step
&lt;/h2&gt;

&lt;p&gt;A new install opened a setup wizard with three questions: homepage title, modules, robots.txt. After that the user landed on a dashboard next to ten menu items. The wizard itself ended on a green tick and three links, and nothing on either screen said which of the ten pages mattered first.&lt;/p&gt;

&lt;p&gt;All in One SEO 5.0.1.1 handles this with a setup checklist. In its free build the file is &lt;code&gt;app/Common/SeoChecklist/SeoChecklist.php&lt;/code&gt;: every step has a priority and a time estimate, a callback decides whether the step is complete, and the names of completed steps are appended to a stored list. I borrowed that shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of steps
&lt;/h2&gt;

&lt;p&gt;Version 1.2.0 went out today with a checklist on the dashboard. Nothing in it is ticked by hand.&lt;/p&gt;

&lt;p&gt;In the All in One SEO code a completed step is stored by name and reopens only in a few coded cases: indexing gets switched off, Search Console is disconnected, the user unticks it by hand. I wanted every step that depends on a setting to follow that setting, because a bar that says 9 of 9 while the sitemap is off tells the user nothing. My steps come in two kinds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// live: follows a setting. Switch the sitemap off and the step opens again.&lt;/span&gt;
&lt;span class="s1"&gt;'completed'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'module_sitemap'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="c1"&gt;// sticky: a one-time event. Once done, stays done.&lt;/span&gt;
&lt;span class="s1"&gt;'completed'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;get_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'prime_seo_wizard_complete'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Live steps cover settings such as the sitemap and the AI bot policy (the &lt;code&gt;$module()&lt;/code&gt; helper treats a missing key as on, because modules are enabled by default). Any of them can reopen. Sticky ones cover events, such as a finished wizard or the day one post reached a score of 80. The wizard's last page now shows the same list, with the steps it has just completed on the left.&lt;/p&gt;

&lt;h2&gt;
  
  
  The step nobody could complete
&lt;/h2&gt;

&lt;p&gt;That bug was mine alone. My first version of the IndexNow step looked for the API key inside the plugin's settings array. That key lives in a separate option, &lt;code&gt;prime_seo_indexnow_key&lt;/code&gt;, and is generated on first use. The step stayed open forever, and I noticed only because my test site sat at 9 of 10 after I had done everything on the list.&lt;/p&gt;

&lt;p&gt;Fixing it exposed a second problem. Since 1.1.6 the plugin deliberately sends nothing to IndexNow from local, development and hidden sites, which made the step impossible to finish on exactly those sites. It's now offered to public sites only, so a local install counts nine steps and a live one counts ten (eleven when another SEO plugin left data to import). Both counts are honest now.&lt;/p&gt;

&lt;p&gt;If the survey answers come back as "too complicated", the checklist was the right first move. If they say "feature X is missing", I spent a day on the wrong problem, and the next entry will be about X.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm the developer of &lt;a href="https://wordpress.org/plugins/prime-seo/" rel="noopener noreferrer"&gt;Prime SEO&lt;/a&gt;, a free SEO plugin for WordPress. Entry one of a build log; the numbers come from the public WordPress.org API.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>buildinpublic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI crawlers in WordPress logs: GPTBot shows up, Google-Extended never does</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Mon, 21 Sep 2026 08:10:01 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/ai-crawlers-in-wordpress-logs-gptbot-shows-up-google-extended-never-does-38n6</link>
      <guid>https://dev.to/lutsiukdaniildesign/ai-crawlers-in-wordpress-logs-gptbot-shows-up-google-extended-never-does-38n6</guid>
      <description>&lt;p&gt;Google-Extended and Applebot-Extended, two of the names that robots.txt guides list most often for AI, cannot appear in a WordPress access log. Neither one sends a request. Google's &lt;a href="https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers" rel="noopener noreferrer"&gt;crawler documentation&lt;/a&gt; states that Google-Extended "doesn't have a separate HTTP request user agent string." The second name gets even less: "Applebot-Extended does not crawl webpages," &lt;a href="https://support.apple.com/en-us/119829" rel="noopener noreferrer"&gt;Apple's support page for Applebot&lt;/a&gt; reads, which leaves both names as robots.txt tokens rather than visitors and means that a log of AI crawlers in WordPress has to be built from the agents that send requests.&lt;/p&gt;

&lt;p&gt;Disclosure: the author develops Prime SEO, a WordPress plugin that includes such a log. Every user agent below was checked against vendor documentation on September 21, 2026, and the code runs without any plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three vendors document nine user agents
&lt;/h2&gt;

&lt;p&gt;OpenAI lists four agents on its &lt;a href="https://developers.openai.com/api/docs/bots" rel="noopener noreferrer"&gt;crawler page&lt;/a&gt;. GPTBot gathers training material (the page says it exists "to make our generative AI foundation models more useful and safe"), while OAI-SearchBot builds the index behind ChatGPT search. ChatGPT-User fetches a page when a person asks for it. OAI-AdsBot checks pages submitted as ads.&lt;/p&gt;

&lt;p&gt;Anthropic &lt;a href="https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler" rel="noopener noreferrer"&gt;documents three&lt;/a&gt;, split the same way: ClaudeBot collects training data, while Claude-User and Claude-SearchBot serve live questions and search. Perplexity runs two.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User agent substring&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Purpose, per the vendor&lt;/th&gt;
&lt;th&gt;robots.txt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPTBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Model training&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OAI-SearchBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;ChatGPT search index&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ChatGPT-User&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Fetch started by a user&lt;/td&gt;
&lt;td&gt;"may not apply"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OAI-AdsBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Safety check of pages submitted as ads&lt;/td&gt;
&lt;td&gt;Not stated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ClaudeBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Model training&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Claude-User&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Fetch started by a user&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Claude-SearchBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Search quality&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PerplexityBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;Perplexity search results&lt;/td&gt;
&lt;td&gt;Honored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Perplexity-User&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;Fetch started by a user&lt;/td&gt;
&lt;td&gt;"generally ignores"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Missing from Anthropic's page are anthropic-ai and Claude-Web, two names that still circulate in robots.txt templates. A rule aimed at them blocks nothing the vendor admits to sending.&lt;/p&gt;

&lt;h2&gt;
  
  
  User-triggered fetchers sit outside robots.txt
&lt;/h2&gt;

&lt;p&gt;Crawlers that build an index obey robots.txt, by the vendors' own account. Anthropic's help page says its bots "respect 'do not crawl' signals by honoring industry standard directives in robots.txt." Fetchers started by a person are a different matter.&lt;/p&gt;

&lt;p&gt;OpenAI describes ChatGPT-User as an agent that "is not used for crawling the web in an automatic fashion," and adds that "robots.txt rules may not apply" because a user starts the action. &lt;a href="https://docs.perplexity.ai/guides/bots" rel="noopener noreferrer"&gt;Perplexity's bot guide&lt;/a&gt; is blunter about Perplexity-User: "Since a user requested the fetch, this fetcher generally ignores robots.txt rules."&lt;/p&gt;

&lt;p&gt;For a site owner, the split has a practical side. A Disallow line can keep a page out of a training set, yet the same page may still be fetched for a ChatGPT user five minutes later. Only a log shows that second kind of visit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short mu-plugin records every match
&lt;/h2&gt;

&lt;p&gt;WordPress needs no plugin for a basic log. The file below goes into &lt;code&gt;wp-content/mu-plugins/&lt;/code&gt;, hooks into &lt;code&gt;template_redirect&lt;/code&gt; at priority 1, and compares the user agent of each request with the nine documented names.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="cd"&gt;/**
 * Plugin Name: AI Crawler Log
 * Description: Records visits from documented AI user agents.
 */&lt;/span&gt;

&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'template_redirect'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HTTP_USER_AGENT'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize_text_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;wp_unslash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HTTP_USER_AGENT'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'GPTBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'OAI-SearchBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ChatGPT-User'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'OAI-AdsBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'ClaudeBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Claude-User'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Claude-SearchBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'PerplexityBot'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Perplexity-User'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$names&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nb"&gt;stripos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$log&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'ai_crawler_log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$log&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s1"&gt;'bot'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;esc_url_raw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;wp_unslash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'time'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;gmdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'Y-m-d H:i:s'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Keep the last 500 visits; "false" keeps the option out of autoload.&lt;/span&gt;
        &lt;span class="nf"&gt;update_option&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'ai_crawler_log'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;array_slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each match lands in a single option, &lt;code&gt;ai_crawler_log&lt;/code&gt;, stored with autoload switched off so that ordinary page loads never carry it. The &lt;code&gt;array_slice()&lt;/code&gt; call caps the record at 500 visits. On a local WordPress 7.1 test install, a request sent with the GPTBot agent string appeared in the option within the same second, while a Chrome agent left no trace. Reading the result takes one WP-CLI command: &lt;code&gt;wp option get ai_crawler_log --format=json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Owners with shell access can skip PHP and count matches in the server log instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Eio&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-User|Claude-SearchBot|PerplexityBot|Perplexity-User"&lt;/span&gt; access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Page caches and spoofed agents distort the count
&lt;/h2&gt;

&lt;p&gt;PHP-based logging has a blind spot. When a full-page cache (WP Rocket or a CDN edge, for instance) answers the request, WordPress never starts and the visit goes unrecorded. The server access log catches those hits; a PHP log on a cached site shows only cache misses.&lt;/p&gt;

&lt;p&gt;User agent strings are also trivial to fake. Any script can call itself GPTBot, which is why all three vendors publish their IP ranges as JSON files (&lt;code&gt;openai.com/gptbot.json&lt;/code&gt; is one of them). A visit from outside those ranges is an impostor.&lt;/p&gt;

&lt;p&gt;The opposite error exists too. Cloudflare &lt;a href="https://blog.cloudflare.com/perplexity-is-using-stealth-undeclared-crawlers-to-evade-website-no-crawl-directives/" rel="noopener noreferrer"&gt;reported on August 4, 2025&lt;/a&gt; that Perplexity used, besides its declared agents, "a generic browser intended to impersonate Google Chrome on macOS when their declared crawler was blocked." No list of names catches a crawler that refuses to give one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare counted a 305% rise in GPTBot requests
&lt;/h2&gt;

&lt;p&gt;Traffic from these agents is no longer marginal. GPTBot "increased its share from 2.2% to 7.7%" of crawler requests in the year to May 2025, João Tomé of Cloudflare wrote in &lt;a href="https://blog.cloudflare.com/from-googlebot-to-gptbot-whos-crawling-your-site-in-2025/" rel="noopener noreferrer"&gt;a study of crawler traffic&lt;/a&gt; published that July. Raw request volume from the same bot, the figure in the heading above, more than quadrupled.&lt;/p&gt;

&lt;p&gt;Growth was uneven. In the same dataset ClaudeBot, Anthropic's training crawler, "fell from 11.7% to 5.4% of total traffic." One site's log can look nothing like the global chart, and a quiet month for one vendor says little about the others.&lt;/p&gt;

&lt;p&gt;Blocking remains rare among large sites. Of the 3,816 robots.txt files that Cloudflare could read among top domains, 546 addressed AI bots at all. GPTBot led the refusals: the study found it "disallowed by 312 domains."&lt;/p&gt;

&lt;h2&gt;
  
  
  Prime SEO 1.1.9 matches 14 names, two of them in vain
&lt;/h2&gt;

&lt;p&gt;Prime SEO, the plugin named in the disclosure, ships the same &lt;code&gt;stripos()&lt;/code&gt; approach behind a dashboard screen called AI Crawler Stats, which also records requests for llms.txt and the XML sitemap. Version 1.1.9 matches 14 substrings. Two of them are Google-Extended and Applebot-Extended, which, per the documentation quoted above, can never match. Those two counters will stay at zero.&lt;/p&gt;

&lt;p&gt;The plugin's list also predates Claude-User, Claude-SearchBot and Perplexity-User, so it undercounts user-triggered visits today; an update is planned for version 1.2.0. Background on the file these agents are meant to read is in the guide to &lt;a href="https://prime-seo-plugin.com/blog/what-is-llms-txt/" rel="noopener noreferrer"&gt;what llms.txt is&lt;/a&gt; and on the &lt;a href="https://prime-seo-plugin.com/llms-txt-wordpress-plugin/" rel="noopener noreferrer"&gt;llms.txt plugin for WordPress&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendor lists change faster than robots.txt files
&lt;/h2&gt;

&lt;p&gt;All three vendors now separate training crawlers from agents that act for a person. If that split continues, a robots.txt file written for GPTBot and ClaudeBot alone will govern a shrinking part of AI traffic, and the raw access log (not the rule file) becomes the place where a new agent name first shows up. Until a vendor page changes, nine names are enough.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://prime-seo-plugin.com/blog/ai-crawlers-wordpress-logs/" rel="noopener noreferrer"&gt;Prime SEO blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>ai</category>
      <category>seo</category>
      <category>php</category>
    </item>
    <item>
      <title>What Is llms.txt? How to Set It Up on WordPress (2026 Guide)</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Sun, 20 Sep 2026 18:19:03 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/what-is-llmstxt-how-to-set-it-up-on-wordpress-2026-guide-1ehd</link>
      <guid>https://dev.to/lutsiukdaniildesign/what-is-llmstxt-how-to-set-it-up-on-wordpress-2026-guide-1ehd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnur6prjggfrl9jju4569.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnur6prjggfrl9jju4569.jpg" alt="What Is llms.txt? How to Set It Up on WordPress (2026 Guide)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In September 2024, Jeremy Howard — the guy behind fast.ai and a former president of Kaggle — published a short proposal. He called it llms.txt, and the idea was almost annoyingly simple: give AI models a plain-text map of your website so they don't have to guess what's important.&lt;/p&gt;

&lt;p&gt;No one paid much attention at first. Then Cloudflare added one. Then Stripe. Then Anthropic, Vercel, Supabase, and Zapier. Today, over 780 websites have published an llms.txt file, and three separate community directories track who's adopted it.&lt;/p&gt;

&lt;p&gt;The question isn't really &lt;em&gt;whether&lt;/em&gt; llms.txt will matter. It's whether you'll set yours up before or after your competitors do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What llms.txt actually is (in plain English)
&lt;/h2&gt;

&lt;p&gt;Think of your website from an AI model's perspective for a second.&lt;/p&gt;

&lt;p&gt;When ChatGPT or Perplexity needs to answer a question about your product, it sends a crawler to your site. That crawler sees HTML — headers, footers, navigation menus, cookie banners, newsletter popups, sidebar widgets. Buried somewhere in that noise is the content that actually matters.&lt;/p&gt;

&lt;p&gt;Your XML sitemap doesn't help much here. It lists every URL on the site equally — the homepage, the privacy policy, that test page from 2019 you forgot to delete. There's no hierarchy, no context, no "start here."&lt;/p&gt;

&lt;p&gt;llms.txt solves this by giving AI models exactly what they need: a structured Markdown file at &lt;code&gt;yoursite.com/llms.txt&lt;/code&gt; that says "here's what this site is about, and here are the pages that matter most."&lt;/p&gt;

&lt;p&gt;That's it. A curated table of contents for machines that read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The format: simpler than you'd expect
&lt;/h2&gt;

&lt;p&gt;An llms.txt file is just Markdown with a specific structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Your Site Name&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; A one-line summary of what your site does.&lt;/span&gt;
Some optional context about your project, company, or product.
&lt;span class="gu"&gt;## Documentation&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting Started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/docs/start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Setup guide for new users
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API Reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Complete API documentation
&lt;span class="gu"&gt;## Blog&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Latest Release&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/blog/v2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: What's new in version 2.0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rules are minimal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One H1 heading&lt;/strong&gt; — your site or project name (the only required element)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A blockquote&lt;/strong&gt; — brief summary with key facts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;H2 sections&lt;/strong&gt; — groups of links, each with an optional description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown links&lt;/strong&gt; — &lt;code&gt;[Page Name](URL): optional description&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the entire spec. Jeremy Howard intentionally kept it simple because "websites already have sitemaps, robots.txt, and meta tags. What they don't have is a curated overview written specifically for language models."&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt vs llms-full.txt — yes, there are two
&lt;/h2&gt;

&lt;p&gt;The standard actually defines two files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms.txt&lt;/strong&gt; is the summary — your site's elevator pitch plus links to key pages. Think of it as the table of contents. Most llms.txt files are a few hundred lines at most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;llms-full.txt&lt;/strong&gt; is the entire book. It contains the full Markdown content of your key pages, concatenated into one massive file. Cloudflare's llms-full.txt is 3.7 million tokens. Anthropic's is 481,000 tokens. Vercel's has been described as "a 400,000-word novel."&lt;/p&gt;

&lt;p&gt;Why would you want that? Because an AI model with a large enough context window can ingest your entire documentation in one shot — no crawling, no parsing HTML, no missing pages.&lt;/p&gt;

&lt;p&gt;For most WordPress sites, llms.txt alone is enough. But if you run a documentation-heavy site or want AI to have deep access to your content, llms-full.txt is worth considering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's actually using it?
&lt;/h2&gt;

&lt;p&gt;The short answer: mostly developer-facing companies. The long answer is more interesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stripe&lt;/strong&gt; organizes their llms.txt by product category, with an "Optional" section for niche tools like Stripe Climate. Their file tells AI agents exactly how to retrieve plain-text versions of documentation pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; structures theirs by product line — Workers, Pages, R2, and so on. Each entry has a description that helps AI models decide which page to fetch based on the user's question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic&lt;/strong&gt; (the company behind Claude) maintains both files. Their llms.txt is 8,364 tokens; the full version is 481,349 tokens covering their entire API documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vercel&lt;/strong&gt; went a step further and published a proposal for inline LLM instructions in HTML — extending the llms.txt idea into individual pages.&lt;/p&gt;

&lt;p&gt;Other adopters include Supabase, Zapier, Modal, Coinbase, and hundreds of smaller companies tracked across three community directories.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest truth: does it actually work?
&lt;/h2&gt;

&lt;p&gt;Here's where most articles about llms.txt get vague. We won't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data is mixed.&lt;/strong&gt; Search Engine Land tracked 10 websites for 180 days — 90 days before adding llms.txt, 90 days after. The results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 out of 10 sites saw AI traffic increases (12.5% and 25%)&lt;/li&gt;
&lt;li&gt;8 sites saw no measurable change&lt;/li&gt;
&lt;li&gt;1 site actually declined by 19.7%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's the catch: the two sites that grew had also launched new content and PR campaigns around the same time. The llms.txt file alone didn't drive the increase — it was part of a broader effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adoption is still early.&lt;/strong&gt; Rankability scanned the top 1,000 most-visited websites globally. As of mid-2025, only 0.3% had an llms.txt file. That's 3 out of 1,000.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No AI provider has officially committed&lt;/strong&gt; to reading llms.txt. OpenAI, Anthropic, Google — none have confirmed their crawlers consistently follow llms.txt instructions. Google's John Mueller compared the standard to the deprecated keywords meta tag.&lt;/p&gt;

&lt;p&gt;So why bother?&lt;/p&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low effort, no downside.&lt;/strong&gt; Setting up llms.txt takes 5 minutes. There's zero risk. It won't hurt your rankings, slow your site, or cause conflicts with anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The direction is clear.&lt;/strong&gt; Even if no one reads llms.txt &lt;em&gt;today&lt;/em&gt;, AI search is growing at 34% CAGR. Gartner predicts 25% of search volume will shift away from traditional engines by late 2026. When AI providers &lt;em&gt;do&lt;/em&gt; formalize how they read websites, llms.txt (or something very similar) will be the standard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;First-mover advantage is real.&lt;/strong&gt; If only 0.3% of top sites have llms.txt, that means 99.7% of your competitors don't. Early adopters set the baseline that later standards build on.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How llms.txt differs from robots.txt and XML sitemaps
&lt;/h2&gt;

&lt;p&gt;This trips people up, so here's a clear comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;robots.txt&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;XML Sitemap&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;llms.txt&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controls crawler &lt;em&gt;access&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Lists &lt;em&gt;all&lt;/em&gt; URLs for indexing&lt;/td&gt;
&lt;td&gt;Curated overview for &lt;em&gt;AI understanding&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audience&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search engine crawlers&lt;/td&gt;
&lt;td&gt;Search engine crawlers&lt;/td&gt;
&lt;td&gt;Language models (LLMs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom syntax&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Allow/Disallow rules&lt;/td&gt;
&lt;td&gt;URLs + metadata&lt;/td&gt;
&lt;td&gt;Descriptions + key page links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security guard&lt;/td&gt;
&lt;td&gt;Phone book&lt;/td&gt;
&lt;td&gt;Tour guide&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They serve completely different purposes. You need all three — robots.txt controls who gets in, the sitemap lists what exists, and llms.txt explains what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up llms.txt on WordPress
&lt;/h2&gt;

&lt;p&gt;You have two options: manual or plugin. Manual works, but it's tedious to maintain. Here's why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Manual setup
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;llms.txt&lt;/code&gt; in your WordPress root directory (same place as &lt;code&gt;wp-config.php&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Your Site Name&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Brief description of your website and what it offers.&lt;/span&gt;
&lt;span class="gu"&gt;## Pages&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Main landing page
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;About&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/about/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Company information
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/services/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: What we offer
&lt;span class="gu"&gt;## Blog&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Latest Post&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/blog/latest/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Description

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload it via FTP or your hosting file manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Every time you publish a new post, update a page, or change your site structure, you need to manually edit this file. For a site with 50+ posts, maintaining llms.txt by hand gets old fast.&lt;/p&gt;

&lt;p&gt;You also need to handle URL rewrites so WordPress serves the file correctly, which means editing &lt;code&gt;.htaccess&lt;/code&gt; or adding a custom rewrite rule in &lt;code&gt;functions.php&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Automatic generation with a plugin
&lt;/h3&gt;

&lt;p&gt;This is where things get practical. Several WordPress plugins now generate llms.txt automatically. The setup typically looks like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the plugin&lt;/li&gt;
&lt;li&gt;Go to settings and choose which post types to include (posts, pages, products, etc.)&lt;/li&gt;
&lt;li&gt;Click "Generate" — the plugin creates llms.txt based on your actual content&lt;/li&gt;
&lt;li&gt;It updates automatically when you publish or edit content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What Prime SEO does specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prime SEO includes llms.txt generation as part of its AI Settings module. Here's what it offers beyond basic generation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-generation&lt;/strong&gt; of both llms.txt and llms-full.txt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post type selection&lt;/strong&gt; — choose which content types appear in the file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section management&lt;/strong&gt; — organize links by custom sections, not just post type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Bots Manager&lt;/strong&gt; — control which AI crawlers can access your site (12 bots including GPTBot, ClaudeBot, PerplexityBot)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Crawler Stats&lt;/strong&gt; — see which AI bots actually visit your site and how often&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Visibility Score&lt;/strong&gt; — a quick check of how AI-ready your site is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The llms.txt and AI bots features are free — no Pro license required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wordpress.org/plugins/prime-seo/" rel="noopener noreferrer"&gt;&lt;strong&gt;Install Prime SEO on WordPress.org&lt;/strong&gt;&lt;/a&gt; — takes about 2 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to include in your llms.txt (and what to skip)
&lt;/h2&gt;

&lt;p&gt;Not every page belongs in your llms.txt. The whole point is curation — helping AI focus on what matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Include:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homepage&lt;/li&gt;
&lt;li&gt;Core product/service pages&lt;/li&gt;
&lt;li&gt;Documentation and how-to guides&lt;/li&gt;
&lt;li&gt;Key blog posts (evergreen content, not news)&lt;/li&gt;
&lt;li&gt;Pricing page&lt;/li&gt;
&lt;li&gt;FAQ or knowledge base&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skip:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy policy, terms of service (AI doesn't need these for answering questions)&lt;/li&gt;
&lt;li&gt;Category and tag archives&lt;/li&gt;
&lt;li&gt;Author pages&lt;/li&gt;
&lt;li&gt;Thin pages with little content&lt;/li&gt;
&lt;li&gt;Pages marked &lt;code&gt;noindex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Test/staging pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Good descriptions matter.&lt;/strong&gt; Don't just list URLs — add context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Documentation&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting Started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/docs/start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Step-by-step installation
  and configuration guide for new users
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API Reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yoursite.com/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Complete REST API documentation
  with code examples in Python, JavaScript, and PHP

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That description tells an AI model &lt;em&gt;exactly&lt;/em&gt; what it'll find at each URL, so it can pick the right source for the user's question.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real-world example
&lt;/h2&gt;

&lt;p&gt;Here's a shortened version of our own llms.txt at &lt;a href="https://prime-seo-plugin.com/llms.txt" rel="noopener noreferrer"&gt;prime-seo-plugin.com/llms.txt&lt;/a&gt; (the full text of the same pages is in &lt;a href="https://prime-seo-plugin.com/llms-full.txt" rel="noopener noreferrer"&gt;llms-full.txt&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Prime SEO&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Free WordPress SEO plugin for Google and AI search: meta tags, XML sitemap,&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; schema markup, redirects, llms.txt and control over 12 AI crawlers.&lt;/span&gt;
&lt;span class="gu"&gt;## Documentation&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting Started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://prime-seo-plugin.com/docs/getting-started/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;:
  Install Prime SEO, run the setup wizard, and start optimizing your site
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;LLMs.txt&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://prime-seo-plugin.com/docs/llms-txt/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;:
  Generate and manage LLMs.txt files for your WordPress site
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;AI Bots Manager&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://prime-seo-plugin.com/docs/ai-bots-manager/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;:
  Control how AI search engines crawl your WordPress site
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Schema Markup&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://prime-seo-plugin.com/docs/schema-markup/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;:
  Add JSON-LD structured data to your WordPress site
&lt;span class="gu"&gt;## Product&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Prime SEO PRO&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://prime-seo-plugin.com/pro.html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;:
  AI-written SEO titles and descriptions, bulk generation, video sitemap

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how each link has a description that tells the AI model what the page contains. An AI answering "How do I set up schema markup in Prime SEO?" knows exactly which link to pull from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist: your llms.txt in 15 minutes
&lt;/h2&gt;

&lt;p&gt;Here's the quick version for people who skim (no judgment — we do it too):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Decide on content&lt;/strong&gt; — list 10-20 most important pages on your site&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Choose your method&lt;/strong&gt; — manual file or plugin (we recommend plugin for WordPress)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Write descriptions&lt;/strong&gt; — every link needs a 1-line explanation&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Organize sections&lt;/strong&gt; — group by type (Docs, Blog, Product, etc.)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Test the URL&lt;/strong&gt; — visit &lt;code&gt;yoursite.com/llms.txt&lt;/code&gt; and verify it loads&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Set up llms-full.txt&lt;/strong&gt; (optional) — if you have documentation-heavy content&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Monitor AI traffic&lt;/strong&gt; — check if AI bots are reading your new file&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Update regularly&lt;/strong&gt; — or use a plugin that updates automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next for the standard?
&lt;/h2&gt;

&lt;p&gt;llms.txt is still a proposal, not an official web standard. It doesn't have W3C backing or formal support from major AI providers.&lt;/p&gt;

&lt;p&gt;But the momentum is real. Three community directories track adoption. GitHub discussions are active. Major tech companies are implementing it on their documentation sites. And the underlying problem — AI models struggling to understand website structure — isn't going away.&lt;/p&gt;

&lt;p&gt;Whether the final standard is called llms.txt or something else, the concept of "a curated, machine-readable summary of your website" is becoming essential. Setting it up now costs nothing and positions your site for whatever comes next.&lt;/p&gt;

&lt;p&gt;The sites that prepared for mobile-first indexing early didn't regret it. The same pattern is playing out with AI search readiness.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;FAQ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is llms.txt required for WordPress?&lt;/strong&gt; No. It's optional, and your site will function perfectly without it. But adding it improves your chances of being correctly cited when AI search engines reference your content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will llms.txt improve my Google rankings?&lt;/strong&gt; No. Google does not use llms.txt for ranking. It specifically targets AI language models like ChatGPT, Claude, and Perplexity. Your traditional SEO setup (sitemap, meta tags, schema) remains separate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need both llms.txt and llms-full.txt?&lt;/strong&gt; For most sites, llms.txt alone is sufficient. llms-full.txt is useful if you have extensive documentation and want AI models to access the full content without crawling each page individually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should I update llms.txt?&lt;/strong&gt; Every time you add or remove important content from your site. If you use a plugin like Prime SEO, this happens automatically when you publish or update posts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is llms.txt the same as robots.txt?&lt;/strong&gt; No. robots.txt controls which crawlers can access your site. llms.txt tells AI models what your site is about and which pages are most important. They serve different purposes, and you need both.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
