=== AI Rank Suite — AI Search, llms.txt, Schema & SEO === Contributors: namishams Tags: seo, ai seo, llms.txt, schema, aeo Requires at least: 6.4 Tested up to: 7.1 Requires PHP: 8.1 Stable tag: 0.2.49 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html AI Rank Suite shows whether AI assistants name your site, and fixes what stops them: llms.txt, AI page scores, schema and classic SEO. == Description == More and more people ask ChatGPT, Claude, Perplexity or Google's AI Overviews instead of scrolling a page of blue links — and an assistant names one or two businesses in its answer, not ten. AI Rank Suite tells you whether yours is one of them, and fixes the things on your site that decide it. That is the whole idea. An assistant does not "rank" your pages. It fetches a handful of URLs, reads them, and writes one answer. Four things decide whether you are in that answer, and this plugin is built around all four — with a complete classic SEO toolkit alongside, because Google still sends the clicks you have today. = 1. Can an assistant find the right pages? = An AI crawler pulls a few URLs per question, not your whole site. `llms.txt` is the one file where **you** choose which few. * **llms.txt and llms-full.txt**, generated from your own content and served at your site root * Pin your most important pages to the top, in the order you want them read — not in date order * One sentence of meaning attached to every link, so the file explains your site instead of just listing it * A live token count, so the file never grows past what a model will actually read * Preferred citation, contact and content-usage lines that a model reads word for word * **Control 31 named AI crawlers individually** — OpenAI, Anthropic, Google, Perplexity, Apple, Meta, Amazon, Mistral, plus ByteDance/Doubao, Baidu/ERNIE, Alibaba/Qwen, Huawei, Tencent and DeepSeek. Allow the ones you want citing you, block the ones you don't. * Where a vendor publishes no crawler name, the plugin says so instead of selling you a rule that cannot be enforced = 2. Can it read what it finds? = Models read in chunks. A page with descriptive subheadings, a self-contained opening paragraph and a few lists or tables survives being summarised. A wall of prose does not. * **An AI score for every page**, next to the classic SEO score, in the editor sidebar and the classic meta box * Concrete checks, not a vague grade: does the opening paragraph answer the question in the first 40 words, is there roughly one subheading per 300 words, are any paragraphs over 120 words, are there lists or tables, is there a question-style heading, is this page even in your llms.txt * Every check comes with the fix and what it is worth * A site-wide list of every page and its score, filtered by what is actually broken — weak scores, missing descriptions, thin content, accidentally noindexed * Runs on your own server. No AI key needed for any of the scoring. = 3. Will it quote you by name? = An answer needs a source it can name and a fact it can trust. * **Structured data across 77 schema.org types** — Article, Product, Service, FAQ, HowTo, Recipe, Event, JobPosting, Course, Review, VideoObject, Person, LocalBusiness and more — set per page or as site-wide rules * **Local SEO with 97 LocalBusiness types**, opening hours and multiple locations * Open Graph and Twitter cards, social profiles, per-platform share images * Automatic FAQ, speakable and video structured data from what is already on the page = 4. Is it actually working? = Everything above is a guess until you check it. * **AI Answer Simulation (Pro).** Write the questions your customers really ask ("who does company formation in Dubai?"), and the plugin puts them to an AI model and reads the answer back: were you named, how early in the answer, in what tone, and **who was named instead of you**. * Up to 25 monitored questions and 10 tracked competitors * Every run is stored, so it becomes a trend line rather than a one-off screenshot * Honest about what it is: a repeatable simulation against the AI model you configure. It is not a live scrape of the ChatGPT, Gemini or Perplexity apps, and nobody can promise you that. = And everything you expect from an SEO plugin = * Title and meta description templates, site-wide and per content type, with a live Google result preview * XML sitemaps, plus news and video sitemaps, and an HTML sitemap block for readers * Robots control per page, per archive, and a full robots.txt editor * Google Search Console positions, Google Analytics 4, Matomo, Microsoft Clarity and PageSpeed Insights * Instant indexing through IndexNow (Bing, Yandex, Seznam, Naver) and the Google Indexing API * **(Pro)** A rank tracker with position history, and Bing Webmaster Tools alongside Search Console * **(Pro)** Backlink monitoring from real referrer traffic, with optional connections to Ahrefs, Semrush, Moz, Majestic, Sistrix, DataForSEO and seven SERP APIs * **(Pro)** Broken, redirected and unreachable link checking across the whole site * A redirect manager with regular expressions and CSV import/export, plus a 404 monitor * **(Pro)** An internal link graph — what links to what, how deep each page sits, which pages are orphans — computed entirely on your own server * Breadcrumbs, image alt text and title templates, canonical control, cornerstone pages * WooCommerce product schema **(free)**, plus Google Merchant Center and Meta catalog feeds **(Pro)** * A cookie consent banner with Google Consent Mode v2, in opt-in (GDPR), opt-out (CCPA) or automatic mode * **(Pro)** Scheduled email reports you can put your own agency branding on = You do not have to switch SEO plugins to try this = This is the part most people ask about first. AI Rank Suite is built to run **beside** Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim Seo, Squirrly, WPSSO, Schema Pro or Jetpack, not instead of them. Turn it on and, by default, your existing SEO plugin keeps doing exactly what it does today — titles, descriptions, canonicals, Open Graph, its own schema. AI Rank Suite adds only the layer nothing else on your site is doing: llms.txt, AI crawler control, AI page scoring and AI Answer Simulation. Every part of your page's `` gets exactly one owner, checked on the rendered page, so you never end up with two titles or two sets of structured data. When you are ready to consolidate, one setting hands the whole `` over. And if you want to move your existing work across first, the importer reads **Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO, Squirrly, SmartCrawl, Genesis, Jetpack, SEO Ultimate, WP Meta SEO, Redirection and WooCommerce** — without deactivating or modifying the source plugin, filling only empty fields by default, and with an undo journal for every run. = Built for real sites = * Measured on a 50,000-post fixture: the analyzer, the link graph, the sitemaps and every admin screen hold up * Long jobs (scoring, imports, the link graph, bulk work) run in resumable background batches with their own indexed tables — a timeout resumes where it stopped instead of starting over * Works with WPML, Polylang, TranslatePress and Weglot, including the two different shapes those plugins use for translations * Detects and reads Elementor, Divi, Beaver Builder, Bricks, Oxygen, WPBakery, ACF, The Events Calendar, WP Recipe Maker, WP Job Manager and more, so builder-rendered content is scored and put in your sitemaps * SEO fields appear inside Elementor's own Page Settings, writing to the same values as the block editor sidebar * Every module can be switched off, and a disabled module loads no code at all * Your settings and data are **kept** when you deactivate or uninstall, unless you explicitly ask for them to be removed = Free vs Pro = **Free, forever.** Nothing in the free plugin expires, counts down, or stops working, and none of it needs an API key: * Titles, meta descriptions and templates with a live Google preview * Open Graph, Twitter cards, social profiles * XML, news, video and HTML sitemaps * All 77 schema.org types, Local SEO with opening hours and locations * llms.txt and llms-full.txt, checked against Google's own Agentic Browsing rules * Individual control over 31 named AI crawlers, with a served-file verifier * The AI readiness score for every page — computed on your server, no key * The full site audit and the content list with its filters * Redirects with regex and CSV import/export, plus the 404 monitor * Breadcrumbs, robots.txt editor, image SEO, canonicals * All 14 importers — Yoast, Rank Math, AIOSEO, SEOPress and the rest — with undo * WooCommerce product schema; WPML, Polylang, TranslatePress, Weglot * Search Console, GA4, Matomo, Clarity and PageSpeed connections * Cookie consent banner with Google Consent Mode v2 **Pro adds** the features that write with AI on your own key, and the measurement moat: * AI Answer Simulation — 25 questions, trend line, share of voice, who was named instead of you * AI Autopilot — writes every missing description, title, FAQ and alt text, with a full undo * AI writing on your own key: descriptions, titles, FAQs, alt text, schema, translations * Insights: trends, movers, issue leaderboard * Rank tracker and keyword planner * Backlink monitoring that re-reads the linking page * Broken-link checker and internal link graph with suggestions * Bulk editing, catalog feeds for Merchant Center and Meta * Third-party SEO data providers (Ahrefs, Semrush, Moz, DataForSEO and more) * Scheduled white-label email reports Pro is sold per year through Freemius, starting at one site, with updates and support included, and a 14-day money-back guarantee. Details and pricing: https://airanksuite.com = External services = This plugin can talk to the third-party services below. **None of them are contacted unless you switch that feature on and supply your own credentials or identifier.** With a fresh install and nothing entered, the plugin makes no outbound requests except the ones WordPress itself makes. For each service: what it is for, what is sent and when, and its terms and privacy policy. * **AI providers (Pro): OpenAI, Anthropic, Google Gemini, Mistral, xAI, Perplexity, Groq, Cohere, Azure OpenAI, DeepSeek, Qwen, and any OpenAI-compatible endpoint including a local Ollama, LM Studio or vLLM.** Used only when you enter an API key, and only for the actions you trigger: generating descriptions, titles, FAQs, alt text or schema, and running AI Answer Simulation. What is sent: the text of the page you are working on, after e-mail addresses, phone numbers, shortcodes, scripts and anything you wrap in `[airanksuite-private]` have been stripped out. Your key is stored encrypted. Terms and privacy: OpenAI https://openai.com/policies/terms-of-use and https://openai.com/policies/privacy-policy; Anthropic https://www.anthropic.com/legal/consumer-terms and https://www.anthropic.com/legal/privacy; Google https://policies.google.com/terms and https://policies.google.com/privacy; Mistral https://legal.mistral.ai/ and https://legal.mistral.ai/terms/privacy-policy/; xAI https://x.ai/legal/terms-of-service and https://x.ai/legal/privacy-policy; Perplexity https://www.perplexity.ai/hub/legal/terms-of-service and https://www.perplexity.ai/hub/legal/privacy-notice; Groq https://groq.com/terms-of-use and https://groq.com/privacy-policy; Cohere https://cohere.com/terms-of-use and https://cohere.com/privacy; Microsoft Azure https://azure.microsoft.com/support/legal and https://privacy.microsoft.com/privacystatement; DeepSeek https://cdn.deepseek.com/policies/en-US/deepseek-terms-of-use.html and https://cdn.deepseek.com/policies/en-US/deepseek-privacy-policy.html; Alibaba Qwen https://www.alibabacloud.com/help/legal and https://www.alibabacloud.com/help/privacy-policy. A self-hosted endpoint sends data only to the server you named. * **Google Search Console API and Google Analytics Data API** (www.googleapis.com, analyticsdata.googleapis.com, analyticsadmin.googleapis.com, oauth2.googleapis.com, accounts.google.com): read-only, to show your search positions and traffic, and only after you connect a Google account — either with "Sign in with Google" (next entry) or with your own Google Cloud OAuth credentials. Sent: your OAuth token and the property you selected, each time the report screens load or the daily snapshot runs. https://policies.google.com/terms and https://policies.google.com/privacy * **AI Rank Suite connect service** (airanksuite.com/google-connect), run by us, the authors of this plugin: used only if you press "Sign in with Google" instead of entering your own Google Cloud credentials. It holds the Google OAuth client, so that you do not have to create a Google Cloud project. Sent when you press the button: your site address, the plugin version and a one-time random value that ties the answer to your browser. Sent afterwards, whenever Google's access token has expired and a report needs a new one: your site address and the refresh token Google issued for your connection. It receives none of your Search Console or Analytics data. Those requests go from your site to Google directly. Disconnecting, or entering your own credentials, stops all contact. Terms https://airanksuite.com/agb and privacy policy https://airanksuite.com/datenschutz * **Google tag / Google Analytics 4** (www.googletagmanager.com): if you enter a measurement ID, the Google tag is loaded on your public pages and visitors' page views are reported to Google, subject to the consent banner you configure. https://policies.google.com/terms and https://policies.google.com/privacy * **Google PageSpeed Insights API** (www.googleapis.com): sends a page URL of yours to Google to fetch its performance score, only when you press the button. https://developers.google.com/speed/docs/insights/v5/get-started, https://policies.google.com/terms and https://policies.google.com/privacy * **Google Indexing API** (indexing.googleapis.com): sends URLs of yours to Google when you ask for them to be indexed, using your own service account. https://developers.google.com/search/apis/indexing-api/v3/quickstart, https://policies.google.com/terms and https://policies.google.com/privacy * **Google Places API** (places.googleapis.com): only in Local SEO, with your own key, to look up your business listing when you press the button. https://cloud.google.com/maps-platform/terms and https://policies.google.com/privacy * **OpenStreetMap Nominatim** (nominatim.openstreetmap.org): only in Local SEO, and only when you press "Find coordinates from the address". Sent: the street, postal code, city, region and country you typed into the business address, and a user agent naming this plugin and your site address, as Nominatim's usage policy asks. It returns the latitude and longitude for your LocalBusiness markup; no key is needed. Usage policy https://operations.osmfoundation.org/policies/nominatim/, terms https://osmfoundation.org/wiki/Terms_of_Use and privacy policy https://osmfoundation.org/wiki/Privacy_Policy * **IndexNow** (api.indexnow.org, www.bing.com/indexnow, yandex.com/indexnow, search.seznam.cz/indexnow): if you enable it, sends the URL of a page of yours and your IndexNow key to these search engines when the page is published or updated. Nothing else is sent. Terms https://www.indexnow.org/; Microsoft privacy https://privacy.microsoft.com/privacystatement; Yandex https://yandex.com/legal/confidential/; Seznam https://www.seznam.cz/ochranaudaju * **Bing Webmaster Tools API** (ssl.bing.com): with your own API key, to read your Bing positions and inbound links when the report screens load. Sent: your key and your site URL. https://www.microsoft.com/servicesagreement and https://privacy.microsoft.com/privacystatement * **Microsoft Clarity** (www.clarity.ms): if you enter a Clarity project ID, the Clarity tag is loaded on your public pages and visitor sessions are recorded by Microsoft, subject to your consent banner. https://clarity.microsoft.com/terms and https://privacy.microsoft.com/privacystatement * **Matomo**: only if you enter the address of your own Matomo instance (self-hosted or Matomo Cloud). The tracking snippet reports page views to that instance, and the Reporting API is read with your token to show visits from AI assistants. Data goes to the server you named and nowhere else. Matomo Cloud terms https://matomo.org/matomo-cloud-terms-of-service/ and https://matomo.org/privacy-policy/ * **SEO data providers (Pro): Ahrefs, Semrush, Moz, Majestic, Sistrix, Ryte, DataForSEO, SerpApi, Serper, ScaleSERP, ValueSERP, Zenserp, TrajectSERP.** Optional, each with your own key, used to look up keyword positions and backlinks when you ask for them. Sent: your key and the keyword or domain you are looking up. Ahrefs https://ahrefs.com/terms and https://ahrefs.com/legal/privacy-policy; Semrush https://www.semrush.com/company/legal/terms-of-service/ and https://www.semrush.com/company/legal/privacy-policy/; Moz https://moz.com/terms-of-use and https://moz.com/privacy-policy; Majestic https://majestic.com/support/terms and https://majestic.com/support/privacy-policy; Sistrix https://www.sistrix.com/data-privacy/ (its terms are shown at sign-up); Ryte https://en.ryte.com/about/tos/ and https://en.ryte.com/about/privacy/; DataForSEO https://dataforseo.com/terms-of-service and https://dataforseo.com/privacy-policy; SerpApi https://serpapi.com/legal (terms and privacy on one page); Serper https://serper.dev/terms and https://serper.dev/privacy; ScaleSERP, ValueSERP and TrajectSERP https://trajectdata.com/traject-data-terms-of-service/ and https://trajectdata.com/privacy-policy/; Zenserp https://zenserp.com/terms and https://zenserp.com/privacy * **Google Ads API (Pro)** (googleads.googleapis.com): only for keyword ideas in the rank tracker, with your own Google Ads developer token and customer ID. Sent: the seed keywords or the page URL of yours you asked ideas for, the language and the country. https://developers.google.com/google-ads/api/docs/start, https://policies.google.com/terms and https://policies.google.com/privacy * **The link checker (Pro)** requests the external URLs your own content links to, in order to find out which of them are broken. Nothing about your site is sent beyond a normal HTTP request with this plugin's user agent. * **Webhooks you set up**: if you add a webhook in the developer tools, the events you ticked (a site audit finished, a score was recalculated, a cache was purged) are sent as a signed JSON POST to the address you entered. Nothing is sent until you add one, and only to that address; its terms and privacy policy are those of whoever runs it. * **Addresses you type in**: "Import schema from a URL" requests the one page you name and reads the JSON-LD in it. Nothing about your site is sent beyond a normal HTTP request with this plugin's user agent. * **Your own site**: several checks (robots.txt, llms.txt, the sitemap, the head of a page, the coexistence scan) request pages of your own site from your own server, to test what a crawler would actually receive. These requests do not leave your server's network. * **Freemius**: the licensing and update service for the Pro version only. The free plugin from WordPress.org contains no Freemius code and sends nothing to Freemius. With a Pro licence, the plugin contacts Freemius to activate the licence and check for updates; what is sent is the licence key, the site URL, the WordPress and plugin versions, and, only if you opted in, an admin e-mail address. https://freemius.com/terms/ and https://freemius.com/privacy/ Links from the plugin's screens to Google's Rich Results Test, Google Maps, Google Search Console and Bing Webmaster Tools open in your browser when you click them; the plugin itself sends nothing there. = Building from source = The two compiled files, assets/admin/build/index.js and assets/editor/build/editor.js, are built from the sources shipped next to them in assets/admin/src and assets/editor/src (React, JSX, one stylesheet) with Vite. To rebuild either one: 1. cd assets/admin (or assets/editor) 2. npm install 3. npm run build Nothing else in the plugin is compiled: the metabox, the blocks and every PHP file are shipped as written. = Honest about what nobody can promise = No plugin can guarantee that an AI assistant will recommend you, or that Google will rank you higher. What this plugin can do is make your site findable, readable and quotable by the systems that write those answers, and then measure whether it worked — repeatably, so you can see a trend instead of guessing. == Installation == 1. In WordPress, go to **Plugins → Add New**, search for **AI Rank Suite**, and click **Install Now**, then **Activate**. Or upload the plugin folder to `/wp-content/plugins/` and activate it from the Plugins screen. 2. The setup wizard opens on first activation. It takes about three minutes and every step writes real settings — nothing is a preview. 3. **If you already run another SEO plugin**, the wizard detects it and defaults to running alongside it. You do not have to deactivate anything. Optionally, import your titles, descriptions, redirects and settings from it on the same screen. 4. On the **llms.txt** screen, turn the file on and pin the five or ten pages you most want an assistant to read. Check it at `https://yoursite.com/llms.txt`. 5. On the **AI Crawlers** screen, decide which AI crawlers may read your site. 6. On the **Content** screen, press **Analyze** to score every page. This runs in the background; you can leave the screen. 7. Optional: on the **AI Engine** screen, add an API key from OpenAI, Anthropic, Google or any OpenAI-compatible provider if you want AI writing and AI Answer Simulation. Everything else works without one. **Requirements:** WordPress 6.4 or newer and PHP 8.1 or newer. The plugin will not load on older PHP and will tell you so rather than fataling. == Frequently Asked Questions == = Does this replace Yoast or Rank Math? = It can, but it does not have to, and on day one it does not. If another SEO plugin is active, AI Rank Suite defaults to adding only the AI-search layer — llms.txt, AI crawler control, AI page scoring, AI Answer Simulation — and leaves your titles, descriptions, canonicals, Open Graph and schema exactly as they are. Nothing about your current search results changes. If you later want one plugin instead of two, switch the compatibility mode to let AI Rank Suite own the whole ``, import your settings and content fields from the other plugin, and then deactivate it. Doing it in that order means you never have a gap. = Can I really run it with Rank Math (or Yoast, or AIOSEO) installed at the same time? = Yes, and that is the intended way to start. Every part of the page head — title, description, canonical, robots, Open Graph, Twitter cards, JSON-LD, hreflang — is assigned exactly one owner, and the assignment is enforced on the finished HTML rather than by hoping the two plugins use different hooks. So you will not get duplicate titles or two competing sets of structured data. Detection covers Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim Seo, Squirrly, WPSSO, Schema Pro and Jetpack. = Do I need an OpenAI or Claude API key? = No, and most of the plugin never asks for one. Page scoring, llms.txt, schema, sitemaps, the link checker, redirects, the internal link graph, Search Console, indexing, imports — all of it runs without any AI key, entirely on your own server. A key is needed for exactly two things: AI writing (descriptions, titles, FAQs, alt text, schema suggestions) and AI Answer Simulation. You bring your own key from OpenAI, Anthropic, Google, Mistral, xAI, Groq, DeepSeek, Qwen, Azure OpenAI, OpenRouter or any OpenAI-compatible endpoint — including a model running locally through Ollama, LM Studio or vLLM, in which case nothing leaves your machine at all. = What does it cost to run if I do use AI? = You pay your AI provider directly at their list price; the plugin adds nothing on top. To keep that from being a surprise, the plugin estimates the cost of a job **before** you run it, records the actual cost after, and enforces spending limits — out of the box, $10 a day, $100 a month, and $25 for any single bulk job, with a hard stop when a limit is hit. You can change or remove all three. In practice: a meta description on a small model costs a fraction of a cent, so writing descriptions for a few hundred pages is a coffee. AI Answer Simulation is the more expensive one because it asks a full model a real question — budget for it per run, not per page. = What is llms.txt, and does anything actually read it? = `llms.txt` is a plain markdown file at the root of your site — `yoursite.com/llms.txt` — that tells an AI system what your site is, which pages matter, and how you want to be credited. Think of it as robots.txt's opposite: robots.txt says what not to read, llms.txt says what to read first. Honest answer on adoption: it is a proposed convention, not a ratified standard, and no AI vendor has publicly committed to honouring it. It costs you nothing to publish, it is trivially cheap to serve, and if the convention holds you are already there. The plugin also produces `llms-full.txt`, which contains the actual text of your chosen pages as markdown — useful today for anyone who feeds your site to a model deliberately. Neither file is the whole strategy, which is why page structure, schema and measurement are the other three quarters of this plugin. = Does it work on a multilingual site? = Yes. WPML, Polylang, TranslatePress and Weglot are supported, including the two different ways they work — WPML and Polylang give each translation its own post, TranslatePress and Weglot translate one post on the fly. Pages are scored, listed and sitemapped per language, the content list filters by language, and hreflang is handled. The admin interface itself is available in English and German. = Will it cope with a large site? = It is built for that case specifically. Every long-running job — page scoring, imports, the internal link graph, bulk edits, the link checker — runs as a resumable background job in its own indexed database tables, processing a slice at a time. A PHP timeout or a killed request resumes at the cursor rather than starting again. The link graph and the URL inventory were measured on a 50,000-post fixture with over 700,000 internal links inside a 128 MB memory limit, and every admin screen was checked at that size. If your host is aggressive about request limits, everything continues on the next tick. Nothing here depends on WP-Cron running reliably. = Is my content or data sent anywhere? = Only where you send it. With no keys configured, nothing leaves your server. When you do use an AI feature, the page's text is sent to **the provider you chose**, and only after e-mail addresses, phone numbers, shortcodes, HTML comments, scripts and anything you wrap in `[airanksuite-private]…[/airs-private]` are stripped out — the preview tells you exactly what was removed before anything is sent. Page content is also framed as untrusted data in the prompt, so text on one of your pages cannot issue instructions to the model. Your API keys are stored encrypted at rest. All scoring, the link graph, link suggestions, sitemaps, schema and the audits run locally with no external call at all. The full list of services and what each one receives is in the **External services** section above. = What happens to my data if I deactivate or uninstall? = Nothing is deleted. Settings, scores, redirects, keywords and history are kept by default so that deactivating to test something, or reinstalling, never costs you work. If you genuinely want everything removed, there is an explicit switch for it under Settings → Data, and only then does uninstalling clear the plugin's options and tables. = Will this make ChatGPT recommend my business? = No plugin can promise that, and you should be wary of any that does. What this one does is remove the reasons an assistant would not: it makes your pages retrievable, gives them a structure a model can summarise without mangling, states in machine-readable form what your business is and how to cite it, and then measures whether your name shows up in answers to the questions you care about. The measurement is the point — you get a trend line rather than a hunch. = Does it slow my site down? = The front end does very little: meta tags, JSON-LD and the redirect check, all from cached values. Sitemaps, llms.txt and catalog feeds are cached and served from rewrite rules, not built on each request. The heavy work — scoring, crawling links, building the graph — happens in the admin as background jobs, never in a visitor's request. Any module you do not use can be switched off completely, and a disabled module loads no code. = I run WooCommerce. What do I get? = Product structured data with prices, availability, brand and reviews (including from Judge.me, Yotpo and the common brand plugins), a Google Merchant Center feed and a Meta / Instagram catalog feed served from cached URLs those platforms can poll, and a catalog audit that tells you which products are missing the fields those feeds require. The Catalog Feeds screen only appears when WooCommerce is active. = Can I give a client or an editor limited access? = Access follows WordPress itself: the plugin's screens and routes are for administrators, and a route that names a post also asks WordPress whether this user may read or edit that post. The plugin no longer ships capabilities of its own. = I'm migrating from another SEO plugin. Will I lose my work? = The importer reads Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO, Squirrly, SmartCrawl, Genesis, Jetpack, SEO Ultimate, WP Meta SEO, Redirection and WooCommerce. It never modifies or deactivates the source plugin, so your old setup stays intact and reversible. By default it fills only fields that are empty here and tells you exactly how many values it left alone and why; every run is logged and can be undone. It also imports redirects from a CSV or JSON handover file, previewing what it would do before it does it. = Does it support the block editor and page builders? = Both. SEO and AI fields appear in the block editor sidebar, in the classic meta box, and inside Elementor's own Page Settings — all three writing to the same values. Content rendered by Divi, Beaver Builder, Bricks, Oxygen, WPBakery, Elementor and ACF is read for scoring and sitemaps, so builder-heavy pages are not scored as if they were empty. == Screenshots == 1. The dashboard: your site's AI search score, the three things worth doing next, and the numbers behind them. 2. Site Audit: every published page checked against 37 rules, the comparative problems a single page score cannot see. 3. The editor: an AI score and a classic SEO score for the page you are writing, with the Google snippet preview and every check spelled out. 4. The llms.txt editor: the file assistants read, with its token count, the pages it lists, and a live preview of exactly what a crawler receives. 5. AI crawler controls: the named crawlers from OpenAI, Anthropic, Google, Perplexity, Apple, Meta and others, allowed or blocked one at a time. 6. Every page with its score in one list, filtered down to what is actually broken: weak scores, missing descriptions, thin content, accidentally noindexed. 7. Structured data: schema.org types applied per page or as a site-wide rule, with a preview of the JSON-LD that will ship. == Changelog == = 0.2.49 = * **The classic WordPress screen.** Text fields, selects and text areas are now core's own: 40 pixels tall, a 2 pixel corner, the grey hairline, 14 point type, and core's focus ring. Labels sit above them at 14/600 like a settings screen, with the description underneath in core's grey. * Tables read as a WordPress list table: a hairline frame, a quiet header with a rule under it, alternating rows and a hover. * Notices have core's shape, with no corner and no shadow, a four pixel coloured edge, and a tint mixed from that edge so the dark theme gets a dark tint instead of a bright one. = 0.2.48 = * **A page now says what changed about it.** Every analysis records the two scores, and the report states the first reading against the latest one: "+37 on the AI score since 19 October, over 4 measurements". Until now every number described the page as it is today, which made an evening spent rewriting descriptions unprovable. A re-analysis that produces the same scores writes nothing, and the first reading is never dropped, because the baseline is the whole meaning of "before". * The stylesheet is readable again. `.ars-hero` was defined six times, `.ars-tab` five, `.ars-btn-primary` four; each is one block now, 158 lines lighter. Nothing changed on screen, and that is measured rather than claimed: the computed style of 1,670 elements across ten screens in light and dark is identical before and after. * A test fails the build if a selector is written more than twice again, and four tests cover the score history. = 0.2.47 = * **The dashboard counts rules, not findings.** A site of 2,538 pages reported "17,733 open findings", which is a wall rather than a number. The same run came from twelve rules. A rule is the unit of work, because one fix to a template clears every page it touches, so the tile now reads "12 / 38 rules failing" and keeps the finding count as the explanation underneath. * The audit verdict says the same thing: "2 critical rules are costing you search traffic today", with the findings, pages, warnings and notices behind it. * How many rules exist now comes from the rule catalogue. The audit screen carried `const RULES = 30`, which was right when it was written and had been wrong for a while: there are 38. * 458 German translations that were in the catalogue but had never reached the admin screens are there now, and two plural forms that had regressed to English are German again. = 0.2.46 = * **The admin takes its colour from WordPress.** Whatever admin colour scheme you run, the plugin's buttons, tabs, toggles and charts arrive in it. The accent is measured from one of WordPress's own buttons at load, so Midnight stays Midnight and Sunrise stays Sunrise, on any WordPress version. * Buttons, second-level tabs and card headers use core's own geometry instead of a set of their own: core's radius, core's weight, core's sub-tab row with its rule. * **The dashboard opens with what to do, not with what is missing.** The three next actions moved above the status, and the agent floor, which drew seven connection cards and ten job rows all reading "no engine", now appears only once an engine is connected. The same sentence used to be on the screen five times. * Fewer places to look. Measure went from seven screens to five: Insights is a tab of Overview, and the data providers are a tab of Backlinks. Import and backup is a tab of Settings. The developer reference is there when WP_DEBUG is on, when the `airanksuite_show_developer_tools` filter asks for it, or from the All settings index, and its address keeps working either way. = 0.2.45 = * The plugin's own capabilities no longer guard anything. Every REST route and every screen asks WordPress directly, and the capability stands in the route itself: `current_user_can( 'manage_options' )`. Routes that name a post also ask WordPress about that post. * The Roles screen is gone with them. It handed out four capabilities that now decide nothing, and an installation that still carries them has them removed on update. Access follows WordPress roles: administrators manage the plugin. * A test fails the build if a route is registered without a WordPress capability on the spot, or if one of the old capabilities is checked anywhere. = 0.2.44 = * Every REST route now asks WordPress for one of its own capabilities before the plugin capability is considered. A plugin capability can be handed to any role in Settings, Roles, so it can never be the only gate. * Values read from $_SERVER and $_COOKIE are sanitized, not only unslashed. * The audit export hands spreadsheet rows to the browser, which writes the file. Nothing is echoed from the route, and a cell that starts with an equals sign is written as text, so a spreadsheet cannot run it as a formula. * llms.txt is stripped of markup on output. = 0.2.43 = * **Elementor no longer overwrites a title applied elsewhere.** Elementor keeps its own copy of the SEO title, description, keyword and noindex switch in its page settings and posts all of them on every save, layout edits included. Written back as they came, that copy put the old title back over one applied minutes earlier from the AI review, the block-editor sidebar or the content list. The panel now remembers what it handed the builder and writes only the fields that were changed inside Elementor. The meta box and the block-editor sidebar already behaved this way; a test now holds all three to it. * **Long keyword lists fold.** A page can carry a hundred keywords, and the meta box and the sidebar drew every one of them as a chip, a wall that pushed the page down and a counter that read "100 / 10". Both now show the first twelve (eight in the sidebar), one chip says how many more there are, and the opened list scrolls inside a box. The limit reads 100, which is what it always was. = 0.2.42 = * **The SEO score is a formula.** Four pillars with fixed points, one hundred in total: keyword 40 (in the title, the description, the URL, the first paragraph, a subheading, the density and an image alt), title and description 25, structure 20 (one H1, heading order, 300+ words, alt texts, a compact slug), links 15. Until now the keyword checks fed no score at all, so a page with the keyword nowhere scored like one with it everywhere. Without a focus keyword the keyword pillar earns nothing and the score cannot pass 60. The four numbers are shown under the rings in the editor sidebar and the meta box. * **llms.txt written in one click.** "Write everything" gives every page in both files a summary (from the AI engine when a key is stored, from the page's first sentences otherwise), writes the site's lead paragraph and rebuilds both files, with a progress bar. Pages that already have a summary are kept unless you choose to rewrite. * **Site Audit: seven more rules, a way out of every finding, and a spreadsheet.** Meta description length, missing focus keyword, keyword missing from the title, very long slug, post without a featured image, no internal links out, oversized featured image. Every finding links to the optimiser as well as to the editor, and the whole run exports as CSV. * **Measure has an overview.** Search Console and Analytics for the same days side by side, each against the same days before, the two lines on one axis, the top pages with both numbers. Bing sits next to Google: the Search Console property beside the site Bing expects, with Bing's import from Search Console one click away. * **Image SEO counts the media library.** How many images have no alt text, are wider than 2500 pixels or heavier than 500 KB, the largest ones listed, and one run that writes the missing alt texts from the template, fifty at a time. * **Import shows what is there.** The plugin that is installed or left data behind gets a card with the numbers and the buttons; the rest are one line each. Yoast and SEOPress have their marks. * **The AI proposal compares against the page as it is now.** "Now" in the title and description review showed the snapshot the proposal had taken when it was written; after an earlier apply that was an old title, and the content list, reading the page, showed the real one. The review now reads the current values with every load and says when the metadata changed since the proposal. * **Job postings carry what Google's report asks for.** datePosted from the post date, a job ID, the applicant country for remote jobs, and whether applying happens on the page. = 0.2.41 = * **The Pro package carries its translations again.** The 0.2.40 Pro build shipped without the languages folder, so every screen fell back to English on a German site. The build now refuses to run without the translation sources, and the release check verifies that the compiled catalogues are in the package. * **The word counter is called Words again.** The tab under Content had been renamed Length; the counter of every page's words, and of the whole site, is the same tab and now says so. = 0.2.40 = * **The dashboard takes a score reading itself.** WP-Cron only runs when somebody visits the site, so on a quiet site the daily reading added in 0.2.39 could wait for days. When the dashboard opens and the last reading is older than twenty hours, it takes one on the spot. The findings card gained a button: "Run an audit now" starts one and opens Site Audit, where it runs slice by slice. * **The editor toolbar shows both scores.** The pinned AI Rank Suite button carries GEO and SEO as two small pills in their verdict colours, and it sits first in the pinned row. With Rank Math active, its two pinned score buttons step back into the ⋮ menu, where its sidebar still opens, so the toolbar holds one set of numbers instead of two. * **Keywords in bulk.** The keyword field in the meta box and in the sidebar accepts a pasted list (commas, semicolons or line breaks) and adds every entry at once, and the AI suggestions have an "Add all" button. Ten remains the ceiling. * **The meta box and the sidebar look like WordPress.** Core blue for every button, the secondary as an outline of the same blue, 3 and 4 pixel corners, core input borders, no gradients and no tinted shadows. The score rings are honey rather than marigold, and the number sits in the centre of the ring in every browser: it is HTML laid over the ring now, not SVG text rotated back into place. * **The post list says what Rank Math says.** The SEO details column adds the schema type the page will carry and three link counts as icons: internal, external and incoming. Score pills are top-aligned like every other cell, so they stay next to the title when another column makes the row tall. = 0.2.39 = * **The AI search score is read once a day.** The dashboard's "AI search score over time" card promised one point per recalculation, by hand or on schedule, and only the first half was true: a point was stamped when somebody pressed Recalculate, and on a site where nobody did, the line's last date stayed where it was for weeks. A daily job (`airanksuite_job_score_snapshot`, listed under Autopilot's systems) now takes a reading, so the line moves on its own. Recalculate still adds a point on the spot. * **Both trend cards say when they last moved and when they move next.** Under the score card: the last reading and the next automatic one. Under the findings card: the last completed audit and the next scheduled one, or, when none is scheduled, that an audit has to be run or scheduled for the line to gain a point. A last label from three weeks ago is a schedule now, not a fault. * **The "Open findings" tile updates with the chart under it.** Finishing an audit cleared the chart's cache but not the tile's, so for up to five minutes the chart showed the new run while the tile kept the old count. = 0.2.38 = * **Recurring events are scheduled on init, not on plugins_loaded.** Scheduling an event asks every plugin for its list of cron schedules, and WooCommerce translates the label of its schedules while answering. Asked during our boot, that made WooCommerce load its translations before init, which WordPress 6.7 and later report as a notice under WP_DEBUG, against this plugin. All eight recurring events (job resumer, retention, rank snapshots, backlink checks, listing refresh, reports, audit alerts, AI visibility) now go through one helper, `Cron::ensure()`, that waits for init. On a site without WooCommerce nothing changes; on a site with it the notice is gone. * **Running an import needs a WordPress administrator.** 0.2.37 added that check to the settings import and the backup restore, and left it off the plugin importer, which can replace settings, redirects and post data just the same. Starting, ticking and cancelling an import run, and reading an uploaded file, now require `manage_options` as well. Listing the sources, detecting installed plugins, exporting and reading the backup stay with the plugin's own capability. = 0.2.37 = * **Changing who may do what needs a WordPress administrator.** The plugin has its own capabilities so that an agency can hand "manage settings" to an editor. That capability alone also opened the role editor, so somebody who had been given it could have given it, or anything else the plugin offers, to further roles. The role editor now requires WordPress' own `promote_users` as well. The same second check, `manage_options`, was added to the other routes that reach beyond the plugin's settings: writing and restoring .htaccess, importing a settings file, restoring a settings backup, the maintenance tasks under Developer tools, and creating, changing or testing a webhook, which sends site data to an address somebody typed in. WordPress is asked first, so a refused request does not use up the rate limit. For an administrator nothing changes. * **Values reach JavaScript as JSON.** The toolbar's script received its REST address and nonce by text substitution into the source, and the Matomo snippet had its address and site id pasted between quotes. Both now get one JSON object built by `wp_json_encode()`. The addresses were the site's own, so nothing could be injected, but a value that is encoded for a URL is not encoded for a script, and only one of the two is right. * **Structured data is printed with the default JSON encoding.** The JSON-LD in the page head was encoded with flags that leave slashes and non-ASCII characters as they are. With the defaults every slash is escaped, so no headline can close the script element, and the output is the same data to every consumer. * **Six importer queries pass the table name as an identifier.** The readers for Redirection, Rank Math and All in One SEO appended the other plugin's table name to the statement. It travels as `%i` now, like everywhere else. = 0.2.36 = * **Everything the plugin names is named `airanksuite` now.** Options, tables, post and term meta, capabilities, scheduled events, hooks, constants, the REST namespace (`airanksuite/v1`), script handles and the WP-CLI command (`wp airanksuite`) used a four-letter abbreviation that the directory's review found too short to be safe from collisions with other plugins. **Your data moves by itself**: on the first request after the update, before any setting is read, tables are renamed, options and meta keys are carried across, capabilities and scheduled events follow. Nothing is copied row by row and nothing is left behind under the old names. Shortcodes already typed into pages, such as `[airs_breadcrumbs]` and `[airs_business_hours]`, keep working under their old names as well as the new ones, and so does the `[airs-private]` marker. A settings export or a pre-update backup made by an earlier version restores under today's names. If you wrote code against the old hooks, constants or REST paths, replace `airs` with `airanksuite` in it. * **A route that names a post asks WordPress about that post.** A plugin capability says what somebody may do with the plugin, not which posts they may see. Reading a post's schema or its PageSpeed result needed only "view reports", so a role with that capability could read them for a colleague's private draft. Those routes now require `read_post` on the post itself, and writing requires `edit_post`. The same check was added where a post id arrives in the body or in a list: applying an internal link suggestion, rejecting or undoing an Autopilot proposal, a bulk run over chosen ids, submitting a URL for indexing. The Autopilot queue and log, the content list and its CSV leave out drafts the current user could not open in WordPress. * **No SQL statement is assembled any more.** The redirect list built its ORDER BY from the sort the screen asked for. The value came from an allow-list, so it was never injectable, but a statement put together from pieces cannot be told apart from one that is. Every list in the plugin now sends one constant statement: the sort column travels as an identifier placeholder, the direction selects one of two literals, and a filter that is not in use is switched off by a flag instead of being left out of the text. Same results, same order, same paging. * **The sitemap's browser view is a file.** The XSL stylesheet behind `/sitemap.xsl`, CSS included, was a string inside the PHP source; it is `assets/sitemap/sitemap.xsl` now, and PHP only serves it. * **No translation is loaded before init.** A cron interval label was translated while modules scheduled their events on plugins_loaded, which WordPress 6.7 and later report as a notice under WP_DEBUG. The interval was a copy of WordPress' own `weekly` and is gone. * **Four services were missing from the list of external services**, and are documented with what is sent, when, and their terms and privacy policies: OpenStreetMap Nominatim ("Find coordinates from the address" in Local SEO), our own connect service behind "Sign in with Google", the Google Ads API (Pro keyword ideas), and the webhooks you configure yourself. = 0.2.35 = * **Every database query goes through $wpdb->prepare().** 107 reads and writes were built as strings with the table name interpolated and no placeholder at all. None carried user input, but a query that is not prepared cannot be told apart from one that should have been, and the directory's review said so. Table names are now passed as %i identifiers, IN lists get one placeholder per value, and LIKE patterns go through esc_like(); nothing is pasted into SQL by hand any more. * **No plugin CSS is printed into the page.** The upgrade menu entry's colour, the boot skeleton behind the admin app, the upgrade screen's stylesheet and the post-list score columns were each an echoed