=== GetCited.me ===
Contributors: getcitedme
Tags: ai-visibility, llms-txt, geo, ai-search, ai-seo
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.0
Stable tag: 0.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

See which of your pages AI assistants actually cite, and fix the ones they skip — measured, not guessed.

== Description ==

Most AI-visibility plugins score your pages with rules that run on your own server. This one reports what AI assistants **actually answered**.

Connect the plugin to a GetCited.me account and it brings your measured visibility into wp-admin: which of your published pages were cited in real answers from ChatGPT, Claude, Gemini, Perplexity and Google AI Overviews, how those answers changed this week, and which pages the measurements say to fix first.

= What it does =

**Real citations, per page**
A column in your Posts and Pages lists showing how many times AI answers cited that exact URL in the last 30 days, and by which assistant. This is measured from answers, not inferred from your markup. Site administrators also see that page's Google Search clicks beside it when the project has Search Console connected; authors and editors see the AI citations only.

**A site inventory your crawler cannot build**
The plugin reports your published pages — titles, headings, FAQ blocks, structured-data types, word counts — straight from WordPress. Sites behind Basic Auth, "coming soon" pages, membership areas and bot-protected hosts are invisible to any external crawler; they are not invisible to a plugin running inside WordPress.

**Measured visibility, as the app shows it**
The Overview screen shows the share of tracked AI answers that named your site over the last 30 days — split by kind of question and by engine, with the daily trend, how you rank against the competitors those answers named, your Google Search totals for the same window as the app's Pages screen, and how many drafts are waiting for you in the Action Center. Every figure is read from GetCited.me; links open the same view in the app.

**What changed**
The last seven days, one line per tracked question: where an assistant started naming your site, where it stopped, where a competitor is cited in your place, and where an answer still names you but links to a look-alike domain. Each line opens the exact answer in GetCited.me.

**Fixes you review before anything is applied**
Per-page suggestions — title, meta description, answer-shaped opening, FAQ, structured data. Every one is shown as a preview with a copy button, and nothing is ever written without a click. Applying a title or a meta description writes a backup first and offers a single-click undo; everything else is copy-only, and the plugin says in plain words why each one is.

**Articles become WordPress drafts — on your click, never on their own**
Everything GetCited.me prepared for this site is listed in the plugin — the same list, with the same statuses, as Action Center in the app: briefs, articles being written, finished articles, and what became of each one in WordPress (draft, scheduled, published, or moved to the Trash). Pressing **Create WordPress draft** on a finished article creates one draft post with you as its author — its text as blocks, its SEO fields in your SEO plugin, its poster and its FAQ structured data — and nothing is published until you publish it. **Create draft in WordPress** in the app does the same through a single-use link. Nothing is created by a background task; exactly what a draft contains is in the FAQ below.

**Page report**
Every page GetCited.me knows on your site, with its citation-readiness score, AI citations, Google Search clicks, impressions and position (from the project's Search Console — administrators only), Google index state, whether outside crawlers can reach it, and the one fix worth making first — linked straight to the Fixes screen for that page.

**Your GEO audit, all of it**
The latest GEO audit from your GetCited.me account as the app shows it: the readiness score, the page-level findings, every recommendation with its evidence and the draft it comes with, the implementation checklist, every generated file, and whether your live llms.txt, ai.txt and robots.txt match what the audit recommended. A link opens the same audit in GetCited.me. You can tick checklist items and re-check the live files from wp-admin; running a new audit is billed against your plan, so it starts from your account.

**Site files you review before they go live**
The audit's llms.txt and ai.txt can be served from WordPress, and the audit's crawler rules (its User-agent groups for GPTBot, ClaudeBot and the rest) can be added to the robots.txt WordPress generates. Each change is shown first as a difference against what your site serves right now, happens only when you press Publish, and can be undone with one click. Nothing is published on connect, on opening a screen or on a schedule, and no file is ever written into your site's folder.

= Works with your existing setup =

This is not an SEO plugin and it does not want to be one. If Yoast SEO, Rank Math, All in One SEO, SEOPress or The SEO Framework already handles something, the plugin says so and stands aside: titles and meta descriptions go into your SEO plugin's own fields, structured data and an llms.txt it already serves are left alone, and robots.txt is never written as a file. How each case is handled is in the FAQ below.

= What it does not do =

No plugin can guarantee a citation, a ranking, or a place in an AI-generated answer, and this one does not claim to. It measures, it reports, and it prepares changes you approve. `llms.txt` is a proposed convention, not an adopted standard, and crawler behaviour varies by provider and changes over time.

== Third Party Services ==

This plugin is the WordPress interface to GetCited.me, a hosted service. It is not usable without a GetCited.me account, and it contacts that service only after you connect one.

**GetCited.me API**

* **Service:** GetCited.me — https://getcited.me
* **Endpoint:** `https://api.getcited.me`
* **When:** Only after you complete the connection step in the plugin's settings, and from then on when you open a plugin screen, when you open the Posts or Pages list (the AI citations column, cached for a short while), once a day when WordPress runs this plugin's scheduled task, when you press a button that asks for data (including **Create WordPress draft**), and once in the background shortly after a post that was created from a GetCited.me article is scheduled, published, taken back to draft, moved to or restored from the Trash, or deleted — and once when you delete the plugin while connected, to revoke its access token (three-second limit; deactivating sends nothing). Never before you connect and never while disconnected. The plugin itself never contacts the service from a visitor's browser; the one exception is images inside posts created from GetCited.me articles, which visitors' browsers load from where they are hosted — see "Images in posts created from GetCited.me articles" below.
* **Data sent:** when you connect, the pairing code you pasted, your site URL, the address of this plugin's verification route on your site (its REST API address, so sites in a subfolder or on plain permalinks can be verified) and the address of your wp-admin (used only to build links from GetCited.me back into this plugin's screens). Then, with every request: your site URL, the environment type WordPress reports for it (production, staging, development or local — sent with every request as the `X-Site-Env` header), your WordPress and PHP versions, and this plugin's version; then, for each published post and page: its ID, URL, slug, post type, title, publication and last-modified dates, which editor or page builder produced it, its heading outline, its first paragraph, its word count, how many lists and tables it contains, whether it has an FAQ block, which structured-data types it declares, the SEO title and meta description your SEO plugin holds for it (and which plugin that is), whether it is marked `noindex`, and a one-way hash of its text used only to tell whether the page changed since the last report, together with a yes/no flag saying whether the plugin was able to read that page at all. Post bodies are not sent — the first paragraph is the only body copy that leaves your site. Draft, private and password-protected content is not sent. For a draft created from a GetCited.me article, the plugin sends that post's ID and its edit-screen URL when the draft is created or goes back to draft, the date and time WordPress will publish it when you schedule it (with your site's time zone offset, so GetCited.me moves the article's planned day on its Plan to the day you scheduled), its public permalink and publication date once you publish it, and the word "trashed" or "deleted" when it is moved to the Trash or deleted — never its content. On the Articles screen, the status tab, page number and any search text you type are sent to fetch the matching list; when you open a GetCited.me app link to create a draft, the single-use code it carries is sent back once to be checked. When you tick or untick an audit checklist item, the plugin sends that item's ID and whether it is done; when you press **Re-check now** on the Audit screen, it sends the audit's ID, and GetCited.me then fetches your site's public llms.txt, ai.txt and robots.txt to compare them with the audit. The request sent when you delete the plugin carries only what every request does. No visitor data, no personal data of your readers, and no credentials are ever transmitted.
* **See it for yourself:** press **Show the data that would be sent** on the plugin's Settings screen (see the FAQ).
* **Data received:** your measured AI-visibility data for that site, per-page citation counts, your GEO audits (score, page-level findings, recommendations with their evidence, the implementation checklist, the generated files — llms.txt, ai.txt, robots.txt, structured data and the other drafts — and whether your live files match them) and the suggested page fixes shown in the plugin; the briefs and articles prepared for your site in GetCited.me — on the Articles screen their titles, languages, statuses (including where and when each was published and what became of its WordPress post), created, updated and planned dates, word counts, poster image links and a link to each in GetCited.me, and for one article its title, slug, language, text, SEO title and description, focus keyphrase and keywords, excerpt, planned date, author name, job title and short bio, poster image link with its alt text and photographer credit, FAQ — when you open the Articles screen or create a draft; and per-page Google Search Console metrics — clicks, impressions, click-through rate and average position over the same window as the Pages screen in the GetCited.me app — when the project's owner has connected Search Console in GetCited.me (no search queries come with these per-page metrics). Search queries do reach the plugin in one place: when the project has Search Console connected, the GEO audit's search-demand findings quote the searches Google sends your site, with their impressions, clicks and average positions, and the Audit screen shows them to administrators only. Search Console data is shared with the whole project team in GetCited.me, so a site paired by any team member — the owner or a collaborator — receives the same Google figures; only the owner can connect, change or disconnect Search Console, and that is never done from the plugin.
* **Data received for the Overview:** the share of tracked AI answers that named your site over the last 30 days — by kind of question, by engine and by day — the names, website domains and mention counts of the competitors those answers named, the changes of the last seven days with the tracked question and answer each belongs to, the number of drafts waiting in your Action Center, and your site's Google Search Console totals (clicks, impressions, click-through rate, average position) for that window and, to show the change, for the same number of days just before it. Every Google number in the plugin — on the Overview, the Pages screen and the Posts list — covers the same days as the Pages screen in the GetCited.me app: the 30 days ending today, up to the newest day Google reported.
* **Purpose:** the plugin has no measurements of its own. Everything it shows is computed by the service from AI answers collected for your site.
* **Terms of Service:** https://getcited.me/terms-of-service
* **Privacy Policy:** https://getcited.me/privacy-policy

**Poster download from GetCited.me (api.getcited.me)**

* **When:** Only when a draft is created — **Create WordPress draft** in the plugin, or **Create draft in WordPress** in the GetCited.me app — from an article whose poster is an image you uploaded to GetCited.me. Your server downloads that one file once from `https://api.getcited.me`, GetCited.me's upload host, and adds it to your Media Library; from then on your site serves it. No other poster is ever downloaded.
* **Data sent:** an ordinary image request from your server — its IP address and WordPress's user agent. No site or visitor data.

**Images in posts created from GetCited.me articles**

These images are loaded by the browser of whoever views the post, not by the plugin, and only on posts created from GetCited.me articles with **Create WordPress draft** in the plugin or **Create draft in WordPress** in the GetCited.me app.

* **Which images:** only images that were in the GetCited.me article. Images inside the article text keep their original addresses: an image you uploaded to GetCited.me loads from `api.getcited.me`, an Unsplash photo from `images.unsplash.com`, and an image the article took from another website from that website. A poster that you did not upload to GetCited.me is placed the same way — an Unsplash photo with the photographer credited underneath, because Unsplash's licence terms require it to be shown from Unsplash's servers rather than copied; an image from another website pointing at that website.
* **When:** each time someone views such a post on your site, or opens its draft in the editor — and, for an Unsplash poster on a site with Yoast SEO or SEOPress, whenever a social network or messaging app builds a link preview of the post, because the photo's Unsplash address is set as the post's social sharing image.
* **Data sent:** nothing by the plugin itself. The viewer's browser requests the image the way it requests any embedded image, which tells that host the viewer's IP address, browser and the page the image is embedded on. The photographer credit under an Unsplash photo links to the photographer's Unsplash profile and to Unsplash with `utm_source=getcited_me&utm_medium=referral` added, as Unsplash's attribution guidelines require; following a link tells Unsplash the visitor came from this credit.
* **To stop it for a post:** replace those image blocks with images from your Media Library, or remove them, and clear the social image in your SEO plugin.
* **GetCited.me:** Terms of Service https://getcited.me/terms-of-service — Privacy Policy https://getcited.me/privacy-policy
* **Unsplash** (https://unsplash.com): Terms of Service https://unsplash.com/terms — Privacy Policy https://unsplash.com/privacy
* **Other websites:** whichever site hosts the image; its address is in the image block.

== Installation ==

1. Install and activate the plugin.
2. Open **GetCited.me** in the WordPress admin menu.
3. Press **Connect**, then paste the one-time pairing code from your GetCited.me account under Settings → Integrations. The code is valid for ten minutes and is exchanged for a token bound to that one site.
4. That is the whole setup. From then on the plugin reports your page inventory once a day, in the background. Articles never arrive on their own: a draft is created only when you press **Create WordPress draft** on the Articles screen, or **Create draft in WordPress** in the GetCited.me app.

WordPress's scheduler is not a clock: it runs pending tasks at the end of somebody's page view, so a site with no visitors for a week does not report for a week. The plugin's Settings screen shows when the daily report last ran and when it is next due. If your site is quiet, or you have set `DISABLE_WP_CRON`, point a real cron at `wp-cron.php` — or run `wp cron event run getcited_me_sync` — and it will report on time.

You need a GetCited.me account. The free plan is enough to connect a site and see measured visibility for it.

== Frequently Asked Questions ==

= Do I need a GetCited.me account? =

Yes. The plugin displays measurements the hosted service produces; it computes nothing locally. A free account is enough to connect one site.

= Does it replace my SEO plugin? =

No, and it is built not to. Yoast, Rank Math, All in One SEO, SEOPress and The SEO Framework keep owning titles, meta and schema. This plugin writes into their fields rather than beside them, and steps aside from anything they already handle.

* Titles and meta descriptions are written to **your SEO plugin's own fields** — the same rows Yoast SEO, Rank Math or SEOPress write themselves — so nothing is duplicated and nothing is lost if you disable this plugin. All in One SEO keeps these in its own database table rather than in post meta, so on an AIOSEO site the plugin offers the text to copy and does not write it. With no SEO plugin at all there is no field to write to, and the plugin says so instead of inventing one.
* Structured data is skipped entirely when your SEO plugin already outputs it.
* If an SEO plugin already serves `llms.txt`, this one does not take it over. It links you to that plugin's own setting instead.
* `robots.txt` is never written as a file. When WordPress generates your robots.txt, the plugin can add the audit's crawler rules as one clearly marked block at the end — after anything Yoast SEO adds, and without editing a line of it. If a real robots.txt file exists, if Rank Math, All in One SEO or SEOPress writes robots.txt from its own editor, or if the file already has rules for the same crawlers, the plugin adds nothing and shows you the lines to paste there instead.

= What data leaves my site? =

Your site URL and a structural summary of published pages — titles, headings, structured-data types, first paragraphs, word counts, and the SEO title and description your SEO plugin already stores. For posts created from GetCited.me articles, also the post ID, its edit-screen URL, its scheduled date, its permalink and publication date once published, and whether it was trashed or deleted; and, when you search the Articles screen, the words you type. Never post bodies, never drafts or private posts, never visitor data. (Visitors' browsers do request the images inside posts created from GetCited.me articles from the hosts those images live on — that is the browser, not the plugin, and it is described in Third Party Services.) The exact list is in the Third Party Services section above, and nothing is sent until you connect an account. You can also read the exact payload yourself, before it is sent: press **Show the data that would be sent** on the plugin's Settings screen. It opens `/wp-json/getcited-me/v1/inventory` for your signed-in administrator session, builds the report and returns it to you without contacting the service. (Typed into the address bar on its own, that address answers 401: WordPress's REST API asks for a one-time value the button supplies.)

= Will it change my content without asking? =

No. Suggested page fixes are shown as a preview with a copy button. Of those, only titles and meta descriptions can be applied at all, only when you press Apply on that specific page, and each one saves a backup so a single click undoes it. The site files work the same way: llms.txt, ai.txt and the robots.txt crawler rules are shown as a difference against what your site serves now, published only when you press the button under that difference, and undone with one click — the plugin never publishes them on connect, on opening a screen or on a schedule. An article becomes a WordPress post only when you press **Create WordPress draft** in the plugin or **Create draft in WordPress** in the GetCited.me app (that link works once, for ten minutes, and only for the article it was made for), and only as a draft: the plugin never publishes anything, never edits a post you published, and never replaces a draft you edited without asking you first. The scheduled background task never applies or creates anything — it only reports your page inventory, and tells GetCited.me what became of an article-based post (scheduled, published, back to draft, trashed or deleted).

= Why can't I apply the other suggestions? =

Because a plugin cannot know where they go. An answer-shaped opening replaces the first paragraph of your page; an FAQ block belongs above your related links; a corrected heading outline replaces headings you wrote. Those are positions in your own writing, on your own theme, and GetCited.me marks each suggestion with whether a machine could install it safely rather than guessing. Suggestions that still contain a placeholder are copy-only for the same reason: only you know what belongs there.

= Does it slow down my site? =

No. The plugin loads no JavaScript and no CSS for visitors, and makes no network request from a front-end page view. The llms.txt and ai.txt you publish from it, and the crawler rules it adds to robots.txt, are read from the database only on requests for those three files. On a post created from a GetCited.me article it prints that article's FAQ — and, on a site without an SEO plugin, its Article data — as small JSON-LD blocks, read from the post's own data; and the images that came with the article — except a poster you uploaded to GetCited.me, which is copied to your Media Library — are loaded by visitors' browsers from where they are hosted: `api.getcited.me`, Unsplash, or the website the image came from (see Third Party Services). Everything else happens in the admin area and in background tasks: the daily summary of your published pages, and a one-off report after an article-based post is scheduled, published, trashed or deleted.

= Is it affiliated with the other "GetCited" plugin in this directory? =

No. This plugin is published by GetCited.me (https://getcited.me). It is not affiliated with, endorsed by, or connected to the `getcited` plugin by heytc, getcited.tech, getcited.in, or any other similarly named product. That is a statement about affiliation only and makes no claim about those products.

= How does an article become a WordPress draft? =

Everything GetCited.me prepared for this site is listed in the plugin — the same list, with the same statuses, as Action Center in the app: briefs, articles being written, finished articles, and what became of each one in WordPress (draft, scheduled, published, or moved to the Trash). A brief links to GetCited.me, where its article is written; a finished article has a full preview. Pressing **Create WordPress draft** on one article creates one draft post with you as its author: the text as WordPress blocks (nested lists stay nested), the SEO title, meta description and focus keyphrase in your SEO plugin's own fields, the poster image, and the article's FAQ as FAQPage structured data on that post only. On a site without an SEO plugin, the published post also carries its Article structured data (title, address, dates, author, image), printed by this plugin on that post only and never next to an SEO plugin's own. Only a poster you uploaded to GetCited.me is copied into your Media Library; an Unsplash photo or an image from any other site is placed as an image block that loads from where it is hosted (see Third Party Services), and so are the images inside the article text. An Unsplash photo is always shown with its photographer credited and linked, as Unsplash requires, and with Yoast SEO or SEOPress it is also set, by its Unsplash address, as the post's social sharing image. It is a draft: nothing is published until you publish it from the editor. Pressing the button again updates the same draft instead of creating a second one, and never overwrites a draft you edited unless you confirm it (your edited version stays in the post revisions). **Create draft in WordPress** in the GetCited.me app does the same in one step: it opens this screen on that article with a single-use code, valid for ten minutes, which the plugin checks with GetCited.me before it creates anything — a link opened a second time, opened after the ten minutes, or without its code creates nothing and leaves the button for you to press. Nothing is created by a background task.

= What happens when I disconnect or uninstall? =

Disconnecting from the plugin's settings screen revokes the access token on the service and deletes it from your database. The llms.txt, ai.txt, robots.txt rules and structured data the plugin was publishing are switched off and kept: reconnecting the site to the same GetCited.me website switches them back on exactly as they were, and connecting it to a different website starts clean. If the service cannot be reached at that moment, the token is still deleted from this site, and you can revoke it from your GetCited.me settings — a service your site cannot reach must never be able to hold your site in a connected state. Deleting the plugin from the Plugins screen first asks the service to revoke this site's access token — one request, given up after three seconds; if the service cannot be reached the plugin is deleted anyway and you can revoke the token from your GetCited.me settings — and then removes every option, post meta value and scheduled task it created. Deactivating the plugin revokes nothing and keeps the connection, so reactivating it picks up where it left off. Posts created from GetCited.me articles, and the images added to your Media Library for them, are your content and are kept; only the plugin's own bookkeeping on them is removed, so their FAQ and Article structured data stop being printed.

= What if the connection is revoked in GetCited.me? =

A connection revoked in GetCited.me (Settings → Disconnect, a new pairing of the same project somewhere else) or one whose credential expired is noticed on the plugin's next request: the plugin forgets the credential, switches off the llms.txt, ai.txt, robots.txt rules and structured data it was serving, stops its daily report, and shows a "connection was revoked — pair again" notice on its screen. Pairing again with a new code restores what the site was publishing.

= Who can do what? =

The plugin's screens are for administrators (`manage_options`). Listing and reading the articles GetCited.me prepared needs `edit_others_posts` (Editor and up); creating a WordPress draft from one needs `edit_posts`. A page fix rewrite spends the plan's monthly page fixes, so it is an administrator's action and also needs permission to edit that page; applying or undoing a title or description needs permission to edit that page.

= Where is the source of the compiled JavaScript? =

The admin screen's JavaScript in `admin/build/` is compiled. Its full, human-readable source ships with the plugin in `admin/src/`, together with `admin/package.json`, `admin/package-lock.json`, `admin/vite.config.ts` and `admin/tsconfig.json`. To rebuild it (Node.js 20 or newer):

1. `cd admin`
2. `npm ci`
3. `npm run build` — type-checks the TypeScript and writes `admin/build/` with Vite.

The release archive is built with `npm run build:zip`, which always rebuilds the admin bundle and the translation template first, so a shipped bundle always matches the shipped source.

== Changelog ==

= 0.1.0 =
* Initial development version. Not yet released.
* Pairing works on WordPress installed in a subfolder and on plain permalinks; links from GetCited.me open this site's own wp-admin.
* A revoked or expired connection is detected on the next request: the plugin disconnects itself, stops serving its files and asks to pair again.
* Plain-permalink posts are reported by their own address instead of all reading as the home page.
* Daily background report of the published page inventory, scheduled on connect and removed on disconnect.
* Fixes screen: per-page suggestions with a copy button, and Apply/Undo for titles and meta descriptions through your SEO plugin's own fields.
* Articles screen: the same list and statuses as Action Center in GetCited.me (search, status tabs, pages); preview an article and turn it into a WordPress draft on click, here or from the app's Create draft in WordPress through a single-use link — blocks with nested lists, SEO title, description and focus keyphrase, poster image with its credit, FAQ structured data, and Article structured data on sites without an SEO plugin — with no duplicates and no silent overwrite of edited drafts. Scheduling, publishing, trashing or deleting the post is reported back, so GetCited.me never shows a scheduled post as published or a deleted one as a draft.
* Page report: score, AI citations, Google Search clicks and position, index state and the top fix per page; Google clicks also appear beside AI citations in the Posts and Pages lists, for site administrators only.
* Overview: the measured figures of the app's Overview for the last 30 days — the share of AI answers naming the site by kind of question and by engine, the daily trend, the competitor ranking, Google Search totals over the app's Pages window, and the Action Center count — with every change of the week linked to its exact answer in GetCited.me. Drafts no longer borrow the home page's numbers in the Posts list.
* Audit screen: the whole audit as the app shows it — every recommendation with its evidence and draft, the checklist (tickable), every generated file with its deployment state and a re-check, page-level findings, and a link to the audit in GetCited.me.
* Site files: llms.txt, ai.txt and the robots.txt crawler rules are published only after a reviewed difference and a click, and every change can be undone. Publishing the audit's llms.txt no longer happens from a single button on the Audit screen.
* Deleting the plugin revokes this site's access token on the service before it removes its data, instead of leaving the token live until it expires.

== Upgrade Notice ==

= 0.1.0 =
First public release.
