AI transparency label for WordPress
Article 50 of the European AI Act, Regulation (EU) 2024/1689, requires in a number of cases that people are told when something has been created or edited with AI. This plugin handles the practical part of that: for each post or page, you record how much AI was involved, you show that to your visitor in a sentence you write yourself, and you publish the same fact in a form a machine can read. It is a record-keeping tool, not a lawyer and not a detector.
You tick one box, and up to three things can come out of it
You make the choice exactly once, in the sidebar of the editor. What happens with it depends on three switches that work independently of each other and that are all off after installation. A fresh install therefore changes nothing on your public pages, and that is deliberate.
The label on the page
A sentence you have written, above or below the content, or via a block or the shortcode [theseo_ai_label] wherever you choose to place it.
You write two versions, one in Dutch and one in English. The language of the site determines which one is shown.
The meta element in the head
A line in the <head> of the page:
<meta name="ai-content-declaration" content="ai-assisted">
That name is a convention of this plugin, not a registered standard. The readme says so in as many words.
The JSON-LD block
A schema.org CreativeWork node with its own @id ending in #ai-declaration, with your label text in creditText.
It sits alongside the structured data from Yoast or Rank Math: the plugin adds its own block and does not touch theirs. That combination has not yet been tested with both plugins running together on a live WordPress site.
The question that comes up naturally as soon as you use AI
The point is rarely whether you use AI. Almost every editorial team does so somewhere in the process by now. The point is that nobody can tell afterwards which piece it happened to and which it did not, and that question is being asked more and more often: by a client, by whoever commissions the text, and since Article 50 of the European AI Act, in a number of cases, by the law as well.
What happens next is almost always the same
Someone adds a line under one article, forgets it on the next twenty, and six months later there is no way left to work out what actually happened. That is not bad intent, it is the absence of a place where that choice belongs.
This plugin creates that place
It sits in the sidebar of the editor, it asks one thing, and it keeps track of which pieces have not yet answered the question.
What the plugin actually does
Four parts.
The panel in the editor
A panel in the block editor and a block in the classic editor, with the three statuses and two optional fields: which model or tool, and who checked it.
The overview
Every published item with the status it carries, with the items that have no status yet at the top, and a bulk action to set many at once. Optionally a counter in the admin bar showing how many items have no declaration.
The label
The sentence your visitor reads is your sentence, not a translation from us. You write a Dutch and an English version on the settings screen, and the language of the site chooses between them. Placement above the content, below the content, or wherever you choose via the block or the shortcode [theseo_ai_label].
The machine-readable part
Two things, each with its own switch: the meta element in the head and the JSON-LD block. What each one contains is set out in FIG.01.
Three choices, and what each of the three delivers
There are three statuses and there will not be a fourth. The reason is that nobody fills in a seven-point scale consistently in practice, and a choice that is not filled in consistently is not record-keeping but a feeling. Alongside the status, you can optionally fill in two things per post: which model or tool, and who checked it.
compositeWithTrainedAlgorithmicMedia is added to the JSON-LD.trainedAlgorithmicMedia is added to the JSON-LD. That is the vocabulary the industry uses for exactly this question.How to install it, in four steps
No account is needed, no key and no registration. An ordinary WordPress site where you are an administrator is enough.
manage_options, so administrator.Click the download button above. You get theseo-ai-transparantie-1.0.0.zip, 40 KB. Do not unzip it: WordPress wants the zip file itself.
In your WordPress: Plugins, Add New Plugin, Upload Plugin. Choose the file and click Install Now.
Click Activate Plugin. A new item appears in your admin menu. Your site does not change yet at this point.
Open the settings screen and go through the statuses. Everything that touches your public site stays off until you switch it on yourself.
What it does not do, and why that matters
Here are the two claims that plugins in this category usually get wrong.
- It does not make you AI Act compliant, and be wary of any plugin that claims it does. Article 50 places the heaviest transparency obligations on providers of AI systems, not on everyone who writes a blog. Whether and how a disclosure obligation applies in your case depends on what you publish and on your role, and that is legal work. This plugin records a choice and displays it. That is a useful part of the work, not all of it.
- It does not detect AI text. Nothing is scanned and nothing is guessed. Detection of AI text does not work reliably, so this plugin does not pretend otherwise. The status is your own declaration, not software's judgement of your text.
- The name of the meta element is not a standard.
ai-content-declarationis a convention of this plugin. The IPTC values in the JSON-LD are: that vocabulary is used across the industry for exactly this question.
Four values per post, and nothing about who reads your site
Everything sits in the post meta of the item you are declaring, plus one settings row with your label text. There is no table, no log and no second location. The right-hand column is not a promise but the reason this plugin stays outside your record of processing activities.
_theseo_ai_stand, one of three fixed values_theseo_ai_tool, the model or tool you type in yourself, up to 200 characters_theseo_ai_controleur, the person you type in yourself, up to 200 characters_theseo_ai_gewijzigd, the moment you last changed the choice- One options row with your settings and your label text
- Anything about the visitor reading the page
- A cookie or anything in localStorage or sessionStorage
- An IP address
- A request to a server outside your own site
- The text of your post, anywhere other than where WordPress already stores it
uninstall.php. Search the code for wp_remote_get or curl and you will find nothing, because this is a plugin that only does something within your own editorial process.Privacy: what is and is not recorded
This is the simplest privacy section of all eight of our plugins, because there is no visitor involved.
Nothing about your visitor is recorded
No IP address, no cookie, no browser storage, no user agent, no counter. The plugin does not look at your visitors; it looks at your editorial process.No outgoing request
Search the unpacked zip forwp_remote_get, curl or file_get_contents. Zero hits. There is no account, no key and nothing that talks to the outside world.Everything stays in your own WordPress
Four meta keys per post and one options row, nothing more. All four keys are named in FIG.03.Deleting it leaves nothing behind
uninstall.php removes the meta keys and the options row. Deactivating leaves them in place, so you lose nothing if you switch it off for a while.Nothing is on by default on your front end
The label, the meta element and the JSON-LD block are all three off after installation. A plugin that starts putting sentences on your site just because you installed it is a plugin you do not want.What we publish ourselves about our own use of AI is on our AI transparency statement. That page was written by hand and not made with this plugin, because this site does not run on WordPress.
Frequently asked questions
Do I get two JSON-LD blocks if I use Yoast or Rank Math? No. This plugin's node has its own @id ending in #ai-declaration and sits alongside the structured data from your SEO plugin. Nothing of theirs is changed or overwritten.
Can I place the label myself instead of above or below the text?
Yes, with the block or with the shortcode [theseo_ai_label]. The setting that decides which statuses get a label also applies there.
Does it work on custom post types?
Yes. On the settings screen you choose for yourself which post types get the panel.
What happens to posts that already existed?
They carry no status until you give them one. They appear at the top of the overview, and the bulk action sets them all to the right status in one go.
Is the interface in Dutch?
The interface is translated and follows the language of your site. The label text your visitor reads is not a translation but your own sentence, written by you in both languages.
Does anything change on my site as soon as I activate it?
No. All three outputs are off. You only see a panel in the editor.
What it gives you in the first week
The practical order is: install it, open the overview, use the bulk action for what is already there, and only turn the label on once you are happy with your own sentence. If you want to widen the view to what AI does with your content after it has been fetched, that is covered in the AI crawler log. What we publish ourselves about our own use of AI is on our own statement. If you would like to talk it through, book a call.