Visibility — 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 ==".

= 1.8.0 =
* New: Your site structure in llms.txt. Add taxonomy archive sections — the categories, tags or custom taxonomies you choose — to /llms.txt, each listing its terms with their archive URL and entry count, so AI agents see how your content is organized, not just the individual entries.
* New: WooCommerce product details in Markdown. The .md version of a product now carries its SKU, price, currency, stock status and rating in the YAML frontmatter, next to its product categories and tags.
* Improved: llms.txt and Markdown now share their content rules. A post you keep out of llms.txt, with the per-post exclude flag or a URL pattern, is also withheld from its .md, so both AI surfaces stay consistent.
* Improved: Richer Markdown frontmatter. Every .md now lists its categories and tags by name and sends an X-Markdown-Tokens header with an estimated token count, so agents can size the read before fetching it.
* Improved: llms.txt lists everything. The per-type entry cap is gone — the index now includes every published entry of each selected type. You can also include whole taxonomies at once, not only individual terms.
* Improved: Your robots.txt always prevails. Visibility now references your llms.txt from robots.txt, and when another plugin writes a physical robots.txt that the web server would serve instead, it merges its own directives into that file in a BEGIN/END block, leaving every other block untouched, so your AI-crawler rules always reach crawlers.
* Improved: Your llms.txt always prevails. While llms.txt is enabled, Visibility's index is what gets served: if another plugin leaves a physical llms.txt that would shadow the dynamic one, Visibility replaces it (and llms-full.txt when that is enabled). Turning the endpoint on in Visibility is taken as your decision to let it manage the file, so an incomplete llms.txt from another llms or SEO plugin cannot take over.
* Fix: Saving the Discover settings now applies the physical llms.txt / robots.txt change from the values you just saved, not the previous ones, so toggling the physical-file mode takes effect on the same save instead of the next page load.

= 1.7.1 =
* Improved: Visibility now guarantees a single, always-served robots.txt. Left to WordPress alone, /robots.txt is only answered on root installs after the rewrite rules are flushed; on a subdirectory install, or with stale rules, WordPress 404s it and the directives are only reachable at /?robots=1. Visibility removes that fragility: it serves /robots.txt itself whenever there is no physical file (on any install), lets the web server serve a physical file when one exists, and 301-redirects WordPress's /?robots=1 endpoint to /robots.txt. Your AI-crawler and indexing rules always load from one canonical URL.
* Improved: When a physical llms.txt or robots.txt from another plugin shadows Visibility's dynamic one, the Discover tab now points you to the one-click fix (turn on "write to physical file" so Visibility takes the file over and keeps it in sync) instead of only suggesting you remove it. The warning no longer appears when Visibility already manages the physical file itself.
* Fix: The Discover tab crashed with a fatal error ("Class Native_AEO_Pack_Frontend_LLMS not found") whenever the llms.txt or the Markdown feature was turned off, or the Discover module was inactive. The settings screen now always loads the classes it needs to render the llms.txt, Markdown and robots.txt sections, so the tab opens in every configuration.
* Fix: Removing the product category base now works with any custom WooCommerce product category base, not just the default "product-category". The base was hardcoded, so any renamed base (set in WooCommerce → Settings → Products → Permalinks), and on a non-English WooCommerce even its translated default base, was left in the URLs and the old links were not redirected. The base is now read from the registered taxonomy, whatever its value.
* Fix: With "remove the category base" enabled, a category or product category created or renamed afterwards served its clean URL as a 404 until permalinks were saved again, because the base-less rewrite rules were only rebuilt on save. They are now refreshed automatically whenever a category or product category is added, renamed or removed.

= 1.7.0 =
* New: Site Identity. Visibility adds the Organization or Person and WebSite JSON-LD for your site (logo, description, social profiles as sameAs and an optional SearchAction for Google's sitelinks search box), on the home page or a page you choose. The WebSite node also points AI agents to your llms.txt, llms-full.txt and Markdown endpoints with ReadAction entries. The Article and Person graphs reference it, so search engines and AI assistants can identify who is behind the site without a companion plugin.
* New: llms.txt. Serve a Markdown index of your site at /llms.txt, and optionally /llms-full.txt with the full text of each page, for LLMs and AI agents. Built on the fly with no file on disk and no cron, or written as a physical file if you prefer. Choose which content types to include and how many per type, restrict it to specific taxonomy terms, force individual pages in or out, and exclude URLs by pattern.
* New: Markdown for agents. Serve a clean Markdown version of any post or page at its URL with a .md suffix (for example /hello-world.md), with a YAML frontmatter block, so AI agents can read the content without the page chrome. The same Markdown is also returned when a client requests it with an Accept: text/markdown header, and it is advertised with both an alternate link tag and a Link header. Taxonomy archives (the categories, tags or custom taxonomies you choose) can be served as Markdown too.
* New: robots.txt editor. From the Discover tab, manage the directives Visibility adds to your robots.txt: pick exactly which AI crawlers to Disallow from a grouped, selectable list (model-training crawlers, and AI search and assistant crawlers), add your own rules, and preview the final file live. Served through the native robots.txt by default, or written to a physical robots.txt when one shadows the virtual file, seeded with the rules WordPress already serves (the core directives and the Sitemap line) so nothing is lost and anything already there is preserved.
* Improved: The settings sections on every tab are now collapsible, with a subtle index at the top of each tab to jump between them. Your open or closed preference is remembered per browser.

= 1.6.0 =
* New: Redirects — a new module with a lightweight redirect manager. Send old or moved URLs to a new destination with a 301, 302, 307 or 410, matched by exact path. Redirects are stored in a WordPress option and resolved in PHP on every request, so they work on any server with no .htaccess, no custom database table and no 404 log. From the Redirects tab you can add, edit and delete them (with a post search to fill the target), find and bulk-delete them in a paginated, instant-search table, and import or export the whole list as CSV, including CSV files exported by other redirect plugins such as Redirection.
* New: Beyond the redirects you create, the Redirects tab surfaces two more kinds for you to manage: the slug-change redirects WordPress makes on its own when a published post's URL changes (take one over to edit it, or remove it), and a suggested redirect for the URL of any published post you trash or delete (turn it into a 301 or a 410, or dismiss it). Nothing is created without your action, and restoring a post clears its suggestion.
* Improved: When you import from Rank Math or SEOPress, your redirects come over too, non-destructively (your existing redirects win and re-running never duplicates).

= 1.5.0 =
* New: Schema @type selector per content type, with a per-entry override. Pick the JSON-LD type written on each post type's singulars from the Article family (Article, BlogPosting, NewsArticle, TechArticle, ScholarlyArticle, Report) or the page types (WebPage, AboutPage, ContactPage, CollectionPage, ProfilePage, ItemPage). Each entry can override its type from its own editor. Rich types that need data the content does not provide (Recipe, Product, Event...) are intentionally left to the plugins that own them.
* New: Per-entry social title and social description, in the Block Editor panel and the Classic Editor meta box. They override og:title / twitter:title and og:description / twitter:description for that entry, for when the shared text should differ from the meta title and description.
* Improved: The one-click importer from Yoast SEO, Rank Math and All in One SEO now also brings over per-entry social titles and descriptions, the per-content-type schema @type (when it matches a supported type), and the default social image. The import card shows the new Social and Schema columns in its per-plugin breakdown.
* Improved: Admin UI consistency — monospace placeholders across the meta boxes and settings fields, and the Block Editor panel labels and headings now follow the same styling as the Classic Editor meta box.
* Fix: The Article, WebPage, BreadcrumbList and Person JSON-LD was printed with HTML-encoded quotes, so structured-data validators (including Google's Rich Results Test) rejected it as malformed and read no schema at all. It is now written as a valid inline JSON-LD script and parses correctly. The schema image also resolves through the same chain as og:image (per-post override, featured image, then site fallback) instead of only the featured image.
* Fix: The Open Graph image button in the Classic Editor meta box did nothing when clicked, because the WordPress media library was not loaded on post edit screens. It now opens the media picker as expected; the Block Editor was unaffected.

= 1.4.0 =
* New: Optional removal of the `/category/` base (and WooCommerce's `/product-category/`) from category URLs, with 301 redirects from the old URLs and an automatic permalink refresh on save.
* New: Optional 301 redirect of attachment pages to their parent post. Only the attachment page is redirected; the media file keeps working.
* New: Configurable document title separator, the character placed between the page title and the site name in the automatic title.
* Improved: The one-click importer from Yoast SEO, Rank Math and All in One SEO now also brings over those three site-wide options when the suite had them set.
* Improved: Settings labels and descriptions now use standard SEO terminology (the wording Google Search Central uses).
* Improved: Consistent heading styles across the settings tabs; the Indexing tab subsections no longer use uppercase headings.

= 1.3.0 =
* Improved: The plugin is now called Visibility (Native SEO, AEO & GEO). Same plugin, same settings and data — only the displayed name, links and project home change. New home at https://visibility.quest.

= 1.2.0 =
* New: One-click importer from Yoast SEO, Rank Math and All in One SEO (v4) on the Overview tab. It copies your meta titles, meta descriptions, canonical URLs, noindex / nofollow overrides and Open Graph images on posts of any type, plus the per-term meta titles, meta descriptions and noindex / nofollow overrides on taxonomy terms (categories, tags, custom taxonomies), into Native SEO Pack, with a per-plugin, per-field breakdown of what is pending and what was imported. Non-destructive and idempotent: values you already set in Native SEO Pack always win, nothing is changed in the source plugin, re-running never duplicates, and titles or descriptions built from the suite's template variables are skipped (Native SEO Pack generates those from your real content). Works even when the suite is already deactivated, as long as its data is still in the database.
* New: Per-term meta title and meta description for taxonomy archives (categories, tags, custom taxonomies), editable from the term edit screen. They replace the document title, og:title, twitter:title, meta description and og:description on that term archive; the term name and the term description remain the fallbacks.
* New: Per-post Canonical URL override, in the Block Editor panel and the Classic Editor meta box. Replaces `rel=canonical` and `og:url` for that entry — for syndicated or duplicate content whose ranking signals should point to another URL.
* Fix: Uninstall now also removes the plugin's internal flag options and any leftover cached Gravatar transients, leaving no orphaned rows in wp_options.

= 1.1.0 =
* New: One-click importer to bring your data and settings over from the previous AyudaWP SEO plugins (Native SEO Meta Tags, NoIndexer, Native SEO Sitemap Customizer). It copies per-post, per-term and per-author values plus each plugin's site-wide configuration, shows a per-plugin breakdown of what is detected and imported, merges lists, keeps any value you already changed in Native SEO Pack, and never removes anything from the old plugins.
* Improved: Sitemaps module can now exclude attachment pages.
* Improved: renamed to Native SEO Pack.

= 1.0.0 =
* Initial release. Native SEO Pack unifies the functionality previously split across the three legacy AyudaWP SEO plugins (Native SEO Meta Tags, NoIndexer, Native SEO Sitemap Customizer) into a single lightweight plugin built around WordPress native features.
* Discover module: per-post meta title, meta description and Open Graph image; automatic title and description from native fields; Open Graph and Twitter Card with smart image fallback chain (per-post → featured → WooCommerce gallery → first inline → settings fallback); Article + BreadcrumbList JSON-LD on singulars; Person JSON-LD on author archives with `sameAs` from six social URL fields added to the user profile screen; coordination with VigIA's Site Identity JSON-LD via `@id` references.
* Indexing module: bulk noindex / nofollow by post type and taxonomy; per-post and per-term overrides with explicit "exclude from bulk" inversion; additional rules for search, 404, date archives, pagination (including block-theme Query Loops), attachment pages and author archives; X-Robots-Tag HTTP header for five feed types (main, taxonomy, author, site-wide comments, per-post comments); `rel="nofollow"` checkbox in the Classic Editor link popup.
* Sitemaps module: filters every `wp_sitemaps_*` hook to exclude post types, taxonomies, specific posts and terms (by ID or slug pattern), users by role or ID; customizable max URLs per sub-sitemap; lastmod dates on entries and on the sitemap index; cross-feature link that keeps anything flagged as noindex out of the XML sitemap automatically.
* Settings UI: top-level menu in the admin sidebar, four tabs (Overview, Discover, Indexing, Sitemaps), iOS-style master toggles, tabs of disabled modules are dimmed with an "Off" badge and their forms rendered `inert`, in-context notices when WordPress is set to discourage search engines or when another SEO plugin / legacy AyudaWP plugin is active.
* Editor integration: unified meta box on the Classic Editor (Meta Tags + Robots sections), unified PluginDocumentSettingPanel on the Block Editor with the same fields, Quick Edit and Bulk Actions for noindex / nofollow on every public post type list table, Robots column with index/follow status icons.
* Term integration: noindex / nofollow checkboxes on the edit-term form of every public taxonomy plus the Robots column on the term list table.
* Detection: warns when a full SEO plugin is active (Yoast SEO, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO, SureRank) or when a legacy AyudaWP plugin (Native SEO Meta Tags, NoIndexer, Native SEO Sitemap Customizer) is active. Native SEO Pack never silences its own output — the user decides which plugin stays.
