{"id":363932,"date":"2026-09-17T09:40:48","date_gmt":"2026-09-17T09:40:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-content-flag\/"},"modified":"2026-09-17T10:17:25","modified_gmt":"2026-09-17T10:17:25","slug":"grafiduo-ai-content-flag","status":"publish","type":"plugin","link":"https:\/\/lin.wordpress.org\/plugins\/grafiduo-ai-content-flag\/","author":23559748,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.5","stable_tag":"trunk","tested":"7.1.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Grafiduo AI Content Flag","header_author":"Grafiduo","header_description":"Manual labelling of images, video, and posts generated or modified by AI (Art. 50 AI Act), with the official European Commission icons.","assets_banners_color":"0c3ea3","last_updated":"2026-09-17 10:17:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/grafiduo.pl\/products\/ai-content-flag-tiny\/","header_author_uri":"https:\/\/grafiduo.pl","rating":5,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":2,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.64":{"tag":"1.64","author":"grafiduo","date":"2026-09-17 09:40:35","revision":3699953},"1.65":{"tag":"1.65","author":"grafiduo","date":"2026-09-17 10:17:25","revision":3700047}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3699939,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3699939,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3699939,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3699939,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.64","1.65"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3699939,"resolution":"1","location":"assets","locale":"","width":833,"height":450},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3699939,"resolution":"2","location":"assets","locale":"","width":1127,"height":564},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3699939,"resolution":"3","location":"assets","locale":"","width":835,"height":301},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3699939,"resolution":"4","location":"assets","locale":"","width":717,"height":885},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3699939,"resolution":"5","location":"assets","locale":"","width":1280,"height":513},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3699939,"resolution":"6","location":"assets","locale":"","width":1280,"height":482},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3699939,"resolution":"7","location":"assets","locale":"","width":1280,"height":239}},"screenshots":{"1":"An AI-labelled product image in a shop listing. The badge sits in the corner of the image, on top of the theme's own markup, and only on the product that carries a label.","2":"The same label on the single product page.","3":"A post with the document-level disclosure printed at the start of the content.","4":"The label box in the post editor sidebar, with guidance on when each of the three EU label types applies.","5":"The media library, with the AI column showing at a glance what is labelled.","6":"Bulk actions in the media library: label or unlabel many files in one go.","7":"The same AI column in the post list table, so labelled posts are visible without opening them."}},"plugin_section":[],"plugin_tags":[2353,271023,23968,95008,25098],"plugin_category":[],"plugin_contributors":[281243,281244],"plugin_business_model":[],"class_list":["post-363932","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-ai-act","plugin_tags-disclosure","plugin_tags-labelling","plugin_tags-transparency","plugin_contributors-grafiduo","plugin_contributors-pgramcow","plugin_committers-grafiduo"],"banners":{"banner":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/banner-772x250.png?rev=3699939","banner_2x":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/banner-1544x500.png?rev=3699939","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/icon-128x128.png?rev=3699939","icon_2x":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/icon-256x256.png?rev=3699939","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-1.png?rev=3699939","caption":"An AI-labelled product image in a shop listing. The badge sits in the corner of the image, on top of the theme's own markup, and only on the product that carries a label."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-2.png?rev=3699939","caption":"The same label on the single product page."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-3.png?rev=3699939","caption":"A post with the document-level disclosure printed at the start of the content."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-4.png?rev=3699939","caption":"The label box in the post editor sidebar, with guidance on when each of the three EU label types applies."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-5.png?rev=3699939","caption":"The media library, with the AI column showing at a glance what is labelled."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-6.png?rev=3699939","caption":"Bulk actions in the media library: label or unlabel many files in one go."},{"src":"https:\/\/ps.w.org\/grafiduo-ai-content-flag\/assets\/screenshot-7.png?rev=3699939","caption":"The same AI column in the post list table, so labelled posts are visible without opening them."}],"raw_content":"<!--section=description-->\n<p>AI Content Flag lets you mark content as AI-generated or AI-modified and shows a visible label to your readers, in line with the transparency duty in Article 50 of the EU AI Act.<\/p>\n\n<p>Labelling is manual and deliberate: nothing is detected, guessed, or sent anywhere. You tick a box, the plugin renders the label \u2014 on the image, in the lightbox, and at the top or the bottom of the article.<\/p>\n\n<h4>Three label types<\/h4>\n\n<p>The plugin uses the three official European Commission labels:<\/p>\n\n<ul>\n<li><strong>AI (basic)<\/strong> \u2014 artificial intelligence was involved in creating the content.<\/li>\n<li><strong>AI Generated (fully)<\/strong> \u2014 the content was produced entirely by AI, with no human element beyond the prompt.<\/li>\n<li><strong>AI Modified (partially)<\/strong> \u2014 authentic material was partially changed by AI.<\/li>\n<\/ul>\n\n<p>The editor box explains when each one applies, so the decision does not have to be looked up every time.<\/p>\n\n<h4>What gets labelled<\/h4>\n\n<ul>\n<li><strong>Images and video<\/strong> in the media library \u2014 an overlay badge appears on the front end, including inside PhotoSwipe \/ lightbox views and on CSS background images.<\/li>\n<li><strong>Posts and pages<\/strong> \u2014 a disclosure note is printed at the start or the end of the content.<\/li>\n<li>Featured images, gallery and cover blocks, and markup produced by Elementor, Beaver Builder, Divi, and Bricks.<\/li>\n<\/ul>\n\n<h4>Other features<\/h4>\n\n<ul>\n<li>Four EU icon variants: black, white, and 50% transparent versions of each.<\/li>\n<li>Every label carries an accessible name, so screen readers announce what it means.<\/li>\n<li>Bulk actions in the media library to label or unlabel many files at once.<\/li>\n<li>An \"AI\" column in the media library and in post list tables, so you can see at a glance what is labelled.<\/li>\n<li>Works in the block editor and the classic editor. There is no block to insert and no shortcode to remember.<\/li>\n<li>Every label is a standard gettext string, so translations from translate.wordpress.org or your own .po file apply.<\/li>\n<li>Choose where the post disclosure sits: at the start of the content or at the end.<\/li>\n<li>On deletion the plugin asks whether to keep your labels and settings, and keeps them by default.<\/li>\n<\/ul>\n\n<h4>Performance<\/h4>\n\n<p>Nothing runs on the front end until something is actually labelled. The stylesheet loads only on pages that carry a label. On WordPress 6.9 or newer a full-page scan uses Core's template enhancement output buffer, and only once at least one media file is labelled. The list of labelled media is built once, cached for a day, and rebuilt only when media is added, edited, or removed.<\/p>\n\n<h4>External services<\/h4>\n\n<p>None. The plugin makes no outbound requests, loads no remote assets, sets no cookies, and collects no data. The settings screen links to the European Commission's page about the icons, but nothing is loaded from it.<\/p>\n\n<h4>Bundled icons<\/h4>\n\n<p>The icons in <code>assets\/icons\/<\/code> are the AI labelling icons published by the European Commission \u2014 three label types in four color variants. The Commission states on its page that they are \"made publicly available for everyone to use freely\", with no attribution required. Source: https:\/\/digital-strategy.ec.europa.eu\/en\/policies\/eu-icons-labelling-ai-generated-content<\/p>\n\n<p>This plugin is an independent project. It is not affiliated with, endorsed by, or connected to the European Commission or the European Union. Using the icons does not signal that a site has signed the Code of Practice on marking and labelling AI-generated content, and this plugin makes no such claim.<\/p>\n\n<h4>Add-on<\/h4>\n\n<p>An optional commercial add-on, Grafiduo AI Content Flag Pro, renders the labels its own way: a text badge with your own wording and colors in a corner of your choice, a styled keyboard-reachable tooltip with editable sentences, the document-level disclosure on further post types, and WooCommerce product-gallery hooks.<\/p>\n\n<p>Everything described above works without it. The free plugin contains no license check and withholds nothing.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/<\/code>, or install it from Plugins \u2192 Add New.<\/li>\n<li>Activate it through the Plugins screen.<\/li>\n<li>Go to Settings \u2192 AI Flag to choose the icon variant and where the post disclosure sits.<\/li>\n<li>Label a file from Media \u2192 Library (the \"AI label\" field), or a post from the \"AI label (Art. 50)\" box in the editor sidebar.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20detect%20ai%20content%20automatically%3F\"><h3>Does this detect AI content automatically?<\/h3><\/dt>\n<dd><p>No. Every label is applied by hand. Automatic detection is unreliable, and the AI Act places the disclosure duty on the person publishing the content.<\/p><\/dd>\n<dt id=\"does%20using%20this%20plugin%20make%20my%20site%20compliant%20with%20the%20ai%20act%3F\"><h3>Does using this plugin make my site compliant with the AI Act?<\/h3><\/dt>\n<dd><p>It gives you the tooling to disclose, but compliance depends on what you label and how. The plugin is not legal advice.<\/p><\/dd>\n<dt id=\"where%20do%20the%20icons%20come%20from%3F\"><h3>Where do the icons come from?<\/h3><\/dt>\n<dd><p>They are the labelling icons published by the European Commission for AI-generated content. See the link on the settings screen for the Commission's own guidance on when to use each one.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20use%20the%20eu%20icons%3F\"><h3>Do I have to use the EU icons?<\/h3><\/dt>\n<dd><p>This plugin renders the official icons, in the black, white, and 50% transparent variants, because those are the labels the Commission publishes. A text badge of your own is what the add-on is for.<\/p><\/dd>\n<dt id=\"will%20the%20page%20scan%20slow%20my%20site%20down%3F\"><h3>Will the page scan slow my site down?<\/h3><\/dt>\n<dd><p>It does not run at all until at least one file carries a label. Once something is labelled, the plugin works from a cached index of those files rather than querying the database per image. On WordPress 6.9 or newer the full-page pass uses Core's template enhancement output buffer. If you would rather it never scanned the whole page, return false from the <code>aicft_output_buffer<\/code> filter.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20the%20labels%3F\"><h3>Can I translate the labels?<\/h3><\/dt>\n<dd><p>Yes. Every label and accessible name is a standard gettext string, so a translation from translate.wordpress.org or your own .po\/.mo for the locale applies.<\/p><\/dd>\n<dt id=\"can%20i%20label%20woocommerce%20products%20or%20a%20custom%20post%20type%3F\"><h3>Can I label WooCommerce products or a custom post type?<\/h3><\/dt>\n<dd><p>Images are labelled wherever they appear, products included. The document-level disclosure covers posts and pages; the add-on extends it to further post types.<\/p><\/dd>\n<dt id=\"my%20theme%27s%20lightbox%20does%20not%20show%20the%20badge.\"><h3>My theme's lightbox does not show the badge.<\/h3><\/dt>\n<dd><p>The bundled script covers PhotoSwipe and the WordPress core lightbox. If your theme ships a different one, filter <code>aicft_lightbox_config<\/code> to feed it the same data.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20labels%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my labels if I delete the plugin?<\/h3><\/dt>\n<dd><p>They are kept. On deletion the plugin asks, and keeping them is the default, so reinstalling restores every label and setting.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Added a one-line pointer to the Pro add-on on this plugin's own Settings \u2192 AI Flag screen, plus a dismissible notice there (nowhere else) for anyone who hasn't seen it yet. Purely informational; nothing in this plugin depends on the add-on or is restricted without it. Hidden automatically once the Pro add-on is installed and active.<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Give the document-level disclosure a 300px-wide slot so hover text next to the label can wrap at a readable width instead of the icon.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Scan the full page through WordPress 6.9's template enhancement output buffer instead of leaving a plugin-owned ob_start() open until shutdown.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Sanitize badge and disclosure markup returned from filters with wp_kses before it is printed on the_content and render_block.<\/li>\n<li>Sanitize lightbox badge HTML after the aicft_lightbox_config filter, and encode the inline script payload so it cannot break out of a script tag.<\/li>\n<li>Escape the media-library field label, help text, and HTML that WordPress prints from attachment_fields_to_edit.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Removed the code for the custom text badge, badge colors and corner, tooltips and their sentences, extra content types, and the Polylang\/WPML string registration. None of it was reachable from this plugin's own screen; the separately distributed add-on now implements those features itself.<\/li>\n<li>Labels are the official EU icon plus an accessible name. There is no tooltip code in this plugin any more.<\/li>\n<li>Added the aicft_badge_html and aicft_disclosure_html filters so add-ons can replace the label markup, and removed the add-on pointer from the settings screen.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Renamed to Grafiduo AI Content Flag (slug: grafiduo-ai-content-flag) at the Plugins Team's request, for a more distinctive name.<\/li>\n<li>Fixed the Plugin URI, which pointed at a page that no longer resolves.<\/li>\n<li>Stopped bundling compiled translation files; the plugin relies on translate.wordpress.org and no longer calls load_plugin_textdomain().<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Stop parsing the whole page with DOMDocument when injecting badges. Markup is now updated with targeted replacements, so inline scripts, styles, and HTML5 templates are left intact.<\/li>\n<li>Resolve labelled media from the cached index instead of querying post meta for every image. Unlabelled archives no longer pay a database round-trip per thumbnail.<\/li>\n<li>Prime the post-meta cache when the index is first built, and store only filenames in the index and the lightbox payload.<\/li>\n<li>Skip block and content filters while the page buffer is running, exclude feeds from decoration, and flush the index when attachment image sizes are regenerated.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>First release in the WordPress.org plugin directory: manual AI labelling for images, video, posts and pages, with the official European Commission icons.<\/li>\n<\/ul>","raw_excerpt":"Label images, video, posts and pages that were generated or modified by AI, using the official European Commission icons.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/363932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=363932"}],"author":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/grafiduo"}],"wp:attachment":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=363932"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=363932"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=363932"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=363932"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=363932"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=363932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}