<?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>How to add llms.txt to WordPress in 2026: spec v2, the Lighthouse audit and five plugins compared</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:56:20 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/how-to-add-llmstxt-to-wordpress-in-2026-spec-v2-the-lighthouse-audit-and-five-plugins-compared-b45</link>
      <guid>https://dev.to/lutsiukdaniildesign/how-to-add-llmstxt-to-wordpress-in-2026-spec-v2-the-lighthouse-audit-and-five-plugins-compared-b45</guid>
      <description>&lt;p&gt;Jeremy Howard published version 2 of the llms.txt proposal on August 10, 2026, two years after the original. One line is required. WordPress.org now serves such a file at its own root, Chrome's Lighthouse checks for it since version 13.3, and three of the four biggest WordPress SEO plugins generate it in their free builds.&lt;/p&gt;

&lt;p&gt;For a site owner the decision has three parts. Whether to publish the file at all. Whether to write it by hand or let a plugin build it, and, if a plugin, which one, since the default outputs of the five compared below differ in length by a factor of 200.&lt;/p&gt;

&lt;h2&gt;
  
  
  The v2 spec keeps one required line and adds two link relations
&lt;/h2&gt;

&lt;p&gt;The format did not change. According to the proposal at llmstxt.org, a valid file contains "An H1 with the name of the project or site. This is the only required section," followed by a blockquote summary, then free paragraphs, then H2 sections holding markdown link lists in the form &lt;code&gt;- [name](url): notes&lt;/code&gt;. A file with the single line &lt;code&gt;# Example Shop&lt;/code&gt; is valid.&lt;/p&gt;

&lt;p&gt;What v2 adds is discoverability. "v1 permitted llms.txt files in subpaths without saying what that meant," the changes page states. "v2 defines it: a file covers the pages under its path, and the most specific file applies." A page can now announce its file with &lt;code&gt;&amp;lt;link rel="describedby" href="/llms.txt"&amp;gt;&lt;/code&gt; in the head, or with an HTTP &lt;code&gt;Link:&lt;/code&gt; header set at the CDN, and the markdown twin of a page may live at either &lt;code&gt;page.html.md&lt;/code&gt; or &lt;code&gt;page.md&lt;/code&gt;, where v1 allowed only the longer form.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;## Optional&lt;/code&gt; section survived with less meaning. Tools no longer treat it as a mechanical signal; the convention stays for links an agent can skip. Howard also writes that "thousands of sites now publish an llms.txt file," and the AI labs are among them. On September 24, 2026, developers.openai.com/llms.txt and docs.claude.com/llms.txt both answered 200, and so did wordpress.org/llms.txt, a 75-line file that opens by stating WordPress "powers more than 43% of all websites on the internet."&lt;/p&gt;

&lt;h2&gt;
  
  
  Lighthouse 13.3 audits the file but gives no score for it
&lt;/h2&gt;

&lt;p&gt;Chrome's Lighthouse gained an Agentic Browsing category in version 13.3, which DebugBear covered on May 10, 2026. Four audits sit in it, and one is named "llms.txt does not follow recommendations." That audit fails a file with no H1 header, a file that is too short, or a file without links. Everything else passes.&lt;/p&gt;

&lt;p&gt;A site without the file is not penalised. When the server answers 404, the Chrome documentation (last updated May 5, 2026) says "the audit is marked as Not Applicable (N/A)," and the whole category carries no 0 to 100 score, "because the standards for the agentic web are still emerging." Lighthouse gathers data here. Ranking is not part of it.&lt;/p&gt;

&lt;p&gt;The audit also has a bug open against it. Issue 17082 in the Lighthouse repository, opened June 18, 2026, describes a spec-compliant file that returns 200 and still produces "Fetch of llms.txt failed" in PageSpeed Insights, which was running an older Chrome build than the documentation calls for. A green result there is not yet a reliable signal either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Search says the file goes unread, and server logs agree
&lt;/h2&gt;

&lt;p&gt;John Mueller, Search Advocate at Google, wrote on Bluesky on June 17, 2025: "FWIW no AI system currently uses llms.txt." His evidence is in every access log: "It's super-obvious if you look at your server logs. The consumer LLMs / chatbots (the ones that SEOs want traffic from) will fetch your pages - for training and grounding, but none of them fetch the llms.txt file."&lt;/p&gt;

&lt;p&gt;Fifteen months later the two halves of Google disagree. Search Engine Journal put it in a headline, "Google's llms.txt guidance depends on which product you ask": Search says the file is unused, while Chrome ships an audit for it. &lt;/p&gt;

&lt;p&gt;On narrower ground, the llmstxt.org text sides with Chrome, because the file is used "most heavily for software documentation, where coding agents follow them to find API references and tutorials." A WooCommerce store is not documentation. No vendor has published a statement that its shopping or search crawler reads the file.&lt;/p&gt;

&lt;p&gt;Publishing one costs a few kilobytes and, with a plugin, no time. Trusting it costs more, because the crawlers measurably do fetch the HTML pages, and access to those pages is decided by robots.txt, a file that llms.txt never replaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  What five WordPress plugins write into the file
&lt;/h2&gt;

&lt;p&gt;A search for "llms.txt" in the WordPress.org plugin directory returned 521 plugins on September 24, 2026. Website LLMs.txt, the largest single-purpose one, lists 40,000 active installs. The findings below come from reading the free builds of the four major SEO suites and of Prime SEO, the plugin developed by the author, on the same date.&lt;/p&gt;

&lt;p&gt;Yoast SEO 28.5 ships the feature off by default (&lt;code&gt;enable_llms_txt&lt;/code&gt; in the &lt;code&gt;wpseo&lt;/code&gt; option) and writes a physical file to the site root once a week through WP-Cron, with a first run five minutes after the toggle. Each post type gets five links. Cornerstone content comes first, then the most recently modified, and posts older than twelve months are dropped. Every string goes through &lt;code&gt;html_entity_decode&lt;/code&gt; and a backslash escape of markdown characters, and the plugin refuses to overwrite a file whose MD5 hash it did not record itself, so a hand-written file stays.&lt;/p&gt;

&lt;p&gt;Rank Math 1.0.279 keeps llms.txt as a module outside the default set, so it also starts off. Once enabled, it serves the file on every request through a rewrite rule, with nothing on disk, a default of 50 links per post type and the header &lt;code&gt;X-Robots-Tag: noindex, nofollow&lt;/code&gt;. Line one is a credit sentence, removable with the filter &lt;code&gt;rank_math/llms_txt/remove_credit&lt;/code&gt;, and the title is the Knowledge Graph name rather than the blog name.&lt;/p&gt;

&lt;p&gt;All in One SEO 5.0.2 also starts off and also writes a physical file, but through Action Scheduler, daily, plus a single run ten seconds after any post or term is saved. Its default is 1,000 links per post type, pillar content first. Version 5.0.2 is the release that switched the title from HTML escaping to entity decoding, with a docblock reading "this is a plain-text file."&lt;/p&gt;

&lt;p&gt;SEOPress 10.2 is the odd one. Its directory readme lists "llms.txt &amp;amp; Agent Readiness" among the free features, while the free build on WordPress.org holds a toggle default and a documentation link, and no code that writes or serves the file. The generator sits in the paid version, which the author has not examined.&lt;/p&gt;

&lt;p&gt;Prime SEO 1.2.1, whose &lt;a href="https://prime-seo-plugin.com/llms-txt-wordpress-plugin/" rel="noopener noreferrer"&gt;llms.txt generator for WordPress&lt;/a&gt; is documented on the plugin site, serves the file on activation without a toggle, dynamically, the way Rank Math does. Its list holds 20 pages, 20 posts, 20 WooCommerce products and 10 categories, newest first; noindex posts and the front page are left out. Each link is described by the SEO description or the excerpt, cut to 20 words.&lt;/p&gt;

&lt;p&gt;If a physical &lt;code&gt;llms.txt&lt;/code&gt; exists at the root, the plugin steps aside and the server delivers that file. An optional &lt;code&gt;llms-full.txt&lt;/code&gt;, off by default, appends the body text of up to 50 posts at 2,000 words each; no other free build here produces a full-text file, although the AIOSEO code carries the filename and a flag that the free build ignores.&lt;/p&gt;

&lt;p&gt;One defect belongs in this list too. In 1.2.1 the site name comes straight from &lt;code&gt;get_bloginfo('name')&lt;/code&gt;, which WordPress stores already HTML-escaped, so a site called "Smith &amp;amp; Sons" appears as &lt;code&gt;# Smith &amp;amp;amp; Sons&lt;/code&gt;. The fix, &lt;code&gt;wp_specialchars_decode&lt;/code&gt;, is committed for 1.2.2, and it is the same bug AIOSEO closed a day earlier. Nothing in any of the five builds emits the v2 &lt;code&gt;rel="describedby"&lt;/code&gt; link or the &lt;code&gt;Link:&lt;/code&gt; header, and none publishes &lt;code&gt;.md&lt;/code&gt; twins of pages, so the discoverability half of version 2 has no implementation among them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two minutes by hand, or no minutes with a plugin
&lt;/h2&gt;

&lt;p&gt;The manual route needs a text file at the web root, uploaded over SFTP or through the host's file manager: the site name after &lt;code&gt;#&lt;/code&gt;, one blockquote sentence, a short H2 list of the pages an agent should read first. Yoast, Prime SEO and the Lighthouse audit all accept that file as it is. The trade is upkeep. A hand-written list is frozen on the day it is written, while the generated ones follow new posts weekly, daily, or on the next request.&lt;/p&gt;

&lt;p&gt;A plugin is the better choice when the site publishes often and nobody will remember the file. The hand-written file wins when the site has a dozen pages that matter and a thousand that do not, because every generator above selects by date, cornerstone flag or sitemap priority, and none of them knows which page a support agent should read before quoting a return policy.&lt;/p&gt;

&lt;p&gt;If an agent ever asks for the file while the catalogue changes every week, the generated version is the one that answers correctly; if the file has to say which twelve pages define the business, a person has to write it, and every plugin here steps aside for that file. Prime SEO is free on &lt;a href="https://wordpress.org/plugins/prime-seo/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Google rewrites 63% of meta descriptions. The other 37% still decide the click</title>
      <dc:creator>Daniil Lutsiuk</dc:creator>
      <pubDate>Wed, 23 Sep 2026 15:48:05 +0000</pubDate>
      <link>https://dev.to/lutsiukdaniildesign/google-rewrites-63-of-meta-descriptions-the-other-37-still-decide-the-click-36p1</link>
      <guid>https://dev.to/lutsiukdaniildesign/google-rewrites-63-of-meta-descriptions-the-other-37-still-decide-the-click-36p1</guid>
      <description>&lt;p&gt;Google rewrites 62.78% of meta descriptions, according to a study of 20,000 keywords that Ahrefs published in 2020. The number gets quoted as a reason to stop writing them. The same study found a quarter of top-ranking pages with no meta description at all, which sounds like the second half of the same argument.&lt;/p&gt;

&lt;p&gt;Both figures leave out the part that matters to a site owner. In the remaining 37% of cases Google shows the description as written, and Bing and the AI search engines quote a page before a human ever opens it. For a WordPress site with 400 posts the question is not whether to write descriptions. The question is who writes them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Google says it does with the tag
&lt;/h2&gt;

&lt;p&gt;Google's own documentation on snippets is less dismissive than the study makes it sound. "Snippets are primarily created from the page content itself," the &lt;a href="https://developers.google.com/search/docs/appearance/snippet" rel="noopener noreferrer"&gt;Search Central page on snippet control&lt;/a&gt; states, before adding that Google "sometimes uses the meta description HTML element if it might give users a more accurate description of the page than content taken directly from the page."&lt;/p&gt;

&lt;p&gt;The rewrite is a fallback for descriptions that fail. One that repeats the title gets replaced by a sentence from the body, and so does one copied across a whole category, which the same page addresses directly: "identical or similar descriptions on every page of a site aren't helpful when individual pages appear in search results." On length the guidance is loose. There is no cap, and the snippet "is truncated in Google Search results as needed, typically to fit the device width."&lt;/p&gt;

&lt;p&gt;Yoast, whose plugin runs on 10 million sites by the WordPress.org count, translates the truncation into a working number. Its &lt;a href="https://yoast.com/meta-descriptions/" rel="noopener noreferrer"&gt;guide on meta descriptions&lt;/a&gt;, updated by Edwin Toonen on June 23, 2025, recommends "up to 155 characters" and concedes the same limit of control: "Sometimes, it shows the meta description, and sometimes, it just grabs some sentences of your copy or generates something itself."&lt;/p&gt;

&lt;h2&gt;
  
  
  The empty tag is the common case
&lt;/h2&gt;

&lt;p&gt;Michal Pecánek, who wrote the &lt;a href="https://ahrefs.com/blog/meta-description-study/" rel="noopener noreferrer"&gt;Ahrefs study&lt;/a&gt;, measured a weak correlation of 0.28 between having a description and ranking position. The figure is the counterargument to any claim that descriptions move rankings, and it holds. A description changes what the result says, not where it sits.&lt;/p&gt;

&lt;p&gt;What happens when the tag is empty depends on the SEO plugin. Prime SEO, the plugin developed by the author, falls back to the post excerpt, and when the excerpt is empty too it prints the opening 25 words of the body. Most plugins do something similar, so the snippet starts mid-sentence, with a greeting to regular readers or a cookie notice. On a site where the excerpt field has never been used, that fallback is what searchers read for every post.&lt;/p&gt;

&lt;p&gt;The free version of Prime SEO counts those posts on its dashboard, under Needs Attention, and its SEO score includes a check for a description between 120 and 160 characters. The count is usually larger than the owner expects. A blog that has published twice a week since 2019 holds about 700 posts, and at a few minutes per description written by hand, with the post open, the backlog is a working week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six fields in one click, a site in one run
&lt;/h2&gt;

&lt;p&gt;Version 1.2.1 of Prime SEO Pro, released on September 23, 2026, ships the option the backlog needs. A Generate All button in the post editor writes six fields at once: the SEO title, the meta description, and the Open Graph and Twitter title and description, each cut to its own limit (155 characters for the meta description). The text comes from the post content and the focus keyword when one is set. The Bulk Generator runs the same generation over every post that is missing a title or a description, with a progress bar, a pause button and a stop button.&lt;/p&gt;

&lt;p&gt;Since 1.2.1 the generations run through the plugin's own service. A Pro license includes 500 generations a month, where one generation is one Generate All click, one post in a bulk run, or one Content Score analysis, and the counter with its reset date sits in AI Settings. No OpenAI account is needed. Sites that want more, or a different model, paste their own OpenAI key on the same page; the limit is then gone, and the request travels from the site to OpenAI directly.&lt;/p&gt;

&lt;p&gt;The generated text is a draft, not a verdict. Google will still rewrite the ones that read like every other page, and the 37% that survive are the ones that say what the page contains in words the searcher used. Pro subscriptions to the plugin have doubled since the start of September 2026, and the bulk run is the feature new subscribers open first.&lt;/p&gt;

&lt;p&gt;If three posts in four on a site show an opening sentence as the snippet, the choice in 2026 is between a week of writing and an afternoon of reviewing. Prime SEO is free on &lt;a href="https://wordpress.org/plugins/prime-seo/" rel="noopener noreferrer"&gt;WordPress.org&lt;/a&gt;; Generate All and the Bulk Generator are part of &lt;a href="https://prime-seo-plugin.com/pro.html" rel="noopener noreferrer"&gt;Pro&lt;/a&gt;, $59 a year with a 14-day trial and no card.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>wordpress</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <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>
