{"id":318207,"date":"2026-05-29T16:02:05","date_gmt":"2026-05-29T16:02:05","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/cookr-cookie-consent-script-blocking\/"},"modified":"2026-06-16T10:15:05","modified_gmt":"2026-06-16T10:15:05","slug":"cookr-cookie-consent-script-blocking","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/cookr-cookie-consent-script-blocking\/","author":23505849,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.9.12","stable_tag":"1.9.12","tested":"6.8.5","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"COOKR \u2013 Cookie Consent & Script Blocking","header_author":"RipTight Marketing & Advertising","header_description":"Lightweight GDPR\/TTDSG-compliant cookie consent and script blocking for WordPress. Real pre-consent blocking, ethical UX, zero bloat.","assets_banners_color":"010509","last_updated":"2026-06-16 10:15:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/cookr.riptight.com","header_author_uri":"https:\/\/riptight.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":256,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","changelog"],"tags":{"1.9.10":{"tag":"1.9.10","author":"danjed","date":"2026-06-13 10:50:12"},"1.9.11":{"tag":"1.9.11","author":"danjed","date":"2026-06-14 08:05:08"},"1.9.12":{"tag":"1.9.12","author":"danjed","date":"2026-06-16 10:15:05"},"1.9.8":{"tag":"1.9.8","author":"danjed","date":"2026-05-29 16:07:21"},"1.9.9":{"tag":"1.9.9","author":"danjed","date":"2026-05-31 06:30:08"}},"upgrade_notice":{"1.9.8":"<p>Patch release. Fixes LiteSpeed Cache JS Combine compatibility issue that could prevent the consent banner from rendering. Adds automatic optimizer exclusions for LiteSpeed, WP Rocket, Autoptimize, and FlyingPress.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3554198,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3554198,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3554078,"resolution":"1544x500","location":"assets","locale":"","width":2081,"height":756},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3554078,"resolution":"772x250","location":"assets","locale":"","width":2203,"height":714}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.9.10","1.9.11","1.9.12","1.9.8","1.9.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3554110,"resolution":"1","location":"assets","locale":"","width":1200,"height":601},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3554110,"resolution":"2","location":"assets","locale":"","width":1200,"height":693},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3554110,"resolution":"3","location":"assets","locale":"","width":1200,"height":710},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3554110,"resolution":"4","location":"assets","locale":"","width":1200,"height":669},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3554110,"resolution":"5","location":"assets","locale":"","width":525,"height":828},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3554110,"resolution":"6","location":"assets","locale":"","width":525,"height":683},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3554110,"resolution":"7","location":"assets","locale":"","width":525,"height":853}},"screenshots":[]},"plugin_section":[],"plugin_tags":[20011,20272,131785,234433,396],"plugin_category":[54],"plugin_contributors":[264974],"plugin_business_model":[],"class_list":["post-318207","plugin","type-plugin","status-publish","hentry","plugin_tags-consent","plugin_tags-cookie-banner","plugin_tags-gdpr","plugin_tags-google-consent-mode","plugin_tags-privacy","plugin_category-security-and-spam-protection","plugin_contributors-danjed","plugin_committers-danjed"],"banners":{"banner":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/banner-772x250.png?rev=3554078","banner_2x":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/banner-1544x500.png?rev=3554078","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/icon-128x128.png?rev=3554198","icon_2x":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/icon-256x256.png?rev=3554198","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-1.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-2.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-3.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-4.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-5.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-6.png?rev=3554110","caption":""},{"src":"https:\/\/ps.w.org\/cookr-cookie-consent-script-blocking\/assets\/screenshot-7.png?rev=3554110","caption":""}],"raw_content":"<!--section=description-->\n<p>GDPR cookie consent with real script blocking.<\/p>\n\n<p>Block Google Analytics, Google Tag Manager, Meta Pixel, Hotjar, YouTube embeds, and other third-party services before they reach the browser.<\/p>\n\n<p>Unlike JavaScript-based consent tools, blocked scripts never reach the browser at all.<\/p>\n\n<p>Most cookie consent plugins display a banner and rely on JavaScript to stop tracking scripts. In many cases, those scripts can begin loading before the visitor has made a choice.<\/p>\n\n<p>COOKR takes a different approach.<\/p>\n\n<p>Scripts are blocked server-side before page delivery. Third-party services cannot execute until consent is explicitly granted. This helps website owners meet GDPR and TTDSG requirements more reliably.<\/p>\n\n<p>Avoids the client-side race conditions common to JavaScript-only consent tools. No script guessing. No \"hope it loads in time.\"<\/p>\n\n<p>Consent enforcement instead of consent theatre.<\/p>\n\n<p>\u2713 Server-side script blocking \u2014 blocked before the browser receives them\n\u2713 Google Consent Mode v2 support\n\u2713 No external consent cloud\n\u2713 No proxy infrastructure\n\u2713 No visitor data sent to third parties\n\u2713 Works entirely on your WordPress installation<\/p>\n\n<p>Built for site owners, agencies, and developers who want real GDPR cookie consent enforcement.<\/p>\n\n<p>COOKR CORE includes:<\/p>\n\n<ul>\n<li>Consent banner &amp; preferences UI<\/li>\n<li>Server-side script interception via PHP output buffer<\/li>\n<li>Auto-Blocker for third-party scripts and iframes<\/li>\n<li>Runtime Inspector<\/li>\n<li>CSP-aware restoration with nonce propagation<\/li>\n<li>Google Consent Mode v2 support<\/li>\n<li>Full JavaScript API (<code>window.cookrConsent<\/code>)<\/li>\n<li>Self-hosted operation \u2014 no external services required<\/li>\n<\/ul>\n\n<p>COOKR RADR additionally includes:<\/p>\n\n<ul>\n<li>Privacy Radar \u2014 runtime detection and classification of third-party services<\/li>\n<li>Enforcement Verification Framework \u2014 structured protocol for proving enforcement claims<\/li>\n<li>Compatibility Matrix \u2014 tested stack database with VERIFIED\/PARTIAL\/UNKNOWN\/FAILED states<\/li>\n<li>Automatic optimizer exclusions \u2014 LiteSpeed, WP Rocket, Autoptimize, FlyingPress<\/li>\n<li>Curated signature database with automatic weekly updates<\/li>\n<\/ul>\n\n<h4>How It Works<\/h4>\n\n<p>COOKR intercepts scripts in the PHP output buffer using <code>WP_HTML_Tag_Processor<\/code> before delivery to the browser. Matching script and iframe tags are neutralised server-side and restored only after the visitor grants consent.<\/p>\n\n<p>There is no client-side race condition because blocking happens before the browser receives the page.<\/p>\n\n<h4>Auto-Blocker<\/h4>\n\n<p>Enable in Settings. Off by default.<\/p>\n\n<p>When enabled, COOKR rewrites matching script tags and iframe tags server-side \u2014 setting <code>type=\"text\/plain\"<\/code> and preserving original attributes in <code>data-cookr-*<\/code> attributes for restoration after consent.<\/p>\n\n<p>Test after enabling when using WP Rocket, LiteSpeed Cache, NitroPack, or Cloudflare Rocket Loader.<\/p>\n\n<h4>Runtime Inspector<\/h4>\n\n<p>The Runtime Inspector exposes third-party runtime activity directly in the browser \u2014 blocked scripts, restored services, iframe activity, detected domains.<\/p>\n\n<p>Enable in Settings. Append <code>?cookr_debug=1<\/code> to any frontend URL while logged in as administrator.<\/p>\n\n<h4>CSP-aware<\/h4>\n\n<p>COOKR supports strict Content Security Policies without requiring <code>unsafe-inline<\/code>.<\/p>\n\n<p>Restored scripts preserve CSP integrity via automatic nonce propagation. COOKR reads the nonce WordPress assigns to enqueued scripts at request time and passes it to restored scripts \u2014 no manual configuration required.<\/p>\n\n<h4>Developer JS API<\/h4>\n\n<pre><code>cookrConsent.has('analytics')\ncookrConsent.require('marketing', callback)\ncookrConsent.whenConsented('analytics').then(fn)\ncookrConsent.on('consent' | 'change' | 'decline' | 'reset', handler)\ncookrConsent.off(event, handler)\ncookrConsent.getConsent()\ncookrConsent.getExpiry()\ncookrConsent.categories()\ncookrConsent.reset()\n<\/code><\/pre>\n\n<h4>Consent Categories<\/h4>\n\n<ul>\n<li><strong>Necessary<\/strong> \u2014 Always active.<\/li>\n<li><strong>Analytics<\/strong> \u2014 GA, GTM, Matomo, Hotjar, Clarity, etc.<\/li>\n<li><strong>Marketing<\/strong> \u2014 Meta Pixel, Google Ads, TikTok, LinkedIn, etc.<\/li>\n<li><strong>External Media<\/strong> \u2014 YouTube, Vimeo, Google Maps, etc.<\/li>\n<\/ul>\n\n<h4>Does COOKR require an external cloud service?<\/h4>\n\n<p>No. COOKR runs entirely on your WordPress installation.<\/p>\n\n<h4>Does visitor consent data leave the server?<\/h4>\n\n<p>No. Consent data is stored locally on your site.<\/p>\n\n<h4>Is the Auto-Blocker enabled by default?<\/h4>\n\n<p>No. Enable and test it after installation, particularly when using caching or JavaScript optimization plugins.<\/p>\n\n<h4>Which services can be blocked?<\/h4>\n\n<p>Any third-party script or iframe matching configured domains. Examples: Google Tag Manager, Meta Pixel, YouTube embeds, TikTok Analytics.<\/p>\n\n<h4>Does COOKR support Google Consent Mode v2?<\/h4>\n\n<p>Yes. Enable in settings when using GTM or GA4.<\/p>\n\n<h4>How do I inspect runtime activity?<\/h4>\n\n<p>Enable the Runtime Inspector in settings and append <code>?cookr_debug=1<\/code> to any frontend URL while logged in as administrator.<\/p>\n\n<h4>Does COOKR store personal data?<\/h4>\n\n<p>The consent log stores a hashed IP (not the raw IP address), consent choices, and a timestamp. The raw IP address is never stored.<\/p>\n\n<h4>Is COOKR compatible with strict CSP?<\/h4>\n\n<p>Yes. COOKR automatically reads the nonce WordPress assigns to enqueued scripts and passes it to restored scripts, preserving compatibility with <code>strict-dynamic<\/code> CSP policies. No manual configuration is required.<\/p>\n\n<h4>Will COOKR work with caching plugins such as LiteSpeed Cache, WP Rocket, or Cloudflare?<\/h4>\n\n<p>Yes, but always test after enabling script optimization features such as JavaScript combine, defer, delay, or Rocket Loader. COOKR performs script blocking server-side, but aggressive optimization plugins may alter script delivery and should be verified on your site.<\/p>\n\n<p>RADR v1.9.8 adds automatic exclusion filters for LiteSpeed Cache, WP Rocket, Autoptimize, and FlyingPress \u2014 COOKR registers itself as excluded from JS combination pipelines automatically.<\/p>\n\n<h4>Does COOKR require HTTPS?<\/h4>\n\n<p>Yes. COOKR requires HTTPS for consent state to persist correctly across page loads. Modern browsers restrict cookie behaviour on HTTP origins \u2014 on HTTP, the consent cookie may not persist, causing the banner to reappear on every page load. HTTPS is also a legal recommendation under GDPR for any site collecting consent.<\/p>\n\n<h4>What WordPress version is required?<\/h4>\n\n<p>WordPress 6.2 or higher. COOKR uses <code>WP_HTML_Tag_Processor<\/code> for safe, attribute-aware script rewriting, introduced in WP 6.2.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin does not connect to any external service by default.<\/p>\n\n<p>The auto-blocker contains a built-in list of known third-party domains (such as googletagmanager.com, connect.facebook.net, maps.googleapis.com, etc.) that is used purely as a local reference to identify and block scripts before consent. No data is sent to these domains by this plugin \u2014 the list is pattern-matching data stored locally in the plugin code.<\/p>\n\n<!--section=changelog-->\n<h4>1.9.15<\/h4>\n\n<ul>\n<li>Fixed CORE packaging: the build script was incorrectly stripping <code>assets\/cookr-debug.js<\/code> (the Debug Inspector script) from CORE builds, despite Debug Inspector being a documented, default-on feature in both CORE and RADR. CORE builds now correctly include this file. No functional change to this codebase itself \u2014 RADR was never affected, since it has always included the file directly from source<\/li>\n<\/ul>\n\n<h4>1.9.14<\/h4>\n\n<ul>\n<li>Fixed banner overflowing the viewport edge on mobile (\u2264480px): <code>#cookr-banner<\/code> had no explicit <code>box-sizing<\/code>, so the mobile layout's <code>width: 100%<\/code> plus the banner's existing border was rendered as <code>100vw + border-width<\/code>, causing the banner to extend ~2px past the right edge of the screen. Added <code>box-sizing: border-box<\/code> to the shared <code>#cookr-banner, #cookr-reopen<\/code> rule so the banner's total rendered width exactly matches the viewport on mobile. No visual change on desktop (320px fixed-width banner)<\/li>\n<\/ul>\n\n<h4>1.9.13<\/h4>\n\n<ul>\n<li>Fixed missing CSS for the disabled \"Sync with active theme\" (Theme Sync) field in the admin dashboard: when Scoped Banner Styling (custom CSS \/ a built-in preset) is active, JavaScript already added a <code>cookr-accent--disabled<\/code> class and an \"Overridden by Scoped Banner Styling\" message to the Theme Sync field \u2014 matching the existing accent-colour picker behaviour \u2014 but <code>admin.css<\/code> only styled this disabled state for the accent field, not the Theme Sync field. The font pills remained fully clickable and visually normal with no indication that font sync was inactive. The disabled-state styling (38% opacity, disabled pointer events, override message) now applies to both fields<\/li>\n<li>No functional change to font sync itself \u2014 fonts synced from the active theme still only apply to the live banner when no custom CSS\/preset is active (custom CSS retains full control of typography by design). This fix makes that existing, correct behaviour visible and understandable in the admin UI<\/li>\n<\/ul>\n\n<h4>1.9.12<\/h4>\n\n<ul>\n<li>Fixed COOKR CRAZE built-in preset: the minimised (reopen) button was unstyled and the preferences-panel toggle switches showed the site's global accent colour (could be any colour, including red) instead of the preset's green \u2014 the preset never set <code>--cookr-accent<\/code>, so <code>cookr.css<\/code>'s defaults for <code>#cookr-reopen<\/code> and <code>.cookr-switch input:checked + .cookr-slider<\/code> (both driven by <code>var(--cookr-accent)<\/code>) fell through to the global accent_color setting<\/li>\n<li>Added <code>#cookr-banner, #cookr-reopen { --cookr-accent: #00ff88; }<\/code> and <code>#cookr-reopen svg rect { fill: #000000; stroke: #00ff88; }<\/code> to the preset \u2014 toggle switches and the reopen pill\/dot now render in the preset's black\/green theme regardless of the global accent colour setting<\/li>\n<li>Fixed admin preview panel loading spinner: <code>@keyframes cookr-spin<\/code> only animates <code>transform: rotate()<\/code>, but the spinner's centering also used <code>transform: translate(-50%, -50%)<\/code> \u2014 animating <code>transform<\/code> between an implicit <code>translate(...)<\/code> start and a <code>rotate(360deg)<\/code> end produced a visible jump\/skip instead of a clean spin. Centering now uses <code>top\/left + negative margin<\/code>, leaving <code>transform<\/code> free for rotation only<\/li>\n<li>Made the admin preview banner fully static \u2014 removed the cosmetic preferences-panel click handler, and the preview banner \/ reopen button no longer respond to hover or click (<code>pointer-events: none<\/code>). The preview is a visual reference only, not an interactive demo<\/li>\n<li>Fixed a critical non-idempotency bug in the custom CSS sanitiser (<code>cookr_scope_css<\/code>): every settings save re-sanitises the <em>currently saved<\/em> value (the textarea is repopulated with the previously-scoped output), but the selector-mirroring logic was not idempotent \u2014 an already-mirrored selector like <code>#cookr-banner .cookr-inner<\/code> would itself pass the #cookr-\/.cookr- prefix check and get re-added on each save, and the <code>.cookr-title svg<\/code> icon-colour helper would re-fire for both a selector and its mirror, with both copies persisting forward. On real-world installs this had compounded over repeated saves into 150+ duplicate copies of some rules and a single selector list repeated 18 times, ballooning the saved CSS to 220KB. Selectors within each rule and the full set of emitted rules are now deduplicated (exact-string, order-preserving), making the sanitiser idempotent \u2014 re-saving now reproduces the same output instead of growing it. Existing bloated saved CSS will collapse back to its correct minimal form on the next save<\/li>\n<\/ul>\n\n<h4>1.9.11<\/h4>\n\n<ul>\n<li>Fixed critical bug in custom CSS sanitiser (<code>cookr_scope_css<\/code>): a CSS comment placed directly above a rule (e.g. <code>\/* Buttons *\/<\/code> followed by <code>.cookr-btn { ... }<\/code>) caused the comment text to be parsed as part of the selector, failing the #cookr-\/.cookr-\/:root prefix check and silently dropping the entire rule with no error shown to the admin<\/li>\n<li>CSS comments are now stripped before selector parsing \u2014 fixes silent loss of <code>:root<\/code> accent overrides and any commented\/sectioned custom CSS<\/li>\n<\/ul>\n\n<h4>1.9.10<\/h4>\n\n<ul>\n<li>Added font detection for classic themes that load fonts via enqueued stylesheets (e.g. Kadence default installs) \u2014 previously only customizer-saved typography and block-theme theme.json fonts were detected<\/li>\n<li>New detection path parses Google Fonts and Bunny Fonts family names from registered stylesheets on the frontend, cached in a 6-hour transient, invalidated on theme switch<\/li>\n<li>Confirmed <code>Update URI<\/code> header (added in 1.9.9) correctly prevents WordPress.org from offering false update notices on RADR installs<\/li>\n<\/ul>\n\n<h4>1.9.9<\/h4>\n\n<ul>\n<li>Fixed banner close behaviour \u2014 added state-aware close button always visible in banner<\/li>\n<li>Fixed Escape key \u2014 now follows same state-aware dismiss logic as close button<\/li>\n<li>No consent overwrite when closing with stored consent and no unsaved changes<\/li>\n<li>Prompts before discarding unsaved preference changes (native confirm dialog)<\/li>\n<\/ul>\n\n<h4>1.9.8<\/h4>\n\n<ul>\n<li>Fixed LiteSpeed Cache JS Combine compatibility \u2014 cookrConfig inline block now isolated to a dedicated script handle, preventing third-party inline errors from aborting COOKR initialisation<\/li>\n<li>Added automatic JS exclusion filters for LiteSpeed Cache, WP Rocket, Autoptimize, and FlyingPress \u2014 COOKR registers itself as excluded from JS combination pipelines automatically<\/li>\n<li>Updated compatibility matrix schema \u2014 added protocol, protocol_version, test_payload, verification_method, special_checks fields across all entries<\/li>\n<li>Recorded first VERIFIED enforcement baseline: WordPress Core, Protocol v1.0, all six test cases passed<\/li>\n<li>Recorded LiteSpeed Cache JS Combine finding: FAIL without exclusion, PASS with automatic exclusion<\/li>\n<\/ul>\n\n<h4>1.9.7<\/h4>\n\n<ul>\n<li>Fixed PHP notice in auto-blocker iframe rewrite handling<\/li>\n<li>Fixed blocked-status reporting for detected domains<\/li>\n<li>Fixed consent log rate-limit bypass edge case<\/li>\n<li>Fixed missing policy_version storage in consent records<\/li>\n<li>Fixed remote signature update setting persistence<\/li>\n<li>Fixed language switcher save-state detection<\/li>\n<li>Added full-consent buffer shortcut optimization<\/li>\n<\/ul>\n\n<h4>1.9.6<\/h4>\n\n<ul>\n<li>Compliance improvements for WP.org review<\/li>\n<li>Removed generic CDN entries from auto-blocker allowlist<\/li>\n<li>Export uses explicit allowlist for safe settings only<\/li>\n<li>Build tooling improvements<\/li>\n<\/ul>\n\n<h4>1.9.5<\/h4>\n\n<ul>\n<li>WordPress.org review and compliance-related improvements<\/li>\n<li>Internal maintenance and review-related updates<\/li>\n<\/ul>\n\n<h4>1.9.2<\/h4>\n\n<ul>\n<li>Initial public CORE release<\/li>\n<li>3\u00d73 visual position picker replaces dropdown<\/li>\n<li>Accent colour now applies to banner icon and buttons in preview<\/li>\n<li>Auto-Blocker wording updated \u2014 recommended framing, test-after-enable guidance<\/li>\n<li>Runtime Inspector enabled by default<\/li>\n<li>Preserve data on uninstall enabled by default<\/li>\n<li>Consent log default retention reduced to 100 entries<\/li>\n<li>COOKR CRAZE built-in CSS preset<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Added: Runtime Inspector \u2014 detects unknown third-party script and iframe domains at runtime<\/li>\n<li>Added: Persistent findings stored per domain (first seen, last seen, page count)<\/li>\n<li>Added: Runtime Inspector toggle with configurable auto-disable duration<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: Google Consent Mode v2<\/li>\n<li>Added: debug inspector<\/li>\n<li>Added: browser chrome preview in admin dashboard<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Plugin renamed from GDPR Cookie Consent to COOKR<\/li>\n<li>Added: WP_HTML_Tag_Processor for safe, attribute-aware script rewriting<\/li>\n<li>Added: CSP nonce propagation<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"GDPR cookie consent with server-side script blocking. Prevent Google Analytics, GTM, Meta Pixel and third-party embeds from loading before consent.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318207"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/danjed"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318207"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318207"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318207"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318207"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318207"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}