Title: GWiz IT Content Locker
Author: Graham Becker
Published: <strong>September 24, 2026</strong>
Last modified: September 24, 2026

---

Search plugins

![](https://ps.w.org/g-wiz-it-content-locker/assets/banner-772x250.png?rev=3711955)

![](https://ps.w.org/g-wiz-it-content-locker/assets/icon-256x256.png?rev=3711955)

# GWiz IT Content Locker

 By [Graham Becker](https://profiles.wordpress.org/gbecker1983/)

[Download](https://downloads.wordpress.org/plugin/g-wiz-it-content-locker.zip)

 * [Details](https://wordpress.org/plugins/g-wiz-it-content-locker/#description)
 * [Reviews](https://wordpress.org/plugins/g-wiz-it-content-locker/#reviews)
 *  [Installation](https://wordpress.org/plugins/g-wiz-it-content-locker/#installation)
 * [Development](https://wordpress.org/plugins/g-wiz-it-content-locker/#developers)

 [Support](https://wordpress.org/support/plugin/g-wiz-it-content-locker/)

## Description

GWiz IT Content Locker is a free, self-hosted lead-generation plugin for gating 
content, collecting email subscribers, connecting to popular email marketing platforms,
and tracking conversions — without requiring a third-party SaaS service.

**Key Features:**

 * **Restricted Areas** — Create multiple gated areas, each with its own URLs, settings,
   form, and email templates.
 * **Inline Shortcodes** — Use `[gwiz_it_content_locker area="AreaName"]...[/gwiz_it_content_locker]`
   to gate content inline without replacing the entire page.
 * **Hide by CSS Selector** — Hide elements by class name (e.g., `div.exampleclass`)
   until the visitor signs up.
 * **Custom Form Builder** — Drag-and-drop form fields with 9 field types. The email
   field is always required.
 * **Email Templates** — Visual editors for confirmation and congratulations emails
   with placeholder support.
 * **Popup Template** — Customize the overlay popup with a visual editor and form
   placeholder.
 * **Double Opt-In** — Optionally require email confirmation before granting access.
 * **HMAC-Signed Cookies** — Visitor cookies are HMAC-signed with configurable expiration
   per area.
 * **Signups Viewer** — View, search, and export signups with customizable columns
   and CSV export (UTF-8 BOM for Excel).
 * **Statistics** — Track views, submissions, and confirmations with date-range 
   filtering.
 * **Clone & Export/Import** — Duplicate restricted areas with a single click, or
   export/import area settings as ZIP backups (with optional contact migration).
   Includes forward-compatible version handling for safe backups.
 * **Debug Mode** — Per-area toggle that shows a cookie-status toolbar on the frontend
   so you can verify the gate is working.
 * **Frontend Builder Support** — Works with Elementor, Divi, and Beaver Builder.
 * **Performance Optimized** — Frontend JS/CSS only loads on pages that actually
   use the shortcode or have matching hide selectors.
 * **Built-In Help Guide** — A detailed, plain-English guide to every button and
   setting, accessible from the Help button on the Restricted Areas page.

**Third-Party Integrations:**

Sync confirmed signups automatically to your email marketing platform:

 * **ActiveCampaign** — Add contacts to a list with optional tags.
 * **Brevo (formerly Sendinblue)** — Add contacts to a list.
 * **ConvertKit** — Add subscribers to a sequence or tag.
 * **Mailchimp** — Add subscribers to an audience with optional tags.
 * **phpList** — Add subscribers to a mailing list via the phpList REST API.

Spam protection options:

 * **Google reCAPTCHA v2** — Classic checkbox captcha.
 * **Google reCAPTCHA v3** — Invisible score-based captcha.
 * **ALTCHA (self-hosted)** — Lightweight, privacy-friendly proof-of-work captcha
   with no external API calls.

**External Services:**

This plugin optionally connects to the following third-party services when configured
by the site administrator. No data is sent to any external service until you explicitly
enable and enter your API credentials for that service.

 * **ActiveCampaign** — Syncs confirmed subscriber email addresses to your ActiveCampaign
   account via their API. ([ActiveCampaign Privacy Policy](https://www.activecampaign.com/privacy-policy/))
 * **Brevo (formerly Sendinblue)** — Syncs confirmed subscriber email addresses 
   to your Brevo account via their API. ([Brevo Privacy Policy](https://www.brevo.com/legal/privacypolicy/))
 * **ConvertKit** — Syncs confirmed subscriber email addresses to your ConvertKit
   account via their API. ([ConvertKit Privacy Policy](https://convertkit.com/privacy))
 * **Mailchimp** — Syncs confirmed subscriber email addresses to your Mailchimp 
   audience via their API. ([Mailchimp Privacy Policy](https://mailchimp.com/legal/privacy/))
 * **phpList** — Syncs confirmed subscriber email addresses to your self-hosted 
   phpList installation via its REST API.
 * **Google reCAPTCHA** — When enabled, loads the Google reCAPTCHA script to protect
   signup forms from spam. Sends the visitor IP address and browser information 
   to Google for verification. ([Google Privacy Policy](https://policies.google.com/privacy))

All data transfer occurs over HTTPS. The ALTCHA captcha option is fully self-hosted
and does not connect to any external service.

### Shortcode Usage

Gate content inline using the shortcode:

    ```
    [gwiz_it_content_locker area="AreaName"]This content is hidden until the visitor signs up.[/gwiz_it_content_locker]
    ```

The `area` attribute uses the area’s display name. If multiple areas share the same
name, Windows-style deduplication applies: `AreaName`, `AreaName2`, `AreaName3`.

The exact shortcode for each area is shown in the area’s **Settings** modal.

**Important — logged-in users never see the gate:** if you are logged in (for example
as an administrator), the plugin intentionally shows the unlocked content with **
no signup form**, so you are never gated on your own site. If the wrapped text just
appears with no form, you are almost certainly logged in. To see the gate as a visitor
would, log out or open the page in a private/incognito browser window. To preview
the gate while logged in, enable **Debug Mode** in the area’s Settings modal — that
shows the form to logged-in administrators too. Developers can adjust this behavior
with the `gwiz_it_content_locker_bypass_logged_in` filter.

### Hooks

#### Filters

**`gwiz_it_content_locker_load_frontend`** — Control whether frontend assets load
on the current page.

    ```
    `
    ```

add_filter( ‘gwiz_it_content_locker_load_frontend’, function( $should_load, $post){
//
Force-load on a specific page template. if ( is_page_template( ‘template-custom.
php’ ) ) { return true; } // Prevent loading on the shop page. if ( is_shop() ) {
return false; } return $should_load; }, 10, 2 ); `

Parameters:
 * `$should_load` (bool) — Whether assets should load. Default is auto-
detected based on shortcode/selector presence. * `$post` (WP_Post|null) — The current
post object.

## Screenshots

[⌊Sample signup form⌉⌊Sample signup form⌉[

Sample signup form

[⌊Administration page showing multiple restricted areas⌉⌊Administration page showing
multiple restricted areas⌉[

Administration page showing multiple restricted areas

[⌊Partial view of the main settings page of a restricted area⌉⌊Partial view of the
main settings page of a restricted area⌉[

Partial view of the main settings page of a restricted area

[⌊Add and edit custom form fields for each area's signup form⌉⌊Add and edit custom
form fields for each area's signup form⌉[

Add and edit custom form fields for each area’s signup form

[⌊Edit the confirmation and congratulations emails⌉⌊Edit the confirmation and congratulations
emails⌉[

Edit the confirmation and congratulations emails

[⌊Signup form templates⌉⌊Signup form templates⌉[

Signup form templates

[⌊Form and popup styles⌉⌊Form and popup styles⌉[

Form and popup styles

[⌊Built-in form and popup previewer for each section⌉⌊Built-in form and popup previewer
for each section⌉[

Built-in form and popup previewer for each section

[⌊Numerous third-party integration tools⌉⌊Numerous third-party integration tools⌉[

Numerous third-party integration tools

[⌊Various security options⌉⌊Various security options⌉[

Various security options

[⌊Lock an entire page by URL⌉⌊Lock an entire page by URL⌉[

Lock an entire page by URL

[⌊Signup list with export options⌉⌊Signup list with export options⌉[

Signup list with export options

[⌊Statistics page⌉⌊Statistics page⌉[

Statistics page

## Installation

 1. Upload the `g-wiz-it-content-locker` folder to the `/wp-content/plugins/` directory.
 2. Activate **GWiz IT Content Locker** through the **Plugins** screen in WordPress.
 3. Click the **GWiz IT Content Locker** menu item in the admin sidebar to manage restricted
    areas.
 4. Visit **GWiz IT Content Locker  Settings** to configure default templates and security
    settings.

## FAQ

### Where can I find help for each button?

Click the **Help** button at the top of the Restricted Areas page. It opens a detailed
guide that explains every button and setting with a sample of each button alongside
the explanation.

### How do I find the shortcode for my area?

Click the **⚙️ Settings** button on any restricted area card. The shortcode is displayed
at the top with a Copy button.

### Why do I see my content with no signup form?

Because you are logged in. Logged-in users always receive the unlocked content without
a form — this is by design so site editors and administrators are never gated on
their own site. Test as a visitor: log out, or open the page in a private/incognito
browser window. To preview the gate while logged in, enable **Debug Mode** in the
area’s Settings modal.

### What happens if two areas have the same name?

The plugin uses Windows-style deduplication. The first area keeps the base name,
the second gets a `2` suffix, the third gets `3`, etc. The exact shortcode is always
shown in the area’s settings.

### Can I use this with Elementor or Divi?

Yes. The plugin pre-scans Elementor (`_elementor_data`), Divi (`_et_pb_post_content`),
and Beaver Builder (`_fl_builder_data`) content for shortcodes and hide selector
class names.

### How do I hide elements by class name?

In the area’s **Settings** modal, enter CSS selectors in the **Hide by Selector**
textarea (one per line). For example: `div.exampleclass` or `span.highlight`. Elements
matching these selectors will be hidden until the visitor signs up.

### Can I show the form only on the first shortcode instance?

Each shortcode instance on the page renders independently. If you need the form 
on only one instance, place the shortcode once and use CSS selectors to lock other
elements on the page.

### Does the plugin load JS/CSS on every page?

No. The plugin pre-scans the current page’s content (including Elementor/Divi/Beaver
Builder data) and only loads frontend assets when the shortcode is detected or when
hide selector class names are found in the page content.

### How do I clone a restricted area?

Click the **📋 Clone** button on any restricted area card header. A popup will ask
whether to include contacts (defaults to No). The clone is created immediately as
a disabled copy with a unique name suffix (e.g. “My Area-1”) and a different color.

### How do I export/import area settings?

Click the **📦 Export** button on any area card to download a ZIP backup file. To
import, click the **📥 Import Settings** button on an existing area (to overwrite
it) or the **Import Area** button at the top of the page (to create a new area from
the backup). A popup will ask whether to include contacts. Backups are forward-compatible:
if you import a backup from an older plugin version, missing settings will use their
defaults.

### Can I transfer contacts between areas?

Yes. When cloning or exporting, check the “Include contacts/users?” option. When
importing, contacts from the backup file will be added to the target area. Note 
that this creates new signup records (contacts are not de-duplicated by email).

### How do I force-load assets on a specific page?

Use the `gwiz_it_content_locker_load_frontend` filter (see Hooks section below).

### Is the CSV export Excel-compatible?

Yes. The CSV includes a UTF-8 BOM (Byte Order Mark) at the start of the file, which
tells Excel to use UTF-8 encoding. This ensures non-English characters (accented
letters, CJK, etc.) display correctly.

### What email placeholders are available?

**Confirmation Email:** `{{confirm_link}}`, `{{site_name}}`, `{{email}}`, `{{area_name}}`,`{{
source_url}}`

**Congratulations Email:** `{{site_name}}`, `{{email}}`, `{{area_name}}`, `{{source_url}}`

**Popup Template:** `{{form}}`, `{{already_signed_up_link}}`, `{{site_name}}`, `{{
area_name}}`, `{{file_name}}`

### How does the “I have already signed up” link work?

The popup template includes an `{{already_signed_up_link}}` placeholder. When clicked,
it shows an email-only verification form. If the email exists as a confirmed signup
for that area, the visitor’s cookie is set and they gain access. If not found, a
generic message is shown (to prevent email enumeration).

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“GWiz IT Content Locker” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ Graham Becker ](https://profiles.wordpress.org/gbecker1983/)
 *   [ gwizit ](https://profiles.wordpress.org/gwizit/)

[Translate “GWiz IT Content Locker” into your language.](https://translate.wordpress.org/projects/wp-plugins/g-wiz-it-content-locker)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/g-wiz-it-content-locker/),
check out the [SVN repository](https://plugins.svn.wordpress.org/g-wiz-it-content-locker/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/g-wiz-it-content-locker/)
by [RSS](https://plugins.trac.wordpress.org/log/g-wiz-it-content-locker/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.7.3

 * Fixed: restricted area rename — pressing Enter or clicking outside the name field
   now saves the change, and Escape cancels it.
 * Fixed: the area color picker no longer crashes with a JavaScript error and opens
   correctly.
 * Fixed: form and email template editors no longer open blank for newly created
   areas — they are pre-filled with the default templates.
 * Improved: the logged-in bypass is now documented where users look for shortcode
   help (area settings modal, help page, and readme FAQ).

#### 1.7.2

 * Fixed: scripts and styles are now registered and enqueued via the WordPress scripts
   and styles API.
 * Fixed: shortcode callback output is now escaped with wp_kses and an explicit 
   allowlist.
 * Fixed: text domain renamed to g-wiz-it-content-locker to match the plugin slug.

#### 1.7.0

 * Breaking: plugin renamed from “GWiz GWiz IT” to “GWiz IT Content Locker” to avoid
   trademark confusion with Gravity Wiz.
 * Breaking: shortcode changed from [gwiz_leadgate] to [gwiz_it_content_locker].
   Update any existing pages/posts using the old shortcode.
 * Breaking: all internal prefixes renamed (text domain, function names, option 
   names, database table names, CSS classes, JS variables).
 * Breaking: database tables renamed from wp_gwiz_gwiz_it_* to wp_gwiz_it_content_locker_*.
 * If upgrading from 1.6.x: export your areas first, uninstall the old version, 
   install the new version, then import your areas from backup.
 * Improved: WordPress coding standards compliance — resolved all PHPCS errors and
   warnings.

#### 1.6.2

 * Improved: WordPress coding standards compliance — resolved all PHPCS errors and
   warnings from the WordPress Plugin Checker.
 * Improved: added missing translators comments for all translatable strings with
   placeholders.
 * Improved: nonce verification annotations for all AJAX handlers (nonce checks 
   were already present via verify_ajax()).
 * Improved: replaced deprecated functions — unlink() with wp_delete_file(), parse_url()
   with wp_parse_url().
 * Improved: input sanitization and validation for cookie values and server variables.
 * Improved: database query annotations for custom table operations (DirectDatabaseQuery,
   InterpolatedNotPrepared).
 * Improved: moved HTML tags outside translatable strings for proper i18n compliance.
 * Improved: added isset() checks for $_SERVER superglobal access.
 * No functional changes or database schema updates.

#### 1.6.1

 * Fixed: the debug-mode “temporarily close” button now respects the “Keep inline
   signup forms visible after popup is dismissed” setting. Previously, closing the
   popup with debug mode enabled did not set the session flag, so inline forms remained
   visible on subsequent page loads even when the setting was unchecked.

#### 1.6.0

 * Added Clone feature: duplicate any restricted area with one click. The clone 
   is created disabled with a unique name suffix (-1, -2, -3, etc.) and a different
   color. Optionally include contacts in the clone.
 * Added Export feature: download a ZIP backup of any restricted area containing
   all settings, templates, URLs, and optionally contacts. The backup includes a
   manifest with plugin version metadata for forward-compatible restores.
 * Added Import feature: restore area settings from a ZIP backup. Import creates
   a new area (with automatic name deduplication) or overwrites an existing area’s
   settings with a confirmation warning. Version mismatch warnings are shown when
   importing backups from older plugin versions.
 * Added top-of-page “Import Area” button alongside “Add New Area” for creating 
   new areas from backup files.
 * Added “Include contacts/users?” option to all clone, export, and import operations(
   defaults to No for clone/export, No for import).
 * Backup files use a ZIP format with separate JSON files (manifest.json, area.json,
   urls.json, signups.json) for maximum compatibility and readability.

#### 1.5.1

 * Added background colors to the new Form Template, Form/Popup Styles, and Preview
   buttons.
 * Stacked the Inline Form and Full-Page Popup style sections vertically instead
   of side-by-side columns.
 * Added a title above the preview showing which form/popup state is currently displayed.

#### 1.5.0

 * Renamed “Popup Template” to “Form Template” and moved the Confirm Notice template
   under it (removed the separate Confirm Notice button).
 * Added a “Form/Popup Styles” option with presets (Default, Modern, Dark, Rounded,
   Minimal) plus per-field controls for font, colors, size, radius, alignment, and
   position — separately for inline forms and full-page popups.
 * Added a “Preview” button that opens a modal previewing every form/popup state,
   with prev/next arrows to navigate and non-interactive forms.
 * Styles are applied via CSS variables to both the inline form card and the full-
   page popup overlay.

#### 1.4.1

 * Debug mode banner is now always pinned to the bottom of the inline form and full-
   page popup, below any AJAX views.
 * Added a green/red cookie status line above the debug banner showing whether the
   area access cookie is currently valid.
 * Admin modals are now constrained to the browser window with an internal vertical
   scroll bar, so they stay on screen at high zoom levels.

#### 1.4.0

 * Added a “Not Signed Up” template shown (via AJAX) when a visitor verifies an 
   email on the “already signed up” form that has not signed up, with a link back
   to the signup form.
 * The “Already Signed Up” template now includes a close button by default (new `{{
   close_label}}` placeholder).
 * Moved the “Already Signed Up” template editor into the Popup Template modal (
   Popup / Already Signed Up / Not Signed Up) and removed the separate button on
   each restricted area.
 * The “already signed up” email check is now fully AJAX on inline forms — no page
   refresh; closing the already-signed-up view reveals the content immediately.
 * Added global defaults for the new templates on the Settings page.
 * Added the `not_signedup_template` database column (automatic migration).

#### 1.3.2

 * Fixed: the “Already signed up” link in popup templates that use the older `gwiz-
   it-already-signed-up` class now opens the verification form instead of refreshing
   the page.
 * Fixed: the default popup templates no longer nest an anchor inside the `{{already_signed_up_link}}`
   placeholder (invalid HTML).
 * Fixed: no duplicate “already signed up” link is appended when the template already
   contains one.

#### 1.3.1

 * Fixed: elements matched by the CSS Selector setting were not hidden because the
   generated hide class never matched the stylesheet rule (attribute selector now
   matches classes anywhere in the class list, plus a data-attribute fallback).
 * Fixed: selector-matched elements are now hidden with an inline style as well,
   so the gate still blocks content when the stylesheet is served from cache.
 * Fixed: selector gates are injected immediately at script parse time (no flash
   of unprotected content) and can no longer be injected twice.
 * Added: with Debug Mode enabled on an area, logged-in administrators now see the
   gate so they can preview it on the frontend.
 * Added: `gwiz_it_content_locker_bypass_logged_in` filter for controlling the logged-
   in bypass.

#### 1.3.0

 * Added `[gwiz_it_content_locker]` shortcode for inline content gating with Windows-
   style area name deduplication.
 * Added hide-by-CSS-selector feature with first/all display modes.
 * Added lead-capture form builder with drag-and-drop fields (9 field types).
 * Added email templates (confirmation + congratulations) with TinyMCE visual editors.
 * Added popup template editor with form and already-signed-up placeholders.
 * Added signups viewer with expandable detail rows, customizable columns, and form
   snapshot storage.
 * Added CSV export with UTF-8 BOM for Excel compatibility and field selection.
 * Added statistics modal with date-range filtering (views, submissions, confirmations,
   conversion rate).
 * Added per-area settings: debug mode, cookie expiration, double opt-in.
 * Added HMAC-signed per-area visitor cookies with configurable expiration.
 * Added confirmation link handler for double opt-in flow.
 * Added “I have already signed up” verification flow.
 * Added frontend builder support (Elementor, Divi, Beaver Builder shortcode detection).
 * Added performance optimization: frontend assets only load when shortcode or hide
   selectors are detected on the page.
 * Added `gwiz_it_content_locker_load_frontend` filter for developer control over
   asset loading.
 * Added new database tables for signups and analytics.
 * Security: all visitor-facing AJAX endpoints use nonce verification, input sanitization,
   and SameSite cookies.

#### 1.2.0

 * Removed global enable toggle — each restricted area now has its own on/off toggle.
 * Added per-area settings: rename, color picker with preset colors, save button.
 * New areas spawn with a random color and inactive by default.
 * Areas store settings as JSON in the database (extensible for future features).
 * Frontend gating now only enforces active areas (is_active = 1).
 * Database migration runs automatically on version upgrade.
 * Area cards show active/inactive state with visual opacity and toggle switch.

#### 1.1.0

 * Added custom database tables for restricted areas, URLs, and gated files.
 * Added Restricted Areas admin page with expandable area cards, URL management,
   and autocomplete.
 * Added Settings page with “Enable Lead Gating” toggle.
 * Added frontend gate overlay for restricted page/post URLs.
 * Added gated file download system with tokenized URLs and private file storage.
 * Added confirmation modals for destructive actions.

#### 1.0.0

 * Initial plugin foundation.
 * Added the GWiz IT Content Locker administration dashboard.
 * Added translation-ready and GPL-licensed plugin structure.

## Meta

 *  Version **1.7.3**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [content locker](https://wordpress.org/plugins/tags/content-locker/)[Email Marketing](https://wordpress.org/plugins/tags/email-marketing/)
   [gated content](https://wordpress.org/plugins/tags/gated-content/)[lead capture](https://wordpress.org/plugins/tags/lead-capture/)
 *  [Advanced View](https://wordpress.org/plugins/g-wiz-it-content-locker/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/g-wiz-it-content-locker/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/g-wiz-it-content-locker/reviews/)

## Contributors

 *   [ Graham Becker ](https://profiles.wordpress.org/gbecker1983/)
 *   [ gwizit ](https://profiles.wordpress.org/gwizit/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/g-wiz-it-content-locker/)