=== Beplus Metadata AI Analyzer ===
Contributors: bearsthemes, minhphamit
Tags: seo, xml sitemap, open graph, schema, structured data
Requires at least: 5.7
Tested up to: 7.1
Stable tag: 1.1.5
Requires PHP: 8.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Lightweight SEO toolkit: meta tags, XML sitemap, Open Graph, focus keyword analysis, breadcrumbs, canonical URLs, robots control & Schema.org JSON-LD.

== Description ==

Beplus Metadata AI Analyzer gives every public post type a dedicated SEO meta
box and adds the technical SEO foundations most sites need, without the
bloat:

* **Meta Tags Management** – custom meta title & description per post with a
  live Google search snippet preview and character counters.
* **XML Sitemap** – a virtual sitemap served at `/sitemap.xml`, cached and
  refreshed automatically when content changes.
* **Open Graph & Twitter Cards** – og:title, og:description, og:image, og:locale,
  article:published_time, twitter:card and friends, with a dedicated OG image
  field and sensible fallbacks (featured image, then site default, then logo).
* **AI/LLM Meta Tags** – Dublin Core (DC.*), Citation meta (citation_title, etc.),
  AI-specific tags (llm:summary, llm:topics), and robots max-snippet hints —
  note that no major search engine documents reading the DC.*, citation_* or
  llm:* tags; they are experimental, citation_* is limited to posts
  (filter `sso_citation_post_types`), and all are optional and individually toggleable from Settings.
* **llms.txt Generator** – serves a machine-readable Markdown summary of your
  site at `/llms.txt` following the llmstxt.org standard, so LLMs can
  understand your site structure and content.
* **Focus Keyword Analysis** – instant, client-side scoring of your focus
  keyword against the title, description, slug, headings and content.
* **Breadcrumbs** – a `sso_breadcrumbs()` template tag and a
  `[sso_breadcrumb]` shortcode, with full sub-category, CPT archive and child
  page hierarchy support. BreadcrumbList JSON-LD is output automatically.
* **Canonical URLs** – automatic canonical tags with a per-post manual
  override for duplicate content.
* **Robots Meta Control** – noindex/nofollow per post, plus site-wide
  defaults per post type and archive.
* **Schema.org (JSON-LD)** – a site-wide Organization/Person + WebSite graph,
  plus per-post-type Article, BlogPosting, WebPage, Product (WooCommerce-aware),
  FAQPage, HowTo, Event, VideoObject, Recipe, JobPosting, Course, Review or
  LocalBusiness structured data, with manual overrides per post and a live
  JSON-LD preview in Settings.

= About BePlus =

This plugin is developed and maintained by BePlus,
a WordPress and Shopify development studio with 10+
years of experience building themes and plugins for
nonprofits and eCommerce brands.

Learn more at [beplusthemes.com](https://beplusthemes.com/).

== Installation ==

1. Upload the plugin to the `/wp-content/plugins/` directory, or install it
   through the Plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Go to **Settings > Metadata AI Analyzer** to configure General, Social,
   Schema, Sitemap and Breadcrumbs options.
4. Edit any post or page to fill in its SEO meta box (General / Social /
   Schema tabs).

== Frequently Asked Questions ==

= Does this plugin create an actual sitemap.xml file? =

No. The sitemap is generated on the fly through a rewrite rule, so it always
reflects your current published content with no extra file to manage.

= Is this compatible with the Block Editor (Gutenberg)? =

Yes. The meta box and the focus keyword analyzer work with both the Block
Editor and the Classic Editor.

= Does the Product schema require WooCommerce? =

WooCommerce is optional. Without it, Product schema still outputs the basic
name/image/description; price, SKU, stock and rating are added automatically
when WooCommerce is active.

= What happens to my data when I delete the plugin? =

Deleting the plugin (not just deactivating it) removes all of its options and
post meta from the database via `uninstall.php`.

= Who develops this plugin? =
This plugin is developed and maintained by BePlus, a WordPress and Shopify development studio. You can learn more about our work at [beplusthemes.com](https://beplusthemes.com/).

== Screenshots ==

1. SEO meta box with Google snippet preview and focus keyword analysis.
2. Schema settings tab with a live JSON-LD preview.

== Changelog ==

= 1.1.5 =
* Fix: saving a post no longer runs hundreds of transient deletes; revisions and autosaves are skipped.
* Fix: a single robots meta tag is now output (merged into WordPress core's), so it no longer conflicts with "Discourage search engines".
* Fix: password-protected posts are excluded from the sitemap and llms.txt.
* Removed: Google sitemap ping (Google retired the endpoint). The plugin no longer makes external requests.

= 1.1.4 =
* Fix: uninstall now removes all Schemas assignment data, Schemas entries and sitemap caches.
* Fix: Schemas "Assign To" search rate limit works without an object cache and only lists posts you can edit.
* New: Advanced tab option to hide the plugin's HTML comment in the page head.
* Improved: more robust saving of schema fields in the post editor.

= 1.1.3 =
* Improvement: the Schemas "Specific pages/posts" search box now shows a
  clear "Enter at least 2 characters" hint instead of silently doing
  nothing when fewer than 2 characters are typed.
* Improvement: identical searches by the same admin are now cached for 60
  seconds, and each admin is limited to 10 new (uncached) searches per
  minute, reducing database load from rapid typing. Existing nonce and
  capability checks are unchanged.
* Dev: CI now activates the plugin against an installable WordPress 7.1.1
  to catch activation-time errors earlier.

= 1.1.2 =
* Fix: the "Specific pages/posts" search box on a Schemas entry (Assign
  To > Specific pages/posts) never returned any results — the field
  silently degraded to a plain unstyled multi-select with no way to
  search, because the search UI depended on the `select2` library which
  was never actually loaded/bundled by the plugin, and its backing AJAX
  search handler (`sso_search_target_posts`) had never been implemented.
  Replaced with a lightweight, dependency-free search box (plain
  JS + AJAX, no select2), and implemented the missing search endpoint.
  Existing assignments are unaffected; this only restores the ability to
  search and add new pages/posts from the UI.

= 1.1.1 =
* Fix: Schemas CPT "specific page/post" assignment (Assign To > Specific
  pages/posts) never actually matched, since the entry was introduced in
  1.1.0 — the internal lookup compared against a quoted-string pattern
  that never matches how WordPress serializes an integer post ID array,
  so the schema silently fell back to the post-type or whole-site tier
  instead. "Every post of a post type" and "Whole site" assignments were
  not affected. No admin-facing change; existing assignments now resolve
  correctly without needing to be re-saved.

= 1.1.0 =
* New: "Schemas" custom post type — assign a reusable Schema.org type to a
  specific page/post, to every post of a post type, or to the whole site
  (new "Whole site" Assign To option) from Beplus Smart SEO > Schemas.
* New: "Settings" submenu under Beplus Smart SEO for quicker access to the
  main settings screen.
* Change: removed the old Settings > Schema tables (Schema per Post Type,
  Schema by Page Template, Schema by Category/Tag) — replaced by the
  Schemas custom post type above. Re-create any rules you had configured
  there as Schemas entries after updating.
* Fix: all JSON-LD (Organization/WebSite graph, per-post schema,
  breadcrumbs) now outputs in `<head>` instead of the page footer.
* Fix: a "Whole site" Schemas entry now actually renders on every page,
  including the homepage and archive pages, not only single posts/pages.

= 1.0.5 =
* New: Schema type can now also be assigned by Page Template or by
  Category/Tag, in addition to the existing per-post-type default and
  per-post override. Category rules are checked before tag rules;
  Page Template rules take priority over both. See Settings > Schema.

= 1.0.4 =
* New: sitemap entries now include a `<priority>` value (1.0 for the front
  page/static pages, 0.7 for posts, 0.5 for taxonomy term archives) —
  standard practice among SEO plugins.
* New: `/sitemap.xml` and every `/sitemap-N.xml` now link an XSL stylesheet
  so opening the link directly in a browser shows a readable HTML table
  instead of raw XML — purely cosmetic, search engines are unaffected.
* Maintenance: `Requires PHP` raised to 8.1 (7.4 reached end-of-life in
  November 2022 and no longer receives security patches).

= 1.0.3 =
* New: the XML sitemap now automatically becomes a paginated sitemap index
  on large sites. Up to 2,000 URLs it stays a single `/sitemap.xml` (no
  change for most sites); above that, `/sitemap.xml` turns into a
  `<sitemapindex>` pointing at `/sitemap-1.xml`, `/sitemap-2.xml`, … each
  holding 2,000 URLs. This avoids building one huge sitemap in memory (which
  could time out or exceed limits on sites with tens of thousands of posts)
  and matches how WordPress core paginates its own sitemaps.
* Compatibility: tested up to WordPress 7.1.

= 1.0.2 =
* Fix: `robots.txt` now correctly points to the plugin's own `/sitemap.xml`
  instead of WordPress core's default `/wp-sitemap.xml`, so search engines
  discover the sitemap that actually respects this plugin's noindex/exclude
  settings.
* Fix: the "Enable XML sitemap" and "Enable llms.txt" checkboxes in Settings
  can now actually be turned off. Because each of those settings tabs
  contained only a single checkbox, unchecking it and saving submitted no
  data for that tab at all (standard HTML checkbox behavior), so the plugin
  silently kept the previous "enabled" value — the toggle looked stuck on.
* Fix: readme documentation corrected — the breadcrumb template tag and
  shortcode are `sso_breadcrumbs()` / `[sso_breadcrumb]` (not the old
  `bpmaa_*` names left over from an earlier plugin rename).

= 1.0.1 =
* Fix: "Noindex" archive checkboxes (tag/author/date) in Settings → General now
  persist correctly when unchecked, instead of silently reverting to noindex.
* Fix: XML sitemap now excludes posts noindexed via a post type's site-wide
  default, not just posts noindexed individually.
* Fix: canonical URLs for paginated archives (blog index, category/tag/tax,
  post type archives, author archives) now point at the current page instead
  of always page 1.
* Fix: the "Choose Image" media picker (OG image, default OG image, schema
  logo) now only allows selecting images.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==

= 1.1.5 =
Faster post saves, a single non-conflicting robots meta tag, and password-protected posts no longer appear in the sitemap or llms.txt. Requires WordPress 5.7+.

= 1.1.4 =
Cleaner uninstall, safer Schemas search, and an option to hide the head HTML comment.

= 1.1.3 =
Improves the Schemas Assign To search: caching, rate limiting, and a
clearer minimum-character hint. No action needed.

= 1.1.2 =
Fixes the Schemas Assign To search. This version requires PHP 8.2 or newer;
confirm your server PHP version before updating. Existing assignments remain intact.

= 1.1.0 =
Replaces the old Schema per Post Type/Template/Category settings with a new
Schemas custom post type (includes a "Whole site" option). JSON-LD now
outputs in <head>. Re-create any old per-template/category schema rules as
Schemas entries after updating.

= 1.0.4 =
Sitemap URLs now include priority values and a readable HTML view when
opened directly. Requires PHP 8.1+ (was 7.4, now end-of-life).

= 1.0.3 =
Large sites now get a paginated sitemap index (/sitemap-N.xml) automatically;
tested up to WordPress 7.1. No change for sites under 2,000 URLs.

= 1.0.2 =
Fixes robots.txt pointing to the wrong sitemap, the Sitemap/llms.txt enable
toggles not saving when turned off, and corrects the breadcrumb
function/shortcode names in the docs. Recommended update.

= 1.0.1 =
Fixes noindex settings persistence, sitemap/robots consistency, paginated
archive canonical URLs, and the image picker. Recommended update.

= 1.0.0 =
Initial release.

== External Services ==

This plugin does not make any external requests.
