{"id":289650,"date":"2026-03-19T17:28:00","date_gmt":"2026-03-19T17:28:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/kansleri-cookie-consent\/"},"modified":"2026-10-19T09:34:13","modified_gmt":"2026-10-19T09:34:13","slug":"kansleri-cookie-consent","status":"publish","type":"plugin","link":"https:\/\/id.wordpress.org\/plugins\/kansleri-cookie-consent\/","author":23464912,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.8.9","stable_tag":"1.8.9","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Kansleri Cookie Consent","header_author":"Kansleri.fi","header_description":"Free, no-ads GDPR cookie consent with script blocking, consent logging, Google Consent Mode v2, and AI-assisted setup. Perfect for personal sites and small businesses.","assets_banners_color":"f0f0f1","last_updated":"2026-10-19 09:34:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/kansleri.fi","rating":5,"author_block_rating":0,"active_installs":900,"downloads":8948,"num_ratings":7,"support_threads":3,"support_threads_resolved":3,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tapiokansleri","date":"2026-03-19 17:28:00","revision":3486722},"1.1.0":{"tag":"1.1.0","author":"tapiokansleri","date":"2026-03-20 10:52:10","revision":3487135},"1.2.0":{"tag":"1.2.0","author":"tapiokansleri","date":"2026-03-21 11:55:13","revision":3487750},"1.2.1":{"tag":"1.2.1","author":"tapiokansleri","date":"2026-03-21 12:02:05","revision":3487754},"1.3.0":{"tag":"1.3.0","author":"tapiokansleri","date":"2026-03-25 15:28:16","revision":3491051},"1.4.0":{"tag":"1.4.0","author":"tapiokansleri","date":"2026-04-22 13:43:57","revision":3512921},"1.5.0":{"tag":"1.5.0","author":"tapiokansleri","date":"2026-04-28 08:52:23","revision":3517125},"1.5.1":{"tag":"1.5.1","author":"tapiokansleri","date":"2026-04-28 11:18:59","revision":3517300},"1.6.0":{"tag":"1.6.0","author":"tapiokansleri","date":"2026-05-19 15:39:44","revision":3537597},"1.6.1":{"tag":"1.6.1","author":"tapiokansleri","date":"2026-05-28 14:07:00","revision":3552298},"1.6.2":{"tag":"1.6.2","author":"tapiokansleri","date":"2026-05-28 14:16:38","revision":3552314},"1.7.0":{"tag":"1.7.0","author":"tapiokansleri","date":"2026-07-01 13:28:34","revision":3592726},"1.7.1":{"tag":"1.7.1","author":"tapiokansleri","date":"2026-07-03 09:58:12","revision":3595062},"1.7.2":{"tag":"1.7.2","author":"tapiokansleri","date":"2026-07-09 13:33:20","revision":3601554},"1.8.0":{"tag":"1.8.0","author":"tapiokansleri","date":"2026-08-07 13:29:10","revision":3637915},"1.8.1":{"tag":"1.8.1","author":"tapiokansleri","date":"2026-08-07 13:34:45","revision":3637924},"1.8.2":{"tag":"1.8.2","author":"tapiokansleri","date":"2026-08-08 11:46:18","revision":3638666},"1.8.3":{"tag":"1.8.3","author":"tapiokansleri","date":"2026-09-18 15:42:39","revision":3702253},"1.8.4":{"tag":"1.8.4","author":"tapiokansleri","date":"2026-10-02 09:20:33","revision":3724446},"1.8.5":{"tag":"1.8.5","author":"tapiokansleri","date":"2026-10-05 09:10:44","revision":3728487},"1.8.6":{"tag":"1.8.6","author":"tapiokansleri","date":"2026-10-07 14:41:25","revision":3732818},"1.8.7":{"tag":"1.8.7","author":"tapiokansleri","date":"2026-10-08 08:53:47","revision":3734056},"1.8.8":{"tag":"1.8.8","author":"tapiokansleri","date":"2026-10-14 10:38:18","revision":3746047},"1.8.9":{"tag":"1.8.9","author":"tapiokansleri","date":"2026-10-19 09:34:13","revision":3754407}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":7},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3491024,"resolution":"128x128","location":"assets","locale":"","width":142,"height":142},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3491024,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3487063,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3487063,"resolution":"772x250","location":"assets","locale":"","width":722,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3754407,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/options-general.php?page=kansleri-cookie-consent\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Kansleri Cookie Consent Demo\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"kansleri-cookie-consent\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0","1.2.1","1.3.0","1.4.0","1.5.0","1.5.1","1.6.0","1.6.1","1.6.2","1.7.0","1.7.1","1.7.2","1.8.0","1.8.1","1.8.2","1.8.3","1.8.4","1.8.5","1.8.6","1.8.7","1.8.8","1.8.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3486721,"resolution":"1","location":"assets","locale":"","width":1280,"height":437},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3486721,"resolution":"2","location":"assets","locale":"","width":977,"height":939},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3486721,"resolution":"3","location":"assets","locale":"","width":977,"height":716},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3486721,"resolution":"4","location":"assets","locale":"","width":968,"height":584},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3486721,"resolution":"5","location":"assets","locale":"","width":1007,"height":536},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3486721,"resolution":"6","location":"assets","locale":"","width":984,"height":885},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3486721,"resolution":"7","location":"assets","locale":"","width":986,"height":755},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3486721,"resolution":"8","location":"assets","locale":"","width":941,"height":256}},"screenshots":{"1":"Cookie consent banner on the frontend (corner popup style)","2":"General settings \u2014 customize banner style, colors, typography, and button texts","3":"Cookies tab \u2014 scan your site, auto-detect cookies, and use AI to generate descriptions","4":"Policy Page tab \u2014 select your policy page and generate a complete privacy policy with one AI prompt","5":"Integration tab \u2014 Google Consent Mode v2 and Site Kit \/ WP Consent API status","6":"Script Blocking tab \u2014 auto-detected third-party scripts blocked before consent","7":"Statistics tab \u2014 consent response summary with accept, reject, and custom breakdown","8":"Consent Log \u2014 anonymized per-visitor audit trail with CSV export","9":"Blocked YouTube embed showing the video thumbnail with an \"Accept marketing cookies\" button before consent"}},"plugin_section":[],"plugin_tags":[20272,16626,131785,234433,396],"plugin_category":[54],"plugin_contributors":[258595],"plugin_business_model":[],"class_list":["post-289650","plugin","type-plugin","status-publish","hentry","plugin_tags-cookie-banner","plugin_tags-cookie-consent","plugin_tags-gdpr","plugin_tags-google-consent-mode","plugin_tags-privacy","plugin_category-security-and-spam-protection","plugin_contributors-tapiokansleri","plugin_committers-tapiokansleri"],"banners":{"banner":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/banner-772x250.png?rev=3487063","banner_2x":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/banner-1544x500.png?rev=3487063","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/icon-128x128.png?rev=3491024","icon_2x":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/icon-256x256.png?rev=3491024","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-1.png?rev=3486721","caption":"Cookie consent banner on the frontend (corner popup style)"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-2.png?rev=3486721","caption":"General settings \u2014 customize banner style, colors, typography, and button texts"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-3.png?rev=3486721","caption":"Cookies tab \u2014 scan your site, auto-detect cookies, and use AI to generate descriptions"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-4.png?rev=3486721","caption":"Policy Page tab \u2014 select your policy page and generate a complete privacy policy with one AI prompt"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-5.png?rev=3486721","caption":"Integration tab \u2014 Google Consent Mode v2 and Site Kit \/ WP Consent API status"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-6.png?rev=3486721","caption":"Script Blocking tab \u2014 auto-detected third-party scripts blocked before consent"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-7.png?rev=3486721","caption":"Statistics tab \u2014 consent response summary with accept, reject, and custom breakdown"},{"src":"https:\/\/ps.w.org\/kansleri-cookie-consent\/assets\/screenshot-8.png?rev=3486721","caption":"Consent Log \u2014 anonymized per-visitor audit trail with CSV export"}],"raw_content":"<!--section=description-->\n<p>Kansleri Cookie Consent is a free, lightweight, and easy-to-use WordPress cookie consent plugin. There are no ads, no pro version, and no upsells. It is perfect for personal websites, small businesses, and hobby sites who want no-hassle cookie consent.<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Three banner styles: bottom bar, centered modal, corner popup<\/li>\n<li>Customizable colors, texts, and button labels<\/li>\n<li>Plugin or Theme typography mode for consistent banner styling (Plugin style is the default)<\/li>\n<li>Four consent categories: Necessary, Analytics, Marketing, Preferences<\/li>\n<li><strong>Script auto-blocking<\/strong> \u2014 prevents third-party scripts from running until consent is given, including WordPress-enqueued scripts and raw HTML scripts from page builders (Bricks, Elementor, custom code injectors)<\/li>\n<li><strong>YouTube &amp; Vimeo iframe blocking<\/strong> \u2014 video embeds are blocked until marketing cookies are accepted, with a user-friendly placeholder (can be turned off)<\/li>\n<li><strong>Block by address<\/strong> \u2014 hold back any other script, such as a widget the plugin does not recognize, by part of its address until the visitor accepts the category you choose, with an optional placeholder where it would show content<\/li>\n<li><strong>Reviews widgets<\/strong> \u2014 the Trustmary reviews widget waits for analytics consent, with a placeholder and accept button in its place<\/li>\n<li>Google Consent Mode v2 integration with automatic default\/update signals, in Basic mode (Google tags wait for consent) or Advanced mode (Google tags load right away with consent denied)<\/li>\n<li>GTM dataLayer push on consent changes<\/li>\n<li>Integration tab recommends Google Site Kit (Google's official WordPress plugin) for installing Google Analytics 4 and Google Tag Manager, so Consent Mode v2 signals work out of the box without manual GTM snippet management<\/li>\n<li>Built-in cookie scanner that auto-identifies common cookies (Google Analytics, Meta Pixel, WordPress core, and more) \u2014 including cookies from consent-blocked scripts via service inference<\/li>\n<li>AI-assisted cookie descriptions \u2014 copy a prompt, paste into an AI tool, import the result<\/li>\n<li><strong>AI-assisted policy page generation<\/strong> \u2014 generate a complete cookie\/privacy policy page with one prompt<\/li>\n<li>Cookie policy page defaults to the WordPress Privacy Policy page, with a dynamic <code>[kncc_cookie_policy]<\/code> shortcode (theme styling by default; plugin styling optional)<\/li>\n<li>Floating settings button for visitors to update preferences (on by default)<\/li>\n<li><code>[kncc_cookie_settings]<\/code> shortcode \u2014 add a cookie settings link anywhere (footer, menu, etc.) with customizable text<\/li>\n<li>\"Edit cookie preferences\" button on the policy page for easy consent withdrawal<\/li>\n<li><strong>Per-user consent logging<\/strong> \u2014 anonymized audit trail for GDPR compliance with CSV export<\/li>\n<li>Consent statistics dashboard (no personal data stored)<\/li>\n<li><strong>Graceful multilingual policy page fallback<\/strong> \u2014 if a language is missing a translated policy page, the banner links to the default-language page instead of a 404<\/li>\n<li>Google Site Kit integration \u2014 auto-detects and avoids duplicate consent signals<\/li>\n<li>WP Consent API integration \u2014 shares consent status with other plugins<\/li>\n<li><strong>Full WPML and Polylang support<\/strong> \u2014 per-language banner texts, cookie descriptions, banner style, colors, and policy page<\/li>\n<li>Finnish translation included with auto-localized defaults<\/li>\n<li>Daily cron check for missing cookie descriptions with admin notifications<\/li>\n<li>Comprehensive documentations tab with installation guide, option explanations, and troubleshooting<\/li>\n<li>Clean uninstall \u2014 removes all data when deleted<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>kansleri-cookie-consent<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install directly through the WordPress plugin screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>Settings &gt; Cookie Consent<\/strong> to configure the banner.<\/li>\n<li>Use the <strong>Cookies<\/strong> tab to scan your site and register cookies.<\/li>\n<li>The Cookie Policy page defaults to your WordPress Privacy Policy page \u2014 add the <code>[kncc_cookie_policy]<\/code> shortcode to that page (or another page you select).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20support%20google%20consent%20mode%20v2%3F\"><h3>Does this plugin support Google Consent Mode v2?<\/h3><\/dt>\n<dd><p>Yes. When enabled under the Integration tab, the plugin outputs consent defaults in <code>&lt;head&gt;<\/code> before any other scripts, and sends <code>consent update<\/code> signals whenever a visitor changes their preferences. If Google Site Kit is active, the plugin works alongside Site Kit's own consent defaults.<\/p>\n\n<p>By default the plugin uses Basic Consent Mode: the Google tag and Google Tag Manager are blocked until the visitor accepts. Turn on Advanced Consent Mode on the Integration tab to load them right away with consent denied. They then set no cookies until the visitor accepts and send Google only cookieless pings, which Google Analytics and Google Ads use to model the missing data. Other tracking scripts stay blocked until consent in both modes.<\/p><\/dd>\n<dt id=\"how%20does%20the%20cookie%20scanner%20work%3F\"><h3>How does the cookie scanner work?<\/h3><\/dt>\n<dd><p>The scanner loads your homepage in a hidden iframe, reads cookies from the browser, and also infers expected cookies from tracking scripts detected on your site (Google Analytics, Meta Pixel, HubSpot, etc.) \u2014 even when those scripts are blocked until consent. Known cookies are added automatically; unknown cookies are presented for categorization with an AI-assisted workflow. Expected cookies are also synced when you open the Cookies tab and during the daily cron check.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%20or%20polylang%3F\"><h3>Does it work with WPML or Polylang?<\/h3><\/dt>\n<dd><p>Yes. When WPML or Polylang is active, you can set per-language banner texts, cookie descriptions, banner style, colors, and policy page. Two workflows are supported for banner texts:<\/p>\n\n<ol>\n<li>Switch to a secondary language in the admin bar, edit the General tab, and save \u2014 texts are stored per language (<code>kncc_texts_{lang}<\/code>) and take priority.<\/li>\n<li>With WPML String Translation, translate the <code>[kncc_settings]*<\/code> admin text strings. Those translations are used when no per-language override is saved for that language.<\/li>\n<\/ol>\n\n<p>If neither is set, the plugin falls back to that language's own plugin defaults (English if the language is not yet translated). Banner texts are never copied blindly from the default language. Non-text settings (colors, style) still inherit from the default language unless overridden. Cookie names, categories, providers, and durations are shared across all languages.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20google%20site%20kit%3F\"><h3>Does it work with Google Site Kit?<\/h3><\/dt>\n<dd><p>Yes. The plugin detects Site Kit automatically. Site Kit's consent mode sets denied defaults for its own regions (currently the EEA, the UK and Switzerland); this plugin adds a denied default for all other visitors and sends consent updates when visitors make a choice. Consent Mode v2 is forced on when Site Kit is active.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wp%20consent%20api%3F\"><h3>Does it work with WP Consent API?<\/h3><\/dt>\n<dd><p>Yes. When the WP Consent API plugin is active, consent status is automatically shared with other plugins that support the API.<\/p><\/dd>\n<dt id=\"how%20are%20consent%20statistics%20tracked%3F\"><h3>How are consent statistics tracked?<\/h3><\/dt>\n<dd><p>Statistics are tracked server-side via lightweight AJAX calls when visitors make a consent choice. No personal data, IP addresses, or tracking cookies are used. Only daily aggregates (accept\/reject\/custom counts) are stored.<\/p><\/dd>\n<dt id=\"does%20it%20block%20youtube%20and%20vimeo%20embeds%3F\"><h3>Does it block YouTube and Vimeo embeds?<\/h3><\/dt>\n<dd><p>Yes. YouTube and Vimeo iframes are automatically blocked until the visitor accepts marketing cookies. A placeholder is shown in place of the video with an \"Accept marketing cookies\" button. If the visitor has already accepted cookies via the consent banner, videos load normally without any placeholder. You can turn embed blocking off on the Script Blocking tab.<\/p><\/dd>\n<dt id=\"how%20do%20i%20add%20a%20cookie%20settings%20link%20to%20my%20footer%3F\"><h3>How do I add a cookie settings link to my footer?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[kncc_cookie_settings]<\/code> in any widget, page, or template. You can customize the link text with <code>[kncc_cookie_settings text=\"Manage cookies\"]<\/code>. The shortcode is also shown with a copy button in the plugin settings page.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20the%20plugin%20is%20uninstalled%3F\"><h3>What happens when the plugin is uninstalled?<\/h3><\/dt>\n<dd><p>All plugin options (<code>kncc_settings<\/code>, <code>kncc_cookies<\/code>, <code>kncc_consent_stats<\/code>, <code>kncc_incomplete_cookies<\/code>, <code>kncc_show_activation_notice<\/code>, <code>kncc_defaults_localized<\/code>, <code>kncc_cron_error<\/code>, <code>kncc_blocked_scripts<\/code>, <code>kncc_custom_blocked_scripts<\/code>, <code>kncc_blocked_url_patterns<\/code>, migration flags, and per-language <code>kncc_texts_*<\/code> \/ <code>kncc_cookie_descriptions_*<\/code> options), the consent log table, and the daily cron schedule are removed from the database. Your WordPress Privacy Policy page is never deleted.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.8.9<\/h4>\n\n<ul>\n<li>New: Every text visitors see can now be edited. The General tab adds the cookie category names and descriptions, the \"no cookies are used\" notes, the Cookie Policy link text, the floating button label (also the default text of the <code>[kncc_cookie_settings]<\/code> link), the banner's screen reader label, and the messages and buttons on blocked analytics and preferences content. The Policy Page tab adds every text of the <code>[kncc_cookie_policy]<\/code> cookie declaration: category descriptions, table headings, the consent status texts and the edit button<\/li>\n<li>Empty fields keep the built-in text, translated into each language, so nothing changes on your site until you type your own wording. On multilingual sites (Polylang, WPML) each language can have its own wording<\/li>\n<\/ul>\n\n<h4>1.8.8<\/h4>\n\n<ul>\n<li>Fixed: Descriptions and durations of the cookies the plugin adds itself (from Scan Cookies and detected scripts, e.g. <code>_ga<\/code>, <code>kncc_consent<\/code> and <code>wp_consent_*<\/code>) were always in English, even on Finnish sites. The cookie policy page now shows them in the visitor's language, and the Cookies tab in the language you are editing. This also covers cookies already in your list, so there is nothing to re-scan or re-save. Descriptions you have written or edited yourself are shown as written<\/li>\n<li>New: Finnish translations for all built-in cookie descriptions and durations. Other languages can translate them like the rest of the plugin<\/li>\n<li>New: Block by address on the Script Blocking tab. Enter part of a script's address (for example widget.example.com) and the category it needs, and the script waits for that consent wherever it is added, including scripts printed straight into page HTML by a theme or page builder. Turn on Placeholder for scripts that show content, such as a reviews widget, to show a message and an accept button in their place. A rule also overrides the built-in category for the same address; choose \"Necessary (never blocked)\" to let a script load right away<\/li>\n<li>New: The Trustmary reviews widget (widget.trustmary.com and embed.trustmary.com) now waits for analytics consent, because it stores a visitor ID, the landing page and conversions in the browser's localStorage before any choice. A placeholder with an accept button is shown in its place, and the <code>tmary<\/code> item is listed in the cookie policy. <strong>This changes existing sites:<\/strong> the widget no longer shows until the visitor accepts analytics cookies. To keep the old behaviour, add widget.trustmary.com under Block by address as \"Necessary (never blocked)\"<\/li>\n<li>New: When a visitor rejects a category, items with the exact name of that category's registered cookies are also removed from localStorage<\/li>\n<li>Fixed: Accepting through a blocked video's (or widget's) accept button now also runs the other scripts held back for that category right away, not only on the next page load<\/li>\n<li>New: These services are now held back until the visitor accepts their category, where before they ran straight away: Reddit Pixel, Microsoft Advertising (Bing UET), Criteo, Taboola, Klaviyo, Mailchimp pop-ups and Trustpilot (marketing); Fathom, Cloudflare Web Analytics, Yandex Metrica and Segment (analytics); and the Intercom, Crisp and Calendly widgets (preferences, since the visitor has not asked for them yet). Scan Cookies now recognizes their cookies too. <strong>This changes existing sites:<\/strong> a chat or booking widget no longer shows until the visitor accepts preference cookies. To keep one working for everyone, add its address (for example widget.intercom.io) under Block by address as \"Necessary (never blocked)\"<\/li>\n<li>Fixed: With Autoptimize's \"Also aggregate inline JS\" on, Google Tag Manager, Meta, TikTok, Pinterest, X, Snapchat, LinkedIn, Clarity, Hotjar and Matomo code ran before consent, because Autoptimize merged it into a file on your own domain before this plugin saw the page. The plugin now keeps the scripts it holds back out of Autoptimize's merged file<\/li>\n<li>Fixed: A block of code that mixes several services, such as one an optimizer has put together, is now held for the strictest of their categories instead of the first one found. Marketing code in a mixed block no longer runs on analytics consent alone<\/li>\n<li>Fixed: The banner's buttons and spacing no longer shrink on themes that set a small root font size, such as OceanWP, where the buttons were 32px high and the \u00d7 could overlap a button<\/li>\n<li>Fixed: WooCommerce Order Attribution set its marketing cookies (<code>sbjs_*<\/code>) on every page before any choice. Its scripts now wait for marketing consent. <strong>Orders placed by visitors who have not accepted marketing cookies no longer record where the visitor came from.<\/strong> The <code>wp_woocommerce_session_*<\/code> cookie is now recognized as a WooCommerce cookie<\/li>\n<li>Fixed: A category's switch in the banner stayed switched off until Scan Cookies had registered a cookie for it, even while scripts were being held back for that category, so a visitor choosing \"Customize\" could not allow them. The switch is now offered as soon as a script has been held back for the category<\/li>\n<li>Fixed: A script whose address is written without quotes (<code>src=https:\/\/\u2026<\/code>, as some HTML minifiers produce) was not recognized and ran before consent<\/li>\n<li>Fixed: With LiteSpeed Cache set to delay all JavaScript until the first interaction, the plugin's own scripts were delayed too, so a first-time visitor saw no banner until they scrolled or clicked. LiteSpeed is now told to leave them alone<\/li>\n<\/ul>\n\n<h4>1.8.7<\/h4>\n\n<ul>\n<li>Fixed: YouTube and Vimeo videos added with Elementor's Video widget are now blocked until marketing consent, including the image overlay and lightbox options. Elementor builds its YouTube player in the browser, so it used to load before consent. After consent the video appears without a page reload. Turning off embed blocking on the Script Blocking tab leaves these widgets to Elementor too<\/li>\n<\/ul>\n\n<h4>1.8.6<\/h4>\n\n<ul>\n<li>Fixed: With Elementor and the Hello Elementor theme, the floating cookie settings button had shrunk to a narrow strip since 1.8.4; it is a centered round button again<\/li>\n<li>Fixed: Banner buttons, the \u00d7 button and the blocked-video accept button now keep the colors from the plugin settings instead of taking Elementor's global button colors and Hello Elementor's borders and hover colors<\/li>\n<li>Note: If you recolored buttons with custom CSS, use <code>#kncc-floating-btn<\/code> for the floating button and prefix banner button rules with <code>.kncc-banner<\/code> (e.g. <code>.kncc-banner .kncc-btn--primary<\/code>), or add <code>!important<\/code><\/li>\n<\/ul>\n\n<h4>1.8.5<\/h4>\n\n<ul>\n<li>New: Advanced Consent Mode option on the Integration tab (off by default). When on, the Google tag and Google Tag Manager load right away with all consent signals denied, instead of being blocked until the visitor accepts. They set no cookies until the visitor accepts and send only cookieless pings until then, so Google Analytics and Google Ads receive the consent state of every visitor. Other tracking scripts stay blocked until consent. <strong>If Google Analytics or Google Ads shows your consent signals as not active, turn this on.<\/strong><\/li>\n<li>New: YouTube and Vimeo embed blocking can be turned off on the Script Blocking tab (on by default)<\/li>\n<li>Fixed: With WP Rocket's Delay JavaScript on, tracking scripts that WP Rocket had already delayed (current versions mark them <code>text\/rocketlazyloadscript<\/code>), such as the Google Tag Manager snippet added by Site Kit, were not blocked and ran on the visitor's first interaction, before consent. They now wait for consent, and delayed external scripts keep their URL so they load once the visitor accepts<\/li>\n<li>Fixed: With Google Site Kit's consent mode on, a returning visitor's saved choice was sent to Google before Site Kit's consent default. Google expects the default first, so the update now follows it<\/li>\n<li>Changed: With Google Site Kit's consent mode on, the plugin also sets a denied consent default for visitors outside Site Kit's regions, so Google tags wait for their choice too<\/li>\n<\/ul>\n\n<h4>1.8.4<\/h4>\n\n<ul>\n<li>Fixed: The floating cookie settings button no longer shrinks to a tiny icon on themes that add padding to buttons (e.g. Flatsome and Storefront), and the banner's \u00d7 button keeps its size on Flatsome<\/li>\n<li>Fixed: In the bottom bar banner, the \u00d7 button no longer covers the Customize button at common laptop and tablet widths<\/li>\n<li>Fixed: Script blocking no longer breaks the LinkedIn Insight Tag and TikTok pixel (their loader code was being altered, so they never loaded after consent), and tracking scripts with any JavaScript type, such as <code>type=\"application\/javascript\"<\/code>, are now blocked instead of running before consent<\/li>\n<li>Fixed: A Google Tag Manager snippet pasted in the same script block as a consent default is now blocked until consent<\/li>\n<li>Fixed: With Google Site Kit active, Consent Mode v2 defaults are printed again; the plugin assumed Site Kit was handling them even when Site Kit's own consent mode was off. Consent Mode is now on whenever Site Kit is active, as the Integration tab already stated<\/li>\n<li>Fixed: Consent updates now reach Google tags even when no other script has defined <code>gtag()<\/code> yet<\/li>\n<li>Fixed: Scripts re-enabled after consent keep their attributes, so Plausible (<code>data-domain<\/code>) and Fathom (<code>data-site<\/code>) track again; module scripts run as modules<\/li>\n<li>Fixed: Accepting marketing cookies on a blocked video after \"Reject all\" now also updates the WP Consent API and the policy page consent status<\/li>\n<li>Fixed: WP Rocket's Delay JavaScript no longer delays the plugin's own consent scripts<\/li>\n<li>Fixed: Multilingual sites \u2014 Consent Mode is one site-wide setting on every language, and saving the Policy Page tab on a secondary language no longer removes that language's policy link<\/li>\n<li>Fixed: A visitor who changes their choice within a minute is now recorded in the consent log and statistics<\/li>\n<li>Fixed: Consent log times were shown shifted by the site's time zone offset<\/li>\n<li>Fixed: Banner texts are saved in the site's language on activation, even when the activating admin uses another profile language<\/li>\n<li>Fixed: The blocked-video placeholder text no longer appears in automatic excerpts and RSS feeds<\/li>\n<li>Fixed: Google Analytics cookies are no longer declared on sites that use Site Kit without Google Analytics<\/li>\n<li>Fixed: Scanned HubSpot cookies <code>__hstc<\/code>, <code>__hssc<\/code> and <code>__hssrc<\/code> now get their own category and duration<\/li>\n<li>Fixed: Uninstalling on multisite now removes the plugin's data from every site<\/li>\n<li>Security: Cookie names are escaped correctly in the Scan Cookies results<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Fixed: Saving the General tab silently switched off Google Consent Mode v2, and saving the Integration or Policy Page tab silently switched off the floating settings button. <strong>Please open the Integration tab and confirm Consent Mode v2 is still enabled after updating.<\/strong><\/li>\n<li>Fixed: Blocked YouTube and Vimeo embeds are now blocked identically for every visitor, so a page cache can no longer serve an unblocked embed to someone who never consented. Visitors who already consented still get their videos back automatically.<\/li>\n<li>New: Embeds added through page builders (Bricks, Elementor, custom code) are now blocked too, not only those in post content<\/li>\n<li>Fixed: The consent log table could never be upgraded because <code>CREATE TABLE IF NOT EXISTS<\/code> confused WordPress's schema updater<\/li>\n<li>Security: The public consent-recording endpoint now validates the submitted categories, throttles repeat submissions, and no longer stores raw client input<\/li>\n<li>Security: Consent log CSV export escapes quotes and neutralizes spreadsheet formula characters<\/li>\n<li>Security: Visitor identifiers in the consent log are now keyed with the site salt, so they cannot be brute-forced back to an IP address<\/li>\n<li>Fixed: Consent statistics stopped recording on cached sites once the embedded nonce aged out<\/li>\n<li>Fixed: The Copy button next to the <code>[kncc_cookie_settings]<\/code> shortcode did nothing; the Copy CSS template button no longer mangles the template in a single-line prompt<\/li>\n<li>Improved: Banner keyboard accessibility \u2014 focus moves into the banner when it is reopened, returns to the control that opened it, Escape closes it, and Tab stays inside the centered modal<\/li>\n<li>Improved: <code>aria-modal<\/code> is now only applied to the centered modal style, which is the only style that blocks the page<\/li>\n<li>Fixed: Running Scan Cookies no longer leaves the administrator's own browser with accept-all consent<\/li>\n<li>Fixed: Scanning could fail with a PHP 8 error on unexpected input<\/li>\n<li>Improved: Faster translation loading via a bundled <code>.l10n.php<\/code> file<\/li>\n<li>Tested up to WordPress 7.1<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Fixed: WPML String Translation of banner texts (<code>[kncc_settings]*<\/code>) works again on secondary languages after the 1.8.0 per-language defaults change \u2014 overrides in <code>kncc_texts_{lang}<\/code> still take priority, then WPML ST, then language plugin defaults<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Changed: Default banner style is now Corner popup instead of Bottom bar (existing sites keep their saved style)<\/li>\n<li>New: WordPress Playground Live Preview blueprint (<code>assets\/blueprints\/blueprint.json<\/code>) for the official plugin directory preview button<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Improved: Accept \/ Reject \/ Save preferences activate blocked scripts and iframes immediately \u2014 no page reload required<\/li>\n<li>Fixed: After Reject all, Accept all can re-activate the same blocked scripts without refreshing the page<\/li>\n<li>Fixed: Cookie scanner needed two manual runs to find WP Consent API bridge cookies (<code>wp_consent_*<\/code>) and other consent-gated trackers \u2014 one Scan click now seeds consent, reloads once, then collects<\/li>\n<li>Changed: Plugin no longer auto-creates a Cookie Policy page \u2014 the Cookie policy page dropdown defaults to the WordPress Privacy Policy page (Settings \u2192 Privacy)<\/li>\n<li>Fixed: Polylang\/WPML secondary languages no longer inherit banner texts from the default language \u2014 each language uses its own plugin defaults, with English as fallback when a language is unsupported<\/li>\n<li>Fixed: Modal close (\u00d7) no longer pushes banner content to the left on mobile \u2014 only the heading reserves space for the icon<\/li>\n<li>Improved: Blocked iframe message \/ accept button fields use per-language defaults (same as other banner texts)<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fixed: <code>wp_consent_statistics<\/code> could stay <code>deny<\/code> after Accept All \u2014 WP Consent API cookies now sync server-side from <code>kncc_consent<\/code> on every request, with an early <code>wp_head<\/code> fallback and hardened client-side sync (including <code>statistics-anonymous<\/code>)<\/li>\n<li>Fixed: <code>wp_consent_statistics<\/code> deny persisting due to a URL-encoded <code>kncc_consent<\/code> cookie \u2014 the server now URL-decodes the cookie before syncing, and the consent choice (accept\/reject\/custom) is stored so a missing category key can no longer leave statistics stuck on deny<\/li>\n<li>Fixed: WP Consent API client sync now writes cookies even when the WP Consent API script is delayed, dispatches a consent-change event for Google Site Kit, and clears stale statistics cookies on parent domains<\/li>\n<li>Improved: Cookie policy page notes the technical WP Consent API cookie names (wp_consent_functional, wp_consent_statistics, etc.) so the mapping from banner labels is clear<\/li>\n<li>Fixed: Scanner no longer flags <code>wp_consent_statistics-anonymous<\/code> as unknown \u2014 it is now auto-recognized and described as a consent-record cookie<\/li>\n<li>Fixed: Copy AI Prompt now includes every cookie the plugin knows about \u2014 the scan returns the full saved cookie list, which is unioned with the scan results and the current table rows (your live edits take priority) so no cookies are dropped due to scan\/save\/reload timing<\/li>\n<li>Fixed: Copy AI Prompt on the Cookies and Policy Page tabs no longer uses a browser prompt dialog \u2014 the full prompt is shown in a selectable textarea below the button, with reliable clipboard copy on both http and https (fixes truncated\/garbled JSON on local sites)<\/li>\n<li>Improved: AI cookie prompt now asks the AI to verify and correct each cookie's category (not just the description), with clear category definitions so tracking cookies are not mislabeled as Necessary<\/li>\n<li>Changed: Default banner typography is now Plugin style (strict sizes\/colors) instead of Theme style \u2014 the select field remains so you can switch back<\/li>\n<li>Unchanged: Cookie policy page still defaults to Theme style so it matches your site typography; only the consent banner\/popup uses Plugin style by default<\/li>\n<li>Improved: WP Consent API bridge cookies (<code>wp_consent_functional<\/code>, <code>wp_consent_statistics<\/code>, <code>wp_consent_marketing<\/code>, <code>wp_consent_preferences<\/code>, <code>wp_consent_statistics-anonymous<\/code>) are now categorized as Necessary \u2014 they only store consent choices, they do not perform tracking<\/li>\n<li>Improved: Jetpack stats cookies (<code>tk_ai<\/code>, <code>tk_qs<\/code>) are auto-categorized as Analytics; WooCommerce Order Attribution \/ Sourcebuster cookies (<code>sbjs_*<\/code>) are auto-categorized as Marketing<\/li>\n<li>Improved: Admin JS\/CSS assets use file modification time for cache busting so updated scripts load immediately after plugin updates<\/li>\n<li>Fixed: Custom save with hidden empty categories now explicitly denies missing optional categories so stale consent keys cannot linger<\/li>\n<li>Fixed: Floating cookie settings button no longer hardcodes white for the icon \u2014 background and icon colors now follow the Primary button and Primary button text settings<\/li>\n<li>New: Cookie scanner detects cookies whose tracking provider is no longer on the homepage (e.g. after removing Google Analytics) and lists them under \"Possibly removed\"<\/li>\n<li>New: Admin can review and confirm removal of stale cookies from the scan results \u2014 nothing is deleted automatically<\/li>\n<li>New: Cookie policy page shows your current consent status (allowed, denied, or not chosen) above the \"Edit cookie preferences\" button<\/li>\n<li>Changed: Frontend banner close control is now a \u00d7 icon in the top-right corner, matching the admin banner preview \u2014 the text \"Close\" link in the button row is removed<\/li>\n<li>Changed: \"Close button text\" setting renamed to \"Close button label\" \u2014 it sets the screen reader label only; the visible button is always \u00d7<\/li>\n<li>Improved: Banner preview and live frontend now share the same close-button styling via consent.css<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fixed: Google Analytics cookies (<code>_ga<\/code>, <code>_ga_*<\/code>, <code>_gid<\/code>) could remain visible after rejecting analytics or withdrawing consent \u2014 stale cookies are now cleared on page load when analytics is denied, on Reject all, and when analytics is turned off in custom preferences<\/li>\n<li>Fixed: Non-essential cookies for rejected categories (analytics, marketing, preferences) are now removed using registered cookie categories and built-in scanner patterns \u2014 not just Google Analytics<\/li>\n<li>Fixed: Google Site Kit Google Tag Gateway scripts (<code>google_gtagjs-*<\/code> handles and <code>gtg\/measurement.php<\/code>) were not blocked before consent<\/li>\n<li>Fixed: WP Rocket Delay JavaScript could rewrite blocked scripts to <code>rocketlazyloadscript<\/code>, bypassing consent blocking \u2014 HTML script blocking now normalizes those tags back to <code>text\/plain<\/code><\/li>\n<li>New: WP Rocket compatibility \u2014 registers <code>kncc_consent<\/code> as a dynamic cache cookie and excludes consent\/GA scripts from Delay JS<\/li>\n<li>Improved: Accept all now reloads the page after saving consent so blocked scripts and tracker cookies load reliably on the next request (same pattern as Reject all)<\/li>\n<li>Improved: Custom save always reloads the page after saving preferences so blocked scripts and category cookies apply correctly (same pattern as Accept all and Reject all)<\/li>\n<li>Improved: WP Consent API bridge cookies (<code>wp_consent_functional<\/code>, <code>wp_consent_statistics<\/code>, <code>wp_consent_marketing<\/code>, <code>wp_consent_preferences<\/code>) are now auto-described in the Cookies tab when scanned or inferred<\/li>\n<li>Improved: Known cookies that were previously saved without descriptions are backfilled automatically when the Cookies tab loads or during scan\/cron sync<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Fixed: Google Analytics and other consent-blocked tracker cookies not appearing during cookie scan<\/li>\n<li>New: Service-based cookie inference \u2014 expected cookies are registered automatically when tracking scripts are detected on your site, even before consent is granted<\/li>\n<li>New: Cookie inference runs on Scan Cookies, when opening the Cookies tab, and during the daily cron check<\/li>\n<li>New: Custom Code blocking for page builders and header\/footer injectors (Bricks, Elementor, etc.) \u2014 toggle on Script Blocking tab, enabled by default<\/li>\n<li>New: Microsoft Clarity auto-blocking and cookie inference<\/li>\n<li>Fixed: GA4\/gtag snippets pasted into Custom Code fields running before consent<\/li>\n<li>Improved: Browser scan waits up to 8 seconds and grants temporary scan consent so runtime cookies can be discovered<\/li>\n<li>Improved: Scan results now show inferred cookies and filtered browser-only cookies separately<\/li>\n<li>Improved: Script Blocking tab copy simplified for non-technical users, with guidance on when to turn off Custom Code blocking<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed: WordPress 6.7+ \"Translation loading for the kansleri-cookie-consent domain was triggered too early\" notice. Two early triggers were calling <code>__()<\/code> before the <code>init<\/code> action: the Consent Mode class was reading settings (and therefore the translated defaults) in its constructor on <code>plugins_loaded<\/code>, and the one-time default-text localization migration ran on <code>plugins_loaded:20<\/code>. The Consent Mode setting check now happens inside the <code>wp_head<\/code> callback, and the migration is hooked on <code>init:5<\/code>.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>New: \"Close\" button text is now a customizable setting in the General tab \u2014 previously it was a hardcoded translation string, which made it impossible to override per language on sites using Polylang or WPML. Add or edit it like any other banner button label, with per-language overrides via the admin-bar language filter. Reported by a multilingual user running Catalan \/ Spanish \/ English.<\/li>\n<li>Tested with WordPress 7.0.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>New: Empty cookie categories \u2014 when a category (e.g. Marketing) has no registered cookies, the banner can now either hide that category from the customize panel or show it with a locked (disabled) switch. Default is \"Show but lock\" so visitors still see what categories exist while being clearly told nothing is collected. Switch in <strong>Settings \u2192 Cookie Consent \u2192 General \u2192 Empty cookie categories<\/strong>, with live preview.<\/li>\n<li>New: Per-category empty note \u2014 locked empty categories display a small italic note such as \"No marketing cookies are used on this site.\" (translatable per category, so Finnish and other inflected languages get proper wording).<\/li>\n<li>Fixed: WP Consent API integration was non-functional and could break analytics when Google Site Kit Consent Mode was active. The bridge that syncs <code>kncc_consent<\/code> to WP Consent API now loads after the WP Consent API script, so <code>wp_set_consent<\/code> actually runs and dispatches the <code>wp_listen_for_consent_change<\/code> event that consent-aware integrations (Site Kit, Complianz, others) listen for.<\/li>\n<li>Fixed: The plugin now declares itself as an opt-in consent manager via the <code>wp_get_consent_type<\/code> filter. Without this, <code>window.wp_fallback_consent_type<\/code> was empty and Site Kit's Consent Mode JS short-circuited \u2014 leaving <code>analytics_storage<\/code> stuck at <code>denied<\/code> even after visitors accepted analytics cookies. Other consent-aware plugins now also receive correct <code>wp_has_consent()<\/code> results instead of an always-true response. The filter yields to any other plugin that already set the consent type.<\/li>\n<li>Fixed: WP Consent API registration filter used the wrong handle (slug only instead of the full plugin basename), so the plugin appeared as \"not registered\" in Site Health &gt; WP Consent API. Now uses the correct basename.<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>New: Documentations tab now ships a Custom CSS template \u2014 every selector the plugin uses, presented as one copy-paste-ready CSS block with a one-click \"Copy CSS template\" button. Uncomment the rules you want to customize, paste into Customizer or your child theme, save.<\/li>\n<li>Improved: Category toggles redesigned with an outlined \"off\" state that tracks the body text color, and an \"on\" knob that tracks the primary text color \u2014 so the on\/off states stay visible at any color combination, including pure-white primary buttons.<\/li>\n<li>Improved: \"Customize\" and \"Close\" link buttons in the banner now have a clear hover state \u2014 subtle background tint with rounded corners and a thicker underline, so the click target is obvious instead of relying only on a small color shift.<\/li>\n<li>Improved: \"Close\" button now uses the body text color so it reads as a quiet dismissal action rather than competing for attention with \"Customize\" and the primary buttons.<\/li>\n<li>Improved: Banner preview's close (\u00d7) icon follows the body text color picker, so it stays visually integrated as the admin tunes the palette.<\/li>\n<li>Removed: \"Border \/ divider\" color picker and the matching divider line in the details panel \u2014 one less rarely-changed setting in the General tab, and a cleaner banner layout.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>New: Integration tab now recommends Google Site Kit (Google's official WordPress plugin) for adding Google Analytics 4 or Google Tag Manager \u2014 Site Kit handles Consent Mode v2 natively alongside Kansleri, so no manual GTM snippet, script blocking tweaks, or container ID management is needed. A one-click link takes you straight to the Site Kit install page.<\/li>\n<li>New: Cookie scanner filters out \"browser-only\" third-party cookies \u2014 when the scanner sees a tracker cookie (GA, Meta Pixel, HubSpot, LinkedIn, Hotjar, Plausible) but the matching script is not actually in the homepage HTML, the cookie is silently dropped. Fixes false positives on subdomain installs where parent-domain cookies (like <code>_ga<\/code>) bleed into the admin's browser even though this site has no tracker.<\/li>\n<li>New: Live banner preview reworked from a fullscreen lightbox into an in-place floating popup \u2014 the \"Open banner preview\" button sits at the top of the General tab, and clicking it shows the banner in its real position (bar at bottom, modal centered, corner at corner). Colors, text, banner style, and typography updates appear in the preview in real time while the form stays editable behind it.<\/li>\n<li>Improved: Banner preview \"Centered modal\" variant now positions itself in the actual screen center.<\/li>\n<li>Improved: Banner preview Customize button toggles the categories panel like the real frontend banner; the panel starts collapsed.<\/li>\n<li>Improved: Banner preview Necessary-category toggle no longer shows a stray native checkbox alongside the custom toggle UI.<\/li>\n<li>Improved: Banner preview is automatically disabled when Theme style is selected, with a clear notice that Theme style depends on the frontend theme's CSS which doesn't load inside \/wp-admin\/.<\/li>\n<li>Improved: Color picker grid in the General tab \u2014 each color swatch now shows its purpose label (Banner background, Primary button, etc.) above it.<\/li>\n<li>Improved: Blocked YouTube iframe placeholder \u2014 switched from <code>hqdefault.jpg<\/code> (4:3 with baked-in black letterbox bars) to <code>mqdefault.jpg<\/code> (native 16:9), and added defensive resets so theme styles like <code>.entry-content img { margin: 2em 0; border-radius: 4px; }<\/code> no longer leak into the thumbnail and create gaps or rounded edges. A subtle radial gradient keeps the message text and Accept button readable against any thumbnail.<\/li>\n<li>Improved: Iframe placeholder mobile layout \u2014 tighter padding under 600px and <code>box-sizing: border-box<\/code> on the overlay so the message text no longer overflows the right edge on narrow screens.<\/li>\n<li>Improved: Integration tab copy rewritten for non-technical users \u2014 fewer technical terms, clearer recommendations.<\/li>\n<li>Improved: Removed the now-discouraged <code>load_plugin_textdomain()<\/code> call \u2014 translations on translate.wordpress.org are loaded automatically by WordPress core.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: Empty banner text fields fall back to the visitor's locale default at render time \u2014 each language gets its own locale-appropriate defaults (English by default, Finnish only on the Finnish version). Cleared fields stay empty in the database, so the admin can leave a field empty to \"use the default\" without the form filling itself back in on save.<\/li>\n<li>New: Default values shown as placeholders in the admin form so it's obvious what visitors would see if a field is left empty<\/li>\n<li>New: Graceful fallback to default-language policy page when a language is missing its own translation (both Polylang and WPML)<\/li>\n<li>New: Dead policy-page links are no longer rendered \u2014 if the selected page is deleted, trashed, or unpublished, the banner omits the link instead of pointing to a 404<\/li>\n<li>Improved: Admin language notice is clearer \u2014 a warning when editing a secondary language (saves target that language only), and an info notice when editing the default language so the active save target is never ambiguous<\/li>\n<li>Improved: Polylang's \"Show all languages\" admin-bar filter is now treated as the default language, including under Polylang's WPML compatibility mode \u2014 no more misleading \"language: ALL\" warnings<\/li>\n<li>Improved: WPML policy-page resolution now uses the same default-language fallback logic as Polylang, with explicit publish-status checks for every resolved translation<\/li>\n<li>Removed: Admin warning about missing policy-page translations (no longer needed, replaced by the graceful fallback)<\/li>\n<li>Updated: Finnish translations for all new and changed admin strings<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>New: Policy page style setting \u2014 choose theme or plugin styling for the [kncc_cookie_policy] cookie declaration table<\/li>\n<li>Improved: Cookie policy table is now mobile-responsive \u2014 stacks into card layout on small screens<\/li>\n<li>Improved: Policy page theme mode adapts to dark and light backgrounds<\/li>\n<li>Improved: \"Edit cookie preferences\" button moved to top of policy page<\/li>\n<li>Fixed: Daily cron check not re-scheduling after plugin updates<\/li>\n<li>Updated: Finnish translations<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed: Direct file access protection added to uninstall.php<\/li>\n<li>Updated: Finnish translations for documentation tab strings<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: Full WPML and Polylang multilingual support \u2014 per-language banner texts, cookie descriptions, banner style, colors, and policy page<\/li>\n<li>New: Per-language cookie descriptions \u2014 cookie structure is shared, only descriptions are translatable<\/li>\n<li>New: AI prompts auto-generate in the current admin language<\/li>\n<li>Improved: Reliable language detection during AJAX saves for Polylang compatibility<\/li>\n<li>Improved: Iframe placeholder sizing \u2014 proper min-height and no overflow on mobile<\/li>\n<li>Improved: Documentation tab with multilingual guide, shortcode reference, and iframe blocking docs<\/li>\n<li>Fixed: Cookie deletion not persisting when saving from a secondary language<\/li>\n<li>Fixed: Scanner result strings showing mixed languages<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: YouTube and Vimeo iframe blocking \u2014 video embeds are blocked until marketing cookies are accepted<\/li>\n<li>New: <code>[kncc_cookie_settings]<\/code> shortcode to add a cookie settings link anywhere (footer, menu, widgets)<\/li>\n<li>New: Shortcode info box with copy button in admin settings<\/li>\n<li>Improved: Page reload on \"Reject all\" to ensure blocked content is properly hidden<\/li>\n<li>Improved: Server-side consent cookie check to avoid unnecessary placeholders for returning visitors<\/li>\n<li>Updated: Finnish translations for all new strings<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Free, no-ads, no-pro-version GDPR cookie consent with script blocking, consent logging, Google Consent Mode v2, and AI-assisted setup.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/289650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=289650"}],"author":[{"embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tapiokansleri"}],"wp:attachment":[{"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=289650"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=289650"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=289650"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=289650"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=289650"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/id.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=289650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}