Unseat Connector

وەسف

Unseat Connector is the official WordPress plugin for the unseat.ai content platform from Unseat AI Corporation. It lets the platform publish and manage SEO-optimized content on your site, and exposes the signals AI crawlers (ChatGPT, Claude, Perplexity, Gemini) look for.

What it does:

  • SEO Meta Fields — Registers Rank Math, Yoast SEO, and SEOPress meta fields (title, description, focus keyword, social tags) for REST API read/write access. Works with or without an SEO plugin installed.
  • Site Health Endpoint — Provides a /wp-json/seo-machine/v1/status endpoint that reports WordPress version, active SEO plugin, permalink structure, and potential plugin conflicts.
  • llms.txt Serving — Serves your llms.txt and llms-full.txt pages as plain text at their canonical URLs, making your content index machine-readable for AI crawlers.
  • IndexNow Key — Serves your IndexNow verification key file as plain text.
  • AI-Crawler Allowlist — Injects an explicit robots.txt allowlist for GPTBot, ClaudeBot, PerplexityBot, CCBot, Google-Extended, Applebot, and other LLM crawlers with Crawl-delay: 0.
  • Fallback SEO Meta Tags — When no SEO plugin is active, emits <meta name="description">, canonical, OpenGraph, and Twitter Card tags from the connector’s meta fields.
  • Optional GA4 Tag — Injects a Google Analytics 4 measurement ID via wp_enqueue_script when configured through the REST endpoint.

Requirements:

  • WordPress 5.5 or higher
  • PHP 7.4 or higher
  • An unseat.ai account (for the publishing platform; the SEO meta and llms.txt serving features work without one)

External services

This plugin can optionally load Google Analytics 4 (gtag.js) from Google. This integration is off by default and is only activated after a site administrator sets a GA4 Measurement ID (format G-XXXXXXXX) through the plugin’s REST endpoint (POST /wp-json/seo-machine/v1/ga4). No external service is contacted until that ID is configured.

What it is used for: when a Measurement ID is configured, the plugin enqueues Google’s analytics script from https://www.googletagmanager.com/gtag/js so the site owner can measure website traffic.

What data is sent and when: while a Measurement ID is configured, the script loads on front-end page views for visitors who are not logged-in administrators (logged-in administrators are excluded to avoid inflating analytics). On each such page view the visitor’s browser sends the standard Google Analytics data directly to Google — for example the page URL, referrer, IP address, and device/browser information. No data is sent when no Measurement ID is configured, and the plugin itself does not collect, store, or transmit any of this data to unseat.ai or to any other party.

This service is provided by Google. By configuring a GA4 Measurement ID you are choosing to use Google Analytics on your site; please review Google’s terms and privacy policy:

  • Google Analytics Terms of Service: https://marketingplatform.google.com/about/analytics/terms/us/
  • Google Privacy Policy: https://policies.google.com/privacy
  • How Google uses information from sites or apps that use its services: https://policies.google.com/technologies/partner-sites

No other external services are contacted by this plugin. All SEO meta, llms.txt, IndexNow, robots.txt, sitemap, status, and cache-flush features operate entirely on your own server.

دامەزراندن

  1. Install directly from the WordPress plugin directory, or upload the plugin zip via Plugins > Add New > Upload Plugin.
  2. Activate the plugin.
  3. Verify the connector is working by visiting https://yoursite.com/wp-json/seo-machine/v1/status (requires authentication).

The unseat.ai platform will automatically detect the connector during onboarding.

پهد

Do I need Rank Math, Yoast, or SEOPress installed?

No. The connector registers SEO meta fields that work with or without an SEO plugin, and emits its own meta/OpenGraph/Twitter Card tags when none is active.

What is llms.txt?

llms.txt is a machine-readable index of your site content, similar to robots.txt but designed for AI language models. It helps AI search engines discover and cite your content.

Does this plugin collect any data?

The plugin itself does not collect or store any visitor data — it adds REST API endpoints to your existing WordPress installation, and all of that data stays on your server. The unseat.ai platform connects to these endpoints using your WordPress application password.

The one exception is the optional Google Analytics 4 integration: if an administrator configures a GA4 Measurement ID, the plugin loads Google’s analytics script so visitor analytics data is sent from the visitor’s browser to Google. This is off until you configure it. See the External services section above for exactly what is sent and links to Google’s terms and privacy policy.

Can I use this without an unseat.ai account?

Yes. The SEO meta field registration, llms.txt serving, and robots.txt allowlist all work independently. The status endpoint is primarily useful for the unseat.ai platform.

پێداچوونەوەکان

هیچ پێداچوونەوەیەک نەنووسراوە بۆ ئەم پێوەکراوە.

بەشداربووان و گەشەپێدەران

“Unseat Connector” نەرمەواڵەیەکی سەرچاوە کراوەیە. ئەم کەسانەی خوارەوە بەشدارییان تێدا کردووە.

بەشداربووان

“Unseat Connector” وەربگێڕە بۆ زمانەکەی خۆت.

دەتەوێت بەشداربیت لە گەشەپێدان؟

گەڕان لە کۆدەکەدا بکە، سەیری تەمارگەی (SVN) بکە، یان بەشداربە لە ڕووداوتۆماری گەشەپێدان لە ڕێگەی (RSS).

ڕووداوتۆمارگەریی گۆڕین

2.7.4

  • WordPress.org reviewer-fix pass (prefixing). All functions (unseat_connector_*), constants (UNSEAT_CONNECTOR_* / UNSEAT_*), options (unseat_*), and the enqueued script handle (unseat-connector-ga4) use the plugin’s unique prefix. Added inline comments at each do_action() / function call into third-party plugin hooks (Rank Math, GoDaddy WPaaS, Cloudflare) documenting that those names are owned by those plugins and are intentionally invoked unprefixed, so they are not mistaken for unprefixed plugin code.

2.7.3

  • WordPress.org reviewer-fix pass for resubmission.
  • Documented the optional Google Analytics 4 integration as a third-party external service in the readme (what is sent, when, and links to Google’s Terms of Service and Privacy Policy).
  • Tightened the /wp-json/seo-machine/v1/status endpoint permission from edit_posts to manage_options, since it reports site configuration and software/plugin version details that should be limited to administrators.
  • The two front-end output buffers (head <title> dedupe and the sitemap Cache-Control TTL cap) are now explicitly closed on the shutdown hook via a level-matched check, instead of relying on implicit shutdown flushing — so they can never leave the output-buffer stack misaligned for other components.
  • Hardened the sitemap-request detection to read $_SERVER['REQUEST_URI'] through wp_unslash() + sanitize_text_field() and wp_parse_url(), matching the text-file handler.

2.7.2

  • Publish-time prevention: the sitemap-invalidation hook now also calls RankMath\Sitemap\Cache::invalidate_storage() (when present). Rank Math 1.0.272+ stores sitemap caches under indexed names the per-type invalidation misses — proven live by an 11-day frozen sitemap that survived every other flush; invalidating storage on each publish makes that freeze class structurally impossible.
  • The robots.txt Sitemap line for the fallback sitemap now carries a content fingerprint (&v=): managed-host gateways rewrite no-cache headers in transit and CDNs cache the constant URL, so the cache key now rotates whenever content changes — an edge cache can never serve a stale copy to a crawler reading current robots.txt.

2.7.1

  • Deep-flush endpoint now also purges Rank Math’s file-based sitemap cache (uploads/rank-math/sitemap-cache/*.xml) and reports per-file deletion failures — live evidence showed a sitemap that survived post updates, transient clears, a module toggle, and a full wp_cache_flush(), which only a stale cached file explains.
  • Fallback sitemap responses now set a session cookie so managed-host gateways (observed: GoDaddy WPaaS rewriting Cache-Control to public/max-age=31d in transit) and downstream CDNs treat the constant URL as uncacheable — without this, the “cache-immune” fallback could itself be frozen at the edge.

2.7.0

  • Cache-immune fallback sitemap served live at ?unseat_sitemap=1 (no caching at any layer, so it can never go stale) and advertised via a Sitemap: line in robots.txt. Protects crawler discovery of new posts when the SEO plugin’s cached sitemap freezes (observed in production: a persistent object cache ignoring per-key deletes left a sitemap frozen across post updates, transient clears, and a sitemap-module toggle).
  • New authenticated deep-flush endpoint POST /wp-json/seo-machine/v1/flush (administrators only): performs a whole-namespace wp_cache_flush() — the one mechanism that clears an object-cache backend ignoring per-key deletes — then re-fires sitemap invalidation and a rewrite-rules flush. Intended for the unseat.ai platform’s automated drift remediation.

2.6.1

  • IndexNow key file now served with an explicit HTTP 200. The text-file handler echoed the correct key body but left WordPress’s virtual-path 404 status in place, so Bing’s async IndexNow key validation rejected the file and silently dropped every submitted URL. Also applies to the llms.txt / llms-full.txt endpoints.

2.6.0

  • Duplicate <title> dedupe: collapses duplicate title tags in the document head (keeps the first), fixing the common “Multiple title tags” SEO error that occurs when a theme’s title-tag support and an SEO plugin (or another source) both emit a title. Safe on every site — only removes duplicates, never the sole title, so it can never leave a page title-less. Supersedes the standalone unseat-title-dedupe.php mu-plugin.

2.5.3

  • Cloudflare Edge cache purge on publish via the Cloudflare WordPress plugin hook, so a freshly published/updated URL and the sitemap are served fresh from the edge. Removed an earlier non-functional direct-API purge path.

2.5.2

  • Renamed plugin to “Unseat Connector” — the official plugin from Unseat AI Corporation, owner of the unseat.ai platform. Folder slug remains unseat-connector so existing installs upgrade in place.

2.5.1

  • Connector-side cache flush on publish: when the connector receives a publish or update, it issues a cache-purge request to known host CDN gateways (WP Engine, Cloudways, Kinsta) so the sitemap and freshly-published URL are served from the edge rather than a stale layer.

2.5.0

  • Sitemap cache hygiene: on publish/update, the plugin now invalidates the Rank Math sitemap cache and sets a short Cache-Control: max-age header on sitemap_index.xml and per-type sitemap responses so downstream CDNs revalidate sooner.

2.4.0

  • WordPress.org Plugin Check pass (clean) and reviewer-fix pass for resubmission. Folder slug remains unseat-connector so existing installs upgrade in place.
  • Added explicit Text Domain: unseat-connector header.
  • Switched parse_url() to wp_parse_url() for consistency across PHP versions.
  • Sanitized $_SERVER['REQUEST_URI'] with isset() + wp_unslash() + sanitize_text_field() before parsing.
  • Escaped the plain-text llms.txt page output through esc_html().
  • Reworked GA4 tag injection to use wp_enqueue_script() + wp_add_inline_script() instead of raw <script> tags in wp_head.

2.3.3

  • Full SEOPress support and graceful AIOSEO fallback for SEO coverage reporting.

2.3.2

  • SEO meta renderer for sites with no SEO plugin (description, canonical, OpenGraph, Twitter Card).

2.3.1

  • Static-file fallback for /llms.txt and /llms-full.txt. On every save of the llms-txt and llms-full-txt pages the plugin now also writes a real file at the WordPress root (ABSPATH/llms.txt, ABSPATH/llms-full.txt) so hosts that strip .txt URLs before WordPress is invoked still serve the file.
  • IndexNow key file gets the same static-file fallback (any 32-hex-char .txt page).
  • Static files are removed across all retraction paths: unpublishing a page, trashing a page, and permanent delete.

2.3.0

  • Fixed /llms.txt and /llms-full.txt 301-redirecting to trailing-slash variants. The plugin now suppresses WordPress’s redirect_canonical for these paths so AI crawlers that don’t follow redirects get the file directly on the canonical URL.
  • Added explicit AI-crawler allowlist to robots.txt via the robots_txt filter (GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, CCBot, Google-Extended, Applebot, Applebot-Extended, Amazonbot, Bytespider, Meta-ExternalAgent, FacebookBot, cohere-ai, cohere-training-data-crawler, DuckAssistBot, Diffbot, YouBot — each with Allow: /, Disallow: /wp-admin/, Crawl-delay: 0). No filter is injected when the site’s “Discourage search engines” setting is on.

2.1.0

  • Added Yoast SEO field support alongside Rank Math.
  • Added OpenGraph and Twitter Card meta field registration.
  • Improved conflicting plugin detection (AIOSEO, SEOPress, Squirrly).
  • Added analytics conflict detection (Site Kit, MonsterInsights, ExactMetrics).

2.0.0

  • Combined three separate mu-plugins into a single standard plugin.
  • Added backwards-compatible guard constants for legacy mu-plugins.
  • Added IndexNow key file serving.

1.0.0

  • Initial release — SEO meta fields, status endpoint, llms.txt serving.