{"id":387220,"date":"2026-10-20T09:30:21","date_gmt":"2026-10-20T09:30:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/lexiscript-consent-privacy\/"},"modified":"2026-10-20T11:52:20","modified_gmt":"2026-10-20T11:52:20","slug":"lexiscript","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/lexiscript\/","author":23586214,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Lexiscript Consent & Privacy","header_author":"Jaydee Innovation Hub","header_description":"Installs the Lexiscript consent widget, which blocks non-essential trackers until a visitor consents and applies the consent model of the visitor's own region. Requires a Lexiscript account on a paid plan.","assets_banners_color":"0d7544","last_updated":"2026-10-20 11:52:20","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/jaytechkenya.com\/lexiscript","header_author_uri":"https:\/\/jaytechkenya.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":63,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jmwatee","date":"2026-10-20 09:29:51","revision":3756296},"1.0.1":{"tag":"1.0.1","author":"jmwatee","date":"2026-10-20 11:52:20","revision":3756606}},"upgrade_notice":{"1.0.1":"<p>Corrects the plan information in the readme. No functional changes.<\/p>","1.0.0":"<p>First release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3756347,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3756347,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3756347,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3756347,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The settings screen \u2014 one field to paste your site key.","2":"The consent banner as a visitor in an opt-in region sees it.","3":"The preference centre, with per-category choices."}},"plugin_section":[],"plugin_tags":[166295,20011,389,131785,396],"plugin_category":[54],"plugin_contributors":[287662],"plugin_business_model":[],"class_list":["post-387220","plugin","type-plugin","status-publish","hentry","plugin_tags-ccpa","plugin_tags-consent","plugin_tags-cookies","plugin_tags-gdpr","plugin_tags-privacy","plugin_category-security-and-spam-protection","plugin_contributors-jmwatee","plugin_committers-jmwatee"],"banners":{"banner":"https:\/\/ps.w.org\/lexiscript\/assets\/banner-772x250.png?rev=3756347","banner_2x":"https:\/\/ps.w.org\/lexiscript\/assets\/banner-1544x500.png?rev=3756347","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/lexiscript\/assets\/icon-128x128.png?rev=3756347","icon_2x":"https:\/\/ps.w.org\/lexiscript\/assets\/icon-256x256.png?rev=3756347","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Most consent banners describe what a site does. This one changes it.<\/p>\n\n<p>The Lexiscript widget intercepts the browser APIs that scripts use to insert themselves, so a\ntracker is caught at the moment it tries to load rather than disclosed after it has already run.\nNon-essential scripts do not execute until the visitor has agreed \u2014 and what counts as agreement\ndepends on where that visitor is.<\/p>\n\n<p><strong>Region-aware by default.<\/strong> A visitor in Germany, one in California and one in Kenya get\ndifferent behaviour from the same installation. The widget applies one of three consent models\naccording to the visitor's location:<\/p>\n\n<ul>\n<li>Opt-in, where nothing runs until consent is given: EU, UK, Kenya, Nigeria, Brazil<\/li>\n<li>Opt-out, presented as \"Do Not Sell or Share\": California<\/li>\n<li>Notice-only: South Africa, Canada<\/li>\n<\/ul>\n\n<p>These groupings reflect how Lexiscript reads the published rules for each region. They are a\nproduct configuration, not a legal determination about your site \u2014 see \"Not legal advice\" below.<\/p>\n\n<p><strong>What the widget does on your site<\/strong><\/p>\n\n<ul>\n<li>Blocks non-essential scripts before they run, rather than describing them afterwards<\/li>\n<li>Shows a preference centre with per-category choices, not all-or-nothing<\/li>\n<li>Gives \"Reject all\" the same prominence as \"Accept\"<\/li>\n<li>Pre-ticks nothing under an opt-in model<\/li>\n<li>Honours the Global Privacy Control signal automatically<\/li>\n<li>Treats a stored decision as expired after the configured lifetime<\/li>\n<li>Invalidates previous consent when the tracker set changes, because the visitor never agreed\nto the new ones<\/li>\n<li>Never blocks the page itself \u2014 the scripts are blocked, not your content<\/li>\n<li>Fails closed: if the configuration cannot be reached, it serves deny-all rather than letting\neverything through<\/li>\n<li>One small vanilla JavaScript file, no framework, no dependencies<\/li>\n<\/ul>\n\n<p><strong>Why this plugin exists<\/strong><\/p>\n\n<p>The widget is one script, and the only thing that is easy to get wrong is where it goes \u2014 it must\nrun before every other script on the page or it has nothing left to intercept. This plugin\nregisters it with WordPress's script loader and prints it at the top of the document head, ahead\nof the tags that themes and other plugins add, and keeps it there through theme changes.<\/p>\n\n<h4>Plans and pricing<\/h4>\n\n<p>A Lexiscript account is free, and so is scanning your site and reading the findings. <strong>The\nfree plan also runs the consent widget on one website<\/strong>, which is all most sites need.<\/p>\n\n<p>If your Lexiscript account holds more than one website, the free widget serves the first one you\nadded. The others will not return a configuration, and no banner will appear on them, until you\nmove to a paid plan.<\/p>\n\n<p>Nothing stops working after a trial period. Current pricing is on\nhttps:\/\/jaytechkenya.com\/lexiscript.<\/p>\n\n<h4>External service<\/h4>\n\n<p>This plugin requires a Lexiscript account and loads a script from Lexiscript, a service operated\nby Jaydee Innovation Hub (Nairobi, Kenya). The plugin does not function without it.<\/p>\n\n<ul>\n<li>The plugin registers and prints one script, served from <code>https:\/\/widget.jaytechkenya.com<\/code>,\nwith your site key as a query parameter. This is Lexiscript's own service endpoint, not a\ngeneral-purpose third-party CDN, and the script is the service.<\/li>\n<li>That script runs in your visitors' browsers. It requests your site's consent configuration\nfrom Lexiscript, and the visitor's IP address is used at the edge to resolve their country \u2014\nand US state where relevant \u2014 in order to decide which consent model applies. The IP address\nis used for that lookup and is not retained as part of a visitor profile.<\/li>\n<li>The visitor's own consent choices are stored in their browser. They are not sent to\nLexiscript.<\/li>\n<li>This plugin itself makes no requests to Lexiscript from your server, and reads or transmits\nnothing from your WordPress database.<\/li>\n<li>Service terms: https:\/\/jaytechkenya.com\/terms<\/li>\n<li>Privacy policy: https:\/\/jaytechkenya.com\/privacy<\/li>\n<li>About the service: https:\/\/jaytechkenya.com\/lexiscript<\/li>\n<\/ul>\n\n<h4>Not legal advice<\/h4>\n\n<p>Lexiscript reports what your website does and which published rules are relevant to it. It does\nnot determine whether your site is lawful, it does not make your site compliant with any law,\nand nothing it produces is legal advice. Whether your use of this plugin meets your obligations\nis a question for your own adviser.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Create an account at https:\/\/jaytechkenya.com\/lexiscript and add your website.<\/li>\n<li>Open your website in the Lexiscript dashboard and copy the id from the install snippet.<\/li>\n<li>Install and activate this plugin.<\/li>\n<li>Go to <strong>Settings \u2192 Lexiscript<\/strong> and paste the id into the Site key field.<\/li>\n<li>Load your site in a private window. The banner should appear, and your analytics should not\nfire until you accept.<\/li>\n<\/ol>\n\n<p>If the banner does not appear, and this is the second or third website on your Lexiscript\naccount, that is the plan boundary: the free plan covers one site.<\/p>\n\n<p>If you previously pasted the Lexiscript tag into your theme by hand, remove it \u2014 two copies of\nthe widget is not better than one.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20paid%20plan%3F\"><h3>Do I need a paid plan?<\/h3><\/dt>\n<dd><p>Not for one website. Creating an account, adding a site, scanning it and running the consent\nwidget on it are all free. A paid plan covers additional websites and adds automatic monthly\nre-scans.<\/p><\/dd>\n<dt id=\"why%20does%20this%20script%20load%20before%20everything%20else%3F\"><h3>Why does this script load before everything else?<\/h3><\/dt>\n<dd><p>Because it has to. The widget works by intercepting the browser APIs that scripts use to insert\nthemselves, which only affects scripts that load after it. The plugin registers the widget with\n    wp_register_script() and then prints that one handle at <code>wp_head<\/code> priority 0, rather than\nletting it print with the rest of the queue at priority 9 \u2014 several tag-manager plugins\ndeliberately hook earlier than 9, and anything that loads first wins.<\/p><\/dd>\n<dt id=\"it%20is%20not%20blocking%20my%20google%20tag%20manager%20container\"><h3>It is not blocking my Google Tag Manager container<\/h3><\/dt>\n<dd><p>Check that no other plugin or your theme is printing a tag above this one. This plugin prints at\n    wp_head priority 0, which is earlier than anything using the default priority, but code hooked\nat priority 0 before it, or hard-coded directly into <code>header.php<\/code> above <code>wp_head()<\/code>, will still\nwin. Move it below <code>wp_head()<\/code> and it will be caught.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20my%20site%20down%3F\"><h3>Will this slow my site down?<\/h3><\/dt>\n<dd><p>The widget is a single small JavaScript file. It is loaded synchronously and deliberately so: a\ndeferred or asynchronous script cannot intercept tags that have already started loading, which\nwould defeat the point.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%3F\"><h3>Does it work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. The tag is static markup, so it caches like the rest of the page. The consent decision\nitself is made in the visitor's browser, not on your server, so a cached page serves the correct\nbehaviour to every visitor regardless of where they are.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in the network has its own site key, set on that site's own settings screen.<\/p><\/dd>\n<dt id=\"can%20i%20point%20it%20at%20a%20different%20host%3F\"><h3>Can I point it at a different host?<\/h3><\/dt>\n<dd><p>Yes, for self-hosted or staging deployments, by defining a constant in <code>wp-config.php<\/code>:<\/p>\n\n<pre><code>define( 'LEXISCRIPT_WIDGET_HOST', 'https:\/\/widget.example.com' );\n<\/code><\/pre>\n\n<p>It is deliberately not a setting. The value decides the origin of a script that runs on every\npage of your site, so it belongs with your deployment constants rather than in a form.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20it%3F\"><h3>What happens if I deactivate it?<\/h3><\/dt>\n<dd><p>The tag stops being printed and trackers run as they did before. Your settings are kept in case\nyou reactivate; deleting the plugin removes them.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Corrected the plan information. The consent widget runs on one website on the free plan; the\nprevious release wrongly stated that it required a paid plan.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Blocks non-essential trackers until your visitor consents, applying the consent model of their own region. Free for one website.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/387220","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=387220"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jmwatee"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=387220"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=387220"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=387220"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=387220"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=387220"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=387220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}