VigIA — Full changelog For each release, see the entries below. The latest version is always at the top. The current release notes also live in readme.txt under "== Changelog ==". = 2.5.0 = * New: A "Database optimization" control in Data settings creates the indexes the statistics tables need. VigIA adds them by itself in the background shortly after updating; the button is there for sites where WP-Cron is disabled or barely runs, and it reports when the work is done. You can close the page while it runs, it finishes on its own. * Improved: The analytics screens no longer bog down on sites with a long history. The most crawled pages and top crawlers tables were resolving the per-row details for every page in the range instead of the ten on screen, and the pages endpoint re-derived the content type of up to 2000 old rows on every single load. On a test site with 610,000 recorded visits, the whole dashboard went from 16.4 seconds to 1.4 for a year of data, and from 17.1 to 3.6 for the full history. * Improved: Date ranges longer than 60 days are now computed ahead of time in the background and served ready-made, so the long views open instantly. Shorter ranges are never cached: what you see for today or the last 30 days is always live. * Improved: Exporting activity to CSV is far lighter. A week of activity used to run more than 15,000 database queries and now runs 12. * Improved: Visits still waiting for their content type are filled in by a background task that drains them steadily, instead of on whichever page load happened to run into them. * Fix: Paging backwards through Recent activity left the numbering stuck on the last page loaded from the server, because pages served from the browser's own cache did not update it. The rows changed but the counter did not follow. * Fix: Rows could show up twice, or not at all, when paging through the activity table, the most crawled pages or the top crawlers. Entries that tied on the sort column had no defined order, so they could change places between one page and the next. The same applies to a CSV export, which is paged the same way. * Fix: The analytics tables were unreadable on a phone: they were squeezed into the available width until words broke one letter per line. They now keep readable columns and scroll sideways within their box. * Fix: The spinner on the export button never spun and sat misaligned with the label. * Fix: CSV exports now write every recorded value as plain text, so spreadsheet software never interprets the contents of a cell. = 2.4.5 = * Fix: The llms.txt references in robots.txt could end up duplicated, with a stray "Disallow: /" left in front of the old block, when another plugin rewrote the file and joined two of its lines. Because that leftover sits inside whichever User-agent group precedes it, it could tell every crawler to stay away from the whole site. VigIA now recognises its own markers even when another plugin has glued them to the line above, and repairs an affected robots.txt during the update. * Fix: robots.txt is now always left with a single newline at the end, so the next plugin that appends to it starts on its own line instead of running into VigIA's last one. * Fix: The AI crawler rules block is now closed with an end marker. Without it, rules another plugin wrote immediately after the block could be removed along with it. * Fix: An empty themed icon, such as the ones many themes and page builders emit, no longer leaves a stray ** or * in the middle of a sentence in the Markdown for agents output. * Fix: Bracketed prose such as [sic] or a [1] footnote is no longer mistaken for a leftover shortcode and deleted from the Markdown output. Tags left behind by a page builder are still removed. * Fix: The description in the Markdown frontmatter no longer runs words together on tables and lists, now decodes typographic punctuation instead of showing it as entities, and no longer comes out empty on long accented text. = 2.4.4 = * Improved: The content type pickers for Markdown for agents and llms.txt now offer only the types these files can actually serve. Types with no address of their own on the front end are gone from the list, and so are the course and membership types whose own plugin decides who may read them, with a note on screen explaining why. * Improved: A new `vigia_content_is_public` filter lets a plugin or theme decide, per entry, whether it may appear on these files at all. * Fix: Markdown for agents and llms.txt could serve content that a course or membership plugin keeps behind its gate. Both rebuild an entry's content outside the normal template, where the access rules those plugins enforce in their own templates never run, so an anonymous visitor could read through the .md file what the HTML page withheld. Entries are now checked against the access rules before they are published on any of these surfaces, and the content types whose plugin decides who may read them are withheld unless you opt them in. Your llms.txt and llms-full.txt are rebuilt during the update. = 2.4.3 = * Improved: The crawler breakdown of the Most Crawled Pages table now groups its chips by crawler type, each carrying the category colour used elsewhere in the dashboard, so the categories cluster together instead of scattering. Within each category the chips keep their by-visits order. * Fix: A static front page now advertises its Markdown version. Its permalink is the site home, so there was no path left to suffix with .md and neither the tag nor the Link header were emitted; both now point to the page slug endpoint, which was already serving that markdown. * Fix: The page assigned as the Posts page in Settings > Reading no longer serves markdown. WordPress renders the blog loop there instead of the page content, so its .md endpoint returned something the site never displays, and on most installs it was empty. = 2.4.2 = * Improved: When Visibility manages the robots.txt rules for AI crawlers, the Disallow & Blocking tab no longer shows the inert Add rule form and Remove buttons: the rules list is read-only while the compliance monitor and the PHP (403) blocking stay fully active. * Fix: The "Markdown for Agents" pointer in the AI Discovery JSON-LD now declares its URL pattern as an EntryPoint urlTemplate (with text/markdown contentType) instead of a plain target string, so crawlers no longer fetch the literal {slug}.md placeholder and Google Search Console stops reporting it as a 404. = 2.4.1 = * Improved: The Visibility recommendation now shows across the three Extras tabs (LLMs.txt, Markdown and JSON-LD) and the AI Visibility analyzer whenever Visibility is not active, with broader SEO plugin detection and clearer copy about the traffic and authority you gain. The call to action is now an inline link instead of an intrusive button. * Improved: The Monitored AI crawlers list is now grouped by crawler type, so the coloured category badges cluster together instead of scattering across the grid. The analytics tables (top crawlers, recent activity) keep their by-visits order. * Fix: The analyzer no longer offers to install NoIndexer or Native Sitemap Customizer, which are no longer in the WordPress.org directory (their install modal opened empty). = 2.4.0 = * Improved: With Visibility active, VigIA's overlapping Extras tabs (LLMs.txt, Markdown and JSON-LD) are dimmed and their controls disabled, with a pointer to Visibility where you configure them, so the same signal is never edited in two places. They are never removed: a site without Visibility sees them in full. The Disallow & Blocking tab stays active because its compliance monitor and 403 blocking remain VigIA's. * Improved: The robots.txt rules for AI now read from Visibility when it owns them. VigIA's compliance monitor and 403 escalation check against the crawlers Visibility disallows, and VigIA's own rule editor turns read-only while ceded, so the two never disagree on which bots should be blocked. * Improved: Each signal tab and the recommendations now point to Visibility, the sibling SEO and AI plugin that pairs natively with VigIA, instead of competing SEO plugins. You get a complementarity note when both are active, and a clear reason to switch (lightweight and native, no bloat) when another SEO plugin is running without Visibility. = 2.3.0 = * New: Coexistence with Visibility, the AyudaWP sibling that, from its 1.7.0, generates the AI and search signals (reusing VigIA's code). The family splits by nature, not by topic: Visibility emits, VigIA observes and controls. When Visibility is active and emitting a signal, VigIA automatically steps back from emitting the same one to avoid duplicates, across all four overlap points: Site Identity schema (JSON-LD Organization/Person + WebSite), llms.txt and llms-full.txt, Markdown for agents (/{slug}.md), and the robots.txt rules for AI crawlers. Detection is read from Visibility's own settings, so the handover is per signal: if Visibility has a given signal turned off, VigIA keeps emitting it, so a signal is never dropped by both at once * New: Each overlapping admin screen (JSON-LD, LLMs.txt, Markdown, Disallow & Blocking) shows a neutral coexistence notice explaining who handles what, instead of the third-party "duplicate schema" warning, which is reserved for SEO plugins that duplicate without coordinating * New: When VigIA cedes llms.txt, it removes its own physical llms.txt / llms-full.txt so a leftover file at the site root can't shadow Visibility's virtual output. It recognises Visibility's own files by their "# Generated by Visibility" header and never deletes them, and only removes files VigIA itself generated. When it cedes the robots.txt rules for AI, it withdraws its block from the physical robots.txt (marker-scoped), leaving the rest of the file untouched * New: Developer filter vigia_defer_emission_to_visibility (default true, passed the signal name) to override the handover and keep VigIA's own emission even when Visibility is active and emitting that signal * Improved: VigIA's core is untouched by the handover. Crawler analytics, stats, hard PHP/403 blocking, email alerts and the control MCP server keep working exactly as before. Its robots.txt block-by-crawler editor yields to Visibility, but the real enforcement (PHP/403) stays with VigIA, which is its differentiator = 2.2.0 = * New: The "Most crawled pages" table is now an analysis hub for each page. It adds a Content type column (the dominant type per page, resolved with a single query reusing the value detected and stored since 2.0.0), a Trend arrow comparing crawler visits against the previous period (with a "Before → Now" tooltip; shown as "new" for pages with no prior traffic and hidden for the all-time range), and an expandable Crawlers column that loads, on demand, the per-bot breakdown for that exact URL * Improved: The "Top crawlers" table now shows each bot's last visit ("2 hours ago") and a pages/visits ratio (unique pages over total visits), so you can tell whether a crawler is still active and whether it explores your site broadly or keeps hitting the same handful of URLs * Improved: Expanded and refreshed the AI crawler catalog to 60+ known crawlers, each checked against the operators' own documentation. Added OAI-AdsBot (OpenAI), Claude-Code (Anthropic), Google-NotebookLM and Google-Read-Aloud (Google), Amzn-SearchBot, Amzn-User and bedrockbot (Amazon), MistralAI-Index (Mistral), SBIntuitionsBot (SB Intuitions), Kimi-User (Moonshot AI) and YandexAdditional (Yandex). Corrected several categories and operators: FacebookBot and TikTokSpider are AI training, Gemini-Deep-Research and Cohere-AI are assistants, Google-CloudVertexBot and PanguBot are data scrapers, Meta-WebIndexer and Cloudflare-AutoRAG are AI search, PanguBot belongs to Huawei, ICC-Crawler to NICT, and Omgili and Webzio-Extended to Webz.io * Improved: Refreshed the bundled MCP server library (WordPress MCP Adapter) to its latest upstream. The notable fix is in the tool validator: tools that take no parameters (whose schema properties come through as an empty object) now validate correctly. VigIA ships a couple of parameter-less abilities, so this hardens its MCP server * Fix: Removed four crawler tokens that no operator actually uses (Groq-Bot, Together-Bot, Replicate-Bot, HuggingFace-Bot) and corrected xAI's crawler token from the non-existent "xAI-Bot" to the real "GrokBot" * Fix: Hardened the admin dashboard against stored XSS. The escapeHtml() helper was using the textContent/innerHTML DOM pattern, which only neutralises &, <, > — not quotes. A request_path containing a literal " (delivered via a raw socket or curl --path-as-is with a known crawler User-Agent) would survive sanitize_text_field(), persist in the database, and break out of quoted HTML attributes (data-path, title, href) when an admin opened the dashboard. Rewritten to use explicit .replace() chains for &, <, >, " and ' = 2.1.0 = * New: Command Palette actions. The WordPress command palette (Cmd/Ctrl+K, admin-wide since WP 6.9) gains two VigIA actions — "Regenerate llms.txt now" and "Regenerate llms-full.txt now" — that rebuild each file from your saved configuration without leaving the current screen. Navigation to VigIA's screens is intentionally left to WordPress, which already lists every admin menu page in the palette, so the plugin only adds the actions WordPress can't generate on its own * Improved: The VigIA admin menu now sits at the bottom of the admin menu (position 999), separated from the content menus, instead of wedging between the content menus near the top * Improved: Refreshed the bundled MCP server libraries — the WordPress MCP Adapter and php-mcp-schema — to their latest upstream versions, so the self-contained MCP server ships current upstream fixes * Fix: Markdown for Agents was emitting links as a bare "(url)" with no anchor text, and images as "!(url)" with no alt text. Links and images were converted correctly, but the final "shortcode artifact" cleanup pass matched the bracketed label of every `[text](url)` and `` and deleted it. The cleanup now uses a negative lookahead so it only strips genuine leftover shortcodes, and inline code and code blocks are protected so brackets such as `$arr[key]` survive * Fix: Markdown for Agents list and code handling rewritten. Nested lists now keep each sub-item's bullet/number and are indented per level (walked with DOMDocument instead of the old flat regexes that dropped the first nested item's marker and all indentation), bold and italics are preserved inside numbered lists (they used to be stripped, unlike bulleted lists), pipes inside table cells are escaped so a cell can't break its column, and the language of a fenced code block is detected from a `language-xxx` class on either the `
` or the `` element
* Fix: Markdown for Agents inline formatting no longer leaks stray `**` / `*` markers. The bold/italic/strikethrough conversion matched the start of any tag beginning with the same letter — `` also caught `