=== Livada SEO ===
Contributors: livada
Tags: seo, schema, sitemap, redirects, local-seo, woocommerce, multilingual, indexnow, ai
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.14.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Lightweight zero-bloat SEO: schemas, sitemaps, redirects, 404 monitor, bulk editor, audit, AI alt-text, hreflang, multi-LocalBusiness, AEO, MCP server.

== Description ==

**Livada SEO** is a fast, opinionated SEO plugin built for tourism, hospitality and local-business sites that don't want to pay €99–€257/year per site for Yoast Premium + add-ons or Rank Math PRO.

It ships **zero front-end JavaScript** and zero front-end CSS (except an opt-in 1 KB stylesheet for breadcrumbs). The admin UI stays clean and the database stays small.

= What's in the box =

* **Meta** — title templates, meta description, canonical, robots
* **XML sitemap** — multi sub-sitemap, image + video tags, 12 h transient cache
* **Google News sitemap** — auto-listed when posts within the last 48 h match
* **HTML sitemap** — opt-in, accessible
* **Schemas** — WebSite, Organization, **Campground / LodgingBusiness / Hotel / Bed & Breakfast / Resort / Hostel / Motel / Restaurant / Store / Tourist Attraction**, Article, FAQPage, HowTo, Product, Event, Recipe, Review, Offer, Service. Every type configurable per-post.
* **Multi-location LocalBusiness** — N business locations under one WP install (one camping group, hotel chain, multi-outlet restaurant, …)
* **Open Graph & Twitter Cards** — auto-fill + per-post OG image override
* **Redirect manager** — 301/302, hit counter, search, bulk delete, **CSV import/export**
* **404 monitor** — throttled logging, top 200 paths, **one-click "convert to redirect"**
* **Bulk editor** — edit titles / meta descriptions / focus keywords / noindex flags across N posts at once with AJAX-per-cell save
* **Site Audit** — daily WP-Cron crawl, 8 per-post checks + 5 site-wide checks, sortable dashboard, CSV export, REST + WP-CLI
* **On-page analysis** — 16 SEO checks + Flesch reading-ease score, live in the metabox
* **Internal link suggestions** — live in the metabox, scored, with "cornerstone" boost
* **Cornerstone marker** — flag your flagship articles, get them at the top of internal-link suggestions
* **Hreflang** — native support for **Polylang, WPML, TranslatePress** and per-post manual JSON override
* **AEO / GEO** — `/llms.txt`, `/llms-full.txt`, AI content markers, speakable schema, max-snippet directive — designed for ChatGPT, Perplexity, Claude, Gemini, AI Overviews
* **IndexNow** — async ping to Bing/Yandex via WP-Cron
* **Image SEO bulk** — list every attachment missing alt-text, edit inline, bulk-apply, optional **one-click AI alt-text generation** via the Anthropic API
* **WooCommerce** — Product + Offer + AggregateRating + Review schemas auto-emitted, with variation support
* **Yoast / SEOPress importer** — batched, lossless, picks up post meta, title/desc templates, social profiles, and Yoast Premium redirects
* **Robots.txt manager** — virtual robots.txt with a sitemap directive
* **Analytics injection** — GA4, Matomo, Microsoft Clarity, plus a custom `<head>` slot
* **Full REST API** — every plugin action is exposed under `/wp-json/livada-seo/v1/*` with `manage_options` permission
* **Full WP-CLI** — `wp livada-seo settings|meta|redirects|import|sitemap|audit|analyze`
* **MCP server for Claude Code** — bundled TypeScript Model Context Protocol server lets Claude Code directly drive every endpoint from a chat conversation

= Why this and not Yoast Premium or Rank Math PRO? =

* **Free** — single-tier, GPL, no upsell notices
* **Lighter** — 0 KB front-end JS/CSS vs ~80 KB for Yoast, ~60 KB for Rank Math
* **AEO native** — none of the top-5 SEO plugins ship `/llms.txt` or AI markers in 2026
* **Multi-LocalBusiness without an addon** — Yoast Local is a $79/year add-on; Livada includes it
* **TranslatePress hreflang** — only Livada ships an adapter; competitors target Polylang/WPML only
* **MCP integration** — manage your SEO config from Claude Code or any MCP client

= Designed for =

* Camping / hotel / B&B sites
* Local-business multi-outlet operators
* Multilingual tourism sites (FR/EN/NL/DE/IT)
* Developers who want code they can actually read and modify
* Anyone tired of paying €99+/year per site for the same 12 features

== Installation ==

1. Upload the `livada-seo` folder to `/wp-content/plugins/`, or install directly from the WordPress.org Plugins screen.
2. Activate the plugin through the **Plugins** menu in WordPress.
3. Go to **Livada SEO → General** to configure the active modules and (optionally) your Anthropic API key for AI alt-text.
4. Open **Livada SEO → Schema** and **Livada SEO → Locations** to fill in your business data.
5. (Optional) Migrate from Yoast or SEOPress under **Livada SEO → Tools**.
6. Run the first **Site Audit** under **Livada SEO → Site Audit**.

= Migrating from Yoast SEO =

1. Keep Yoast active during the import.
2. Go to **Livada SEO → Tools → Import from Yoast SEO** and click **Start Import**.
3. The import is batched (50 posts per request) and migrates titles, meta descriptions, focus keywords, canonical URLs, OG images, robots flags, site-wide title templates, social profiles, and Yoast Premium redirects.
4. After the import succeeds, deactivate Yoast and verify a few posts manually before deleting it.

= Migrating from SEOPress =

Same flow, under **Livada SEO → Tools → Import from SEOPress**.

== Frequently Asked Questions ==

= Does it work with Elementor / JetEngine / ElementsKit? =

Yes. The on-page analyzer renders Elementor content for accurate scoring. The sitemap auto-strips template-only post types (`elementor_library`, `jkit-header`, `jkit-footer`, `e-landing-page`, `oceanwp_library`, `astra-advanced-hook`, `cartflows_step`, `cartflows_flow`, `fl-builder-template`, `wpbakery_layout`, `tcb_lightbox`, `brizy-template`, `jet-*`) so they never leak into the index.

= Does it work with WooCommerce? =

Yes. The `woocommerce` module emits Product + Offer + AggregateRating + Review JSON-LD on product pages, and auto-augments the sitemap to include `product`, `product_cat`, `product_tag` when WooCommerce is active.

= Does it work with TranslatePress? =

Yes. Native hreflang adapter pulls translated URLs from `TRP_Url_Converter` and silences TranslatePress's own hreflang output to avoid duplicates. Polylang and WPML are also supported, plus a per-post manual JSON override.

= How does the AI alt-text generation work? =

Add an Anthropic API key under **General Settings**. The key is stored encrypted at rest with AES-256-CBC using a key derived from your `wp_salt('auth')`. The bulk image editor's **AI** button calls the Claude API with a vision-capable prompt and pre-fills the alt field with a ≤125-character suggestion you can edit before saving. You can also wire any other provider via the `livada_seo_image_bulk_ai_provider` filter.

= Is the plugin compatible with caching plugins? =

Yes. Sitemaps set `DONOTCACHEPAGE` and a `Content-Type: application/xml` header, so page-cache plugins skip them automatically. The 404 monitor uses object-cache throttling (60 s per path) so logging won't flood the DB even under bot traffic.

= How do I use the bundled MCP server? =

The `mcp-server/` directory ships a Node.js stdio MCP server. Build it once with `npm install && npm run build`, then register it with Claude Code:

    claude mcp add livada-seo \
      --env WP_URL=https://example.com \
      --env WP_USER=admin \
      --env WP_APP_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx" \
      -- node /absolute/path/livada-seo/mcp-server/dist/index.js

Generate the Application Password under **Users → Profile → Application Passwords**. The MCP exposes 28 tools covering settings, meta, redirects, audit, locations, images, AI alt-text, sitemap diagnose, IndexNow, and more.

= Will it conflict with Yoast / Rank Math / AIOSEO / SEOPress? =

The plugin detects and warns about active SEO plugin conflicts on the admin notices bar. You can keep them active during a migration, but you should only run one in steady state.

= How do I uninstall cleanly? =

Use **Plugins → Delete**. The `uninstall.php` removes every option, every post meta with the `_livada_seo_` prefix, both custom tables (redirects + 404 log), every plugin transient, and clears scheduled cron events.

== Screenshots ==

1. Dashboard with clickable issue cards.
2. Site Audit page with summary cards + per-post grades.
3. Bulk Editor — edit dozens of posts at once.
4. Multi-location LocalBusiness configuration.
5. Image SEO bulk with AI alt-text generation.
6. SEO metabox with desktop/mobile SERP preview, live checks, and internal-link suggestions.

== Changelog ==

= 1.14.1 — 2026-06-01 =
* Fixed: **Wikidata entity ID field was auto-filled by browsers with the admin email address.** Chrome / Firefox / Safari aggressively auto-complete any plain `<input type="text">` with stored values (most commonly the admin email). Observed in production: the Wikidata field arrived pre-filled with `livada@gmx.fr`; the server-side regex `^Q\d+$` correctly rejected it, but the previously stored Q-id was silently wiped on every Save. Two-layer fix: (a) the HTML input now carries `autocomplete="off"` + `data-lpignore="true"` + `data-1p-ignore="true"` + `spellcheck="false"` to block the browser at the source; (b) the save handler now PRESERVES the previously stored value when the submitted value is non-empty but malformed (assume autofill), and only clears the setting when the input is explicitly empty. Recommended for anyone running 1.14.0 — re-open Réglages → AEO and Save once to confirm your Q-id sticks.

= 1.14.0 — 2026-06-01 =
* Added: **Signal 11 — Wikidata entity (off-site identity).** New AEO setting `aeo_wikidata_id` (format Q followed by digits, e.g. Q140007358) in General Settings → AEO — Knowledge Graph. When filled, the canonical Wikidata URL `https://www.wikidata.org/entity/Qxxxx` is automatically appended to the schema `sameAs` array of the primary LocalBusiness/Organization entity. This anchors the business in the structured knowledge base that ChatGPT, Perplexity, Gemini, Claude and Google AI Overviews consult to identify and cite real-world entities.
* Added: **AI Visibility — 11th check.** The score now evaluates Wikidata presence (max 8 points). Green when a valid Q-id is declared (and auto-injected into sameAs); orange when the value is set but malformed; red when no Wikidata entity is declared. Zero external HTTP call — purely setting-driven, matching the plugin's "no per-client API cost" design constraint.
* Notes: Existing sites scoring 100/100 will temporarily lose ~8 points until their Wikidata Q-id is declared, then return to 100 — by design, to surface the new actionable lever.

= 1.8.5 — 2026-05-05 =
* Added: **AEO — Knowledge Graph admin UI.** New "AEO — Knowledge Graph" section in General Settings exposes the four organization fields that previously had no UI: organization description, founding year, founder name, and areas of expertise (knowsAbout, one topic per line). Used by both the Organization JSON-LD entity and /llms.txt.
* Fixed: **Knowledge Graph @type was hardcoded to Organization.** The front-page Organization JSON-LD now reflects the configured Schema → Business Type. A hotel emits @type:Hotel, a campground emits @type:Campground, a restaurant emits @type:Restaurant, etc. The @id is also derived from the type (/#hotel, /#campground, …). Allow-list: Hotel, Campground, BedAndBreakfast, LodgingBusiness, Resort, Hostel, Motel, VacationRental, Restaurant, LocalBusiness, Store, TouristAttraction, MedicalBusiness, HealthAndBeautyBusiness, SportsActivityLocation, GovernmentOrganization, NGO. Anything else falls back to Organization.
* Fixed: **/llms.txt "Content" section listed WordPress categories instead of the curated expertise topics.** When `aeo_org_knows_about` has entries, /llms.txt now uses those for "This site publishes content about: …". Falls back to WP categories only when the field is empty.
* Added: **/llms-full.txt now lists Pages before Posts.** A new "## Pages" section (max 50, ordered by menu_order then title) is emitted before "## Posts" so AI engines see the static high-value pages (Rooms, Rates, Restaurant, Contact) on hospitality / service sites.

= 1.8.4 — 2026-05-01 =
* Fixed: **Dashboard "Sitemap refresh" and "IndexNow" cron events stayed "not scheduled" forever.** They are not recurring crons by design — sitemap is a 12 h transient cache invalidated on save_post, IndexNow uses one-shot scheduled events per URL change. The dashboard now shows the sitemap cache freshness ("fresh — refreshes in 11 hours" or "on demand") and the next pending IndexNow ping ("ping in 30 seconds" or "on demand"). The `wp livada-seo doctor` command was updated to match.
* Fixed: **Sitemap cache freshness query targeted a non-existent transient key** (`livada_seo_sitemap_index`). The sitemap module actually stores per-post-type / per-taxonomy transients prefixed `livada_seo_sitemap_*`. The dashboard and doctor command now query the maximum expiry across all of them.

= 1.8.3 — 2026-05-01 =
* Fixed: **Score not recalculated when meta updated via REST API.** `PUT /livada-seo/v1/meta/{id}` and `/meta/bulk` now call `analyze()` after writing. Standard WP REST `/wp/v2/posts/{id}` updates (title, content, featured_media) also trigger re-analysis via `rest_after_insert_post`. Direct `_thumbnail_id` changes (Quick Edit, custom plugins) trigger re-analysis via `updated_post_meta`.
* Fixed: **`No images found in content` no longer scores RED.** Service / listing pages without inline images are now scored ORANGE instead — featured image is a separate signal that stays RED on its own when missing.

= 1.8.2 — 2026-05-01 =
* Fixed: **Focus keyword matching is now accent-insensitive and word-aware.** "réparation PC Castellane" now correctly matches "Réparation et maintenance PC à Castellane" in titles, descriptions, H1s, first paragraphs, URL slugs, and density. New normalisation helper strips diacritics (NFD via intl + fallback table) and matches on a per-word basis when the contiguous phrase isn't found.
* Fixed: **Featured image detection** — `_thumbnail_id` written via REST `featured_media` is now picked up correctly even when the WP object cache hasn't been refreshed. Triple-check (helper + meta + getter).
* Fixed: **Elementor HTML widgets are now analysed.** When `Elementor\Plugin::frontend->get_builder_content()` returns empty (common during save_post in REST contexts), the analyser walks the raw `_elementor_data` JSON tree and extracts text from html, editor, heading, button, and image widgets. Pages built with HTML widgets no longer score 0.
* Fixed: **URL slug match is now word-by-word.** Slug "reparation-maintenance-pc-castellane" matches keyword "réparation PC Castellane" because every keyword word is found, even when intermediate slug segments interleave.

= 1.8.1 — 2026-04-30 =
* Fixed: **"Check for updates" link returned "Le lien suivi est expiré"** because the post-redirect URL (`?livada_seo_check_update=done`) re-triggered the nonce verifier with no nonce in the query. The handler now only acts when the parameter equals `1` and ignores the redirect marker, so the round-trip completes cleanly.

= 1.8.0 — 2026-04-30 =
* Added: **Self-hosted update checker.** The plugin now polls a JSON manifest at `https://livada.fr/livada-seo-updates/info.json` every 12 hours and surfaces new versions on the WordPress Extensions page exactly like a wp.org plugin would. Click "Mettre à jour maintenant" to upgrade in place — no SFTP, no manual ZIP upload. Also adds a "Check for updates" link on the plugin row to bypass the 12 h cache. Workflow + manifest schema documented in `UPDATES.md` and `info.example.json`.
* Added: `Update URI:` plugin header pointing to the manifest, so WordPress knows this plugin manages its own updates and never fetches from wp.org by mistake.
* Added: Filters `livada_seo_update_url`, `livada_seo_update_cache_ttl`, `livada_seo_update_disabled` for dev / staging overrides.

= 1.7.1 — 2026-04-30 =
* Fixed: **robots.txt rendered on a single line** when the stored content lost its line breaks (DB import quirk, copy-paste from a flattened source). The Robots module now normalises CRLF/CR to LF, defensively splits glued directives by injecting newlines before known keywords (`User-agent:`, `Allow:`, `Disallow:`, `Sitemap:`, `Crawl-delay:`, `Host:`), trims trailing whitespace per line, and ensures a final LF. Output is now always one directive per line, regardless of how the option got stored.

= 1.7.0 — 2026-04-30 =
* Added: **Onboarding wizard** — 4-step welcome page (business basics → modules → optional Anthropic key → first audit) that fires once on first activation. Skippable at any time, persists each step immediately.
* Added: **AI rewrite mode** — fourth `type` for the AI suggester. Pass arbitrary text as `extra` (or fall back to the post excerpt) and the model returns a rewritten version that keeps language + facts + length. Available via the metabox-side AI surface, the REST endpoint, and the MCP tool.
* Added: **Google Search Console keywords import** — under Tools, upload a "Top queries" CSV exported from GSC; Livada matches each URL to a post and stores the top 25 keywords with clicks / impressions / position. Surfaced in the SEO metabox as a collapsible "Search Console — top queries" panel.
* Added: **Internal Link Graph** module + admin sub-menu. Crawls every published post, counts inbound / outbound internal links, flags orphan posts, top hubs, and lonely cornerstones (cornerstone with zero inbound links). 12-hour cache, AJAX rebuild button, dashboard cards filter the view by type.
* Added: **Programmatic OG image generator** (opt-in module `og_image`). Renders a 1200×630 PNG on demand at `/wp-json/livada-seo/v1/og-image/{post_id}.png` when no custom OG image is set on the post. Brand color + accent color settings; system-font detection with GD built-in font 5 fallback. Cached 24 h per post.

= 1.6.0 — 2026-04-30 =
* Added: **Settings JSON export / import** under Tools — back up the full plugin configuration (settings + multi-location data) as a portable JSON file and re-import it on another site or after a reset. The Anthropic API key is intentionally stripped from the export.
* Added: **Activity Log** — new dedicated table `{prefix}livada_seo_activity_log` (capped at 1 000 rows, auto-trimmed on insert) and admin viewer under **Livada SEO → Activity Log**. Hooks into settings updates, locations updates, redirect add/delete, AI suggestions, and Site Audit runs. Each entry records who, when, from which context (web / ajax / rest / cron / cli), what event, and a summary.

= 1.5.1 — 2026-04-30 =
* Added: **Person / Author schema (E-A-T)** — singular blog posts now reference their author by `@id` and emit a dedicated Person node in the @graph with bio, avatar, jobTitle, sameAs (pulled from the WP user profile + custom user meta `livada_seo_job_title`, `livada_seo_same_as`, plus standard social fields when present). Author archives also emit the Person node so the entity is canonicalised across the site. `worksFor` is linked to the primary business location.
* Added: **Sitemap inventory widget** on the dashboard — table of every post type + taxonomy emitted in the index with their published URL counts, deep links to each sub-sitemap, and a total at the top.

= 1.5.0 — 2026-04-30 =
* Added: **Live JSON-LD schema preview** in the SEO metabox — collapsible panel that fetches the exact `@graph` Livada SEO would emit on the front-end without rendering anything. New REST endpoint `GET /schema/preview/{id}`.
* Added: **CSV export of all SEO data** under Tools — one row per post with title, permalink, meta, score, schema type, location, noindex, cornerstone, etc. Useful for backups, agency handoffs, content audits.
* Added: **Redirect chain / loop detector** as a new Site Audit site-wide check. Walks the redirects table for cycles and chains (target is itself a redirect source) up to 5 hops. Pure DB introspection.

= 1.4.0 — 2026-04-30 =
* Added: **Bulk AI alt-text fill** in the Image SEO page — one button to generate AI alts for every empty alt on the visible page (250 ms throttle).
* Added: **Bulk schema-type assigner** in the Bulk Editor — select multiple posts, pick HowTo / Product / Event / Recipe / Review / Offer (or clear), apply in one shot.
* Added: **Plugin footprint widget** on the dashboard — transient cache size, redirect count, 404 log size, last audit run, and cron event status with relative "next run".
* Added: **Live keyword density meter** in the metabox — directional 0–100 % indicator that complements the on-save full-content density check.

= 1.3.0 — 2026-04-30 =
* Added: **Bulk AI Fill** in the Bulk Editor — toolbar to generate AI suggestions for missing meta descriptions / SEO titles / focus keywords across the visible posts in one shot, with an opt-in "overwrite existing values" mode. 250 ms throttle between API calls.
* Added: **Cornerstone reverse counter** in the SEO metabox — shows how many cornerstone posts already link to the current page so editors can spot weakly-linked content.
* Added: **Quick-wins admin notice** on Livada SEO pages and the WP Dashboard — surfaces missing setup (LocalBusiness empty, Anthropic API key absent, > 50 % of posts without a focus keyword) with one-click links to the right page. Per-user dismissible.

= 1.2.0 — 2026-04-30 =
* Added: **AI title / description / focus-keyword suggestions** in the metabox. New "AI ✨" button next to each field calls Claude with the post context (title, focus keyword, content excerpt, locale) and replaces the value with a length-capped suggestion. Reuses the Anthropic API key already configured for image alt-text. Closes the last "AI content writer" gap vs Rank Math Content AI / AIOSEO AI Generator.
* Added: REST endpoint `POST /ai/suggest/{id}` with body `{ type, save }`.
* Added: MCP tool `livada_ai_suggest` for Claude Code integration.

= 1.1.2 — 2026-04-30 =
* Added: **Hreflang manager UI** in the SEO metabox — repeater under Advanced to define per-post hreflang URLs without editing post meta directly. BCP-47 normalisation on save (lang lowercase, region uppercase, `_` → `-`, x-default kept verbatim).
* Added: **`wp livada-seo doctor`** WP-CLI self-test that surfaces WP/PHP versions, missing extensions, custom tables presence, scheduled cron events, sitemap rewrite freshness, robots.txt directive, LocalBusiness completeness, Anthropic key roundtrip, and SEO plugin conflicts. Pass `--ping` to additionally probe the REST namespace.

= 1.1.1 — 2026-04-30 =
* Added: Schema validation buttons in the SEO metabox — one-click links to **Google Rich Results Test** and **Schema.org Validator** for the current post URL.
* Added: **Live Flesch reading-ease** in the metabox checks panel — the score now updates as you type the meta description, matching the band the on-save analyser would report.
* Added: **Broken internal-link detector** — new `broken_internal_links` per-post check in Site Audit that flags `<a>` references to trashed, draft, or non-existent posts. Pure DB introspection (`url_to_postid()`), no outbound HTTP.

= 1.1.0 — 2026-04-30 =
**Major release.** Adds Site Audit, multi-location LocalBusiness, Cornerstone marker, Image SEO bulk editor with AI alt-text, WooCommerce schemas, Google News sitemap, MCP server. Brings the plugin to ~95% feature parity with Rank Math PRO.

* Added: **Site Audit** module — daily WP-Cron crawl, 8 per-post checks + 5 site-wide checks, sortable dashboard, CSV export.
* Added: **Multi-location LocalBusiness** — manage N business locations under a single WP install, with per-post `_livada_seo_location_id` to retarget Article publisher / Service provider / Offer seller references.
* Added: **Cornerstone content marker** — flag flagship posts, score boost in internal-link suggestions, dashboard card + filter.
* Added: **Image SEO bulk editor** — list attachments missing alt-text, inline AJAX edit, bulk apply, optional one-click AI alt-text via Anthropic Claude vision API.
* Added: Anthropic API key field with **AES-256-CBC encryption at rest** under General Settings.
* Added: **WooCommerce module** — auto-emits Product / Offer / AggregateRating / Review schemas on product pages with full variation support.
* Added: **Google News sitemap** at `/sitemap-news.xml`, advertised in the index only when matching posts exist in the 48 h window.
* Added: **Yoast SEO importer** — batched migration of post meta, title templates, social profiles, and Yoast Premium redirects.
* Added: **TranslatePress hreflang adapter** alongside the existing Polylang and WPML support.
* Added: **404 Monitor** with throttled logging and one-click "convert to redirect".
* Added: **Bulk redirect operations** — multi-select delete, CSV import, CSV export.
* Added: **Bulk Editor** admin page for titles / descriptions / focus keywords / noindex flags.
* Added: **Internal link suggestions** in the metabox, live, with cornerstone boost.
* Added: **Mobile SERP preview** in the metabox alongside the desktop one.
* Added: **Flesch reading-ease score** stored as a separate `_livada_seo_readability_score` post meta and surfaced as an admin column.
* Added: New schema types — **HowTo, Product, Event, Recipe, Review, Offer**.
* Added: Tourism / lodging fields — star rating, room count, pets allowed, check-in / check-out times, amenities, aggregate rating.
* Added: **WP-CLI commands** — `audit`, `sitemap diagnose`, `sitemap flush --type=news`, `import yoast`.
* Added: **REST API** — 30+ endpoints covering every action (settings, meta, redirects, locations, audit, 404, images, sitemap diagnose, Woo schema preview, IndexNow ping).
* Added: **MCP server for Claude Code** — TypeScript stdio implementation under `mcp-server/`, 28 tools, Application Password auth.
* Added: **Sitemap auto-strip** — known template CPTs (Elementor, JetEngine, ElementsKit, Brizy, OceanWP, Astra, CartFlows, Beaver, Thrive) excluded by default.
* Added: **Dashboard cards clickable** to filtered post-list (low-score, missing description, noindex, no-keyword, cornerstone, 404s, audit issues).
* Added: **CSV import/export** for redirects.
* Fixed: `LIVADA_SEO_DEBUG` was enabled by default — now off unless explicitly defined.
* Fixed: Sitemap transient cache now invalidates when `_livada_seo_sitemap_exclude` or `_livada_seo_noindex` post meta changes outside `save_post` (REST/AJAX/CLI).
* Fixed: SEOPress import nonce mismatch.
* Fixed: Removed dead `ajax_import_seopress` admin handler.
* Fixed: Hex color validation in the analysis admin column.

= 1.0.3 =
* Initial public release: meta, sitemap, schema, OpenGraph, redirects, breadcrumbs, analysis, robots, IndexNow.

== Upgrade Notice ==

= 1.14.1 =
Patch critique pour les sites passés en 1.14.0 : le champ Wikidata était auto-rempli par les navigateurs avec l'email admin, qui était ensuite rejeté côté serveur et effaçait silencieusement le Q-id stocké à chaque Save. Correction en double couche (HTML autocomplete=off + sanitize qui préserve la valeur en cas de soumission malformée). Mise à jour fortement recommandée.

= 1.14.0 =
Adds Signal 11 (Wikidata entity) to the AI Visibility score and auto-injects your Wikidata URL into the schema sameAs of your primary business — anchoring you in the structured knowledge base that ChatGPT, Perplexity, Gemini and Google AI Overviews use to identify and cite real-world entities. Set your Q-id in General Settings → AEO. Sites already at 100/100 will temporarily lose ~8 points until they declare their Q-id, then return to 100.

= 1.8.5 =
Adds the AEO Knowledge Graph admin UI (4 fields), fixes the hardcoded Organization @type so hotels / campgrounds / restaurants etc. identify correctly to AI engines, and replaces WP categories with the curated knowsAbout topics in /llms.txt. /llms-full.txt now lists Pages before Posts. Recommended for any site using the AEO module.

= 1.8.4 =
Cosmetic: the dashboard no longer shows misleading "not scheduled" status for sitemap and IndexNow — those aren't recurring crons by design.

= 1.8.3 =
Fixes the last two analysis edge cases: REST API meta updates now trigger score recalculation, and content-less pages no longer get penalised for the absence of inline images. Recommended.

= 1.8.2 =
Fixes several long-standing analysis bugs: accent-insensitive keyword matching, Elementor HTML widget content extraction, featured image detection via REST API, and word-by-word URL slug matching. Strongly recommended.

= 1.8.1 =
Fixes the "Check for updates" link that erroneously returned "Le lien suivi est expiré" after a successful round-trip. Recommended for everyone on 1.8.0.

= 1.8.0 =
Adds a self-hosted update checker. Once installed, every future version automatically appears as "Mettre à jour maintenant" on the Extensions page — no more manual ZIP uploads.

= 1.7.1 =
Cosmetic fix: robots.txt is now always rendered with one directive per line, even if the stored option lost its line breaks during a DB import.

= 1.7.0 =
Adds an onboarding wizard for new installs, AI rewrite mode, GSC keywords CSV import, an internal link graph admin page, and an opt-in programmatic OG image generator.

= 1.6.0 =
Adds settings JSON export/import for portable backups and an activity log of plugin actions.

= 1.5.1 =
Adds Person/Author schema with E-A-T signals and a sitemap inventory widget on the dashboard.

= 1.5.0 =
Adds a live JSON-LD schema preview in the metabox, a full SEO-data CSV export, and a redirect chain/loop detector in Site Audit.

= 1.4.0 =
Adds bulk AI alt-text fill, bulk schema-type assignment, a dashboard footprint widget, and a live keyword density meter.

= 1.3.0 =
Adds bulk AI fill for empty meta in the Bulk Editor, a cornerstone reverse counter in the metabox, and a quick-wins admin notice that points to unfinished setup steps.

= 1.2.0 =
Adds AI-powered title/description/keyword suggestions in the SEO metabox. Configure an Anthropic API key under General Settings to enable.

= 1.1.2 =
Minor release. Run `wp livada-seo doctor` after upgrading to validate the install end-to-end.

= 1.1.1 =
Minor release. Re-run the Site Audit to pick up the new broken-link check.

= 1.1.0 =
Major release. Run the Site Audit after upgrading to surface any new issues. The legacy LocalBusiness settings still work as "Location 1" — open the new Locations page to migrate them into the multi-location store. No database migration is required.
