Gatilab Products

Changelogs

Improvements, fixes, and the details behind each release.

All Products

Release history across our plugins and themes.

Stable

GT ACF Blocks Plugin 2.9.3

Read release notes

What's Changed

Added

  • Optional semantic fallback styles for minimal themes. Settings → ACF Blocks License → Theme Compatibility Styles can load a small zero-specificity stylesheet for common semantic HTML inside ACF blocks. It is disabled by default and loads in both the editor and frontend only when enabled.
  • Every rendered acf/* block now exposes a predictable .acf-block class for theme authors, whether or not the fallback stylesheet is enabled.

Changed

  • The Table of Contents block now inherits its visual design from the active theme. Removed plugin-defined backgrounds, colors, borders, radii, fixed type sizing/casing, link decoration, hover fills, spacing, custom markers, dark-mode overrides, and scrollbar styling.
  • Numbered, bulleted, and plain list modes remain explicit. Ordered and unordered lists use native theme-aware markers, while plain lists stay marker-free.
  • Sticky positioning, smooth scrolling, reduced-motion handling, active-section emphasis, and heading scroll offsets remain intact.
  • The Accordion block is now entirely theme-native. Its native <details>/<summary> behavior needs no plugin stylesheet, so the CSS asset and metadata references were removed.
  • Tabs now ship only structural, state, accessibility, responsive, and style-mode rules. Removed the plugin palette, light/dark overrides, opacity system, decorative fills, transition effects, container spacing, and forced typography while retaining all four tab treatments and panel switching.
  • Section block CSS now covers structure only. Removed inactive default palette, dark-mode, width, spacing, and container rules. The template now emits its scoped wrapper and alignment classes so user-selected video and overlay backgrounds layer correctly without imposing a design.

Commits

  • Release 2.9.3: inherit theme block styles (9b681c3)

Stats

  • Commits: 1
  • Changes: 24 files changed, 769 insertions(+), 113 deletions(-)

Plugin Info

  • Blocks included: 29
  • Requires WordPress: 6.0+
  • Requires PHP: 7.4+
  • Requires: ACF Pro 6.0+ or Secure Custom Fields

Installation

  1. Download acf-blocks-plugin-*.zip from the assets below
  2. Go to Plugins → Add New → Upload Plugin in WordPress admin
  3. Upload the zip file and activate
Stable
Read release notes

What's Changed

  • Fixed: The GT Link toolbar now works with the core Button block by updating the Button's native URL and rel attributes.
  • Improved: Rich text and Button controls now share the same GT Link search popover, normalize rel attributes, and preserve noopener for buttons that open in a new tab.

= 1.7.0 = = 1.7.1 = Fixes the GT Link inserter for the core Button block while preserving the Button block's native link settings.

Commits

  • Fix Core Button link inserter (f9bbe5a)
Beta

GT Performance 1.0.0-beta-6

Read release notes

Fixed

  • Made Redis object-cache writes request-local immediately, changed add() and replace() to atomic Redis NX/XX operations, and honored forced backend refreshes. Owned outdated object-cache drop-ins now update atomically on plugin boot without touching foreign drop-ins, then clear the exact alloptions, notoptions, and cron option-cache entries.
  • Added a Doctor warning for materially overdue scheduled events when request-driven WP-Cron is disabled. The warning provides a host-specific five-minute external flock runner and does not change DISABLE_WP_CRON.
  • Fixed wp gt-performance cloudflare purge, which previously fell through to Cloudflare rule synchronization without purging anything. It now supports a full-zone purge or one exact --page-url, reports Cloudflare API failures, and exits non-zero on invalid input.
  • Rejected unknown cache, queue, Cloudflare, database, and fleet actions before constructing services or performing work. Empty or malformed explicit URLs can no longer degrade into unintended full purges, nonnumeric queue limits now fail instead of processing an arbitrary batch, and action-specific options are no longer silently ignored.
  • Corrected the WP-CLI option documentation for action-based command families so WP-CLI can validate and display their positional actions consistently.
Stable

GT ACF Blocks Plugin 2.9.2

Read release notes

What's Changed

Changed

  • The migrator now strips the retired FAQ-schema flag from existing content. 2.9.1 made acf_accord_enable_faq_schema inert; this removes it (and its _acf_accord_enable_faq_schema field reference) from acf/accordion blocks when the migrator runs, so old posts no longer carry a key nothing reads.
  • Removals are reported under their own Retired FAQ schema flag removed category in the scan breakdown and per-post badges, rather than being folded into "Accordion fields fixed".

Notes

  • Expect a one-time jump in the migrator's affected-post count. Posts whose only issue is the stale flag now show up as needing migration. Rendering is unchanged either way — this is a data cleanup, not a fix for a visible bug, so it is safe to defer.
  • Accordion blocks with nothing to clean are left byte-identical and are not rewritten, so no post gains a revision for no reason.

Commits

  • 2.9.2: strip retired FAQ schema flag from existing content (b2b86b5)

Stats

  • Commits: 1
  • Changes: 5 files changed, 130 insertions(+), 14 deletions(-)

Plugin Info

  • Blocks included: 29
  • Requires WordPress: 6.0+
  • Requires PHP: 7.4+
  • Requires: ACF Pro 6.0+ or Secure Custom Fields

Installation

  1. Download acf-blocks-plugin-*.zip from the assets below
  2. Go to Plugins → Add New → Upload Plugin in WordPress admin
  3. Upload the zip file and activate
Stable

GT ACF Blocks Plugin 2.9.1

Read release notes

What's Changed

Removed

  • FAQ schema dropped from the Accordion block. Google no longer supports FAQ rich results, so acf/accordion no longer emits FAQPage JSON-LD and the "Enable FAQ Schema" field is gone from the block settings.
  • Existing posts need no migration: blocks that still carry acf_accord_enable_faq_schema set to 1 render normally, and the stored value is ignored — no schema is printed.
  • The block migrator no longer writes acf_accord_enable_faq_schema into blocks it converts.

The Accordion block itself is unchanged — same markup, same styles, still searchable by "FAQ" in the inserter.

Commits

  • 2.9.1: drop FAQ schema from accordion block (20c57e7)
  • Fix PHP 7.4 CI dependency resolution (2483e1d)

Stats

  • Commits: 2
  • Changes: 13 files changed, 76 insertions(+), 91 deletions(-)

Plugin Info

  • Blocks included: 29
  • Requires WordPress: 6.0+
  • Requires PHP: 7.4+
  • Requires: ACF Pro 6.0+ or Secure Custom Fields

Installation

  1. Download acf-blocks-plugin-*.zip from the assets below
  2. Go to Plugins → Add New → Upload Plugin in WordPress admin
  3. Upload the zip file and activate
Stable

Core Forms 4.7.1

Read release notes

Fixed

  • Standalone and fullscreen form pages no longer fall back to browser-default controls when the global or per-form built-in theme is disabled.
  • Standalone routes now always load the complete Core Forms design baseline and generated theme-token overrides because these pages do not render the active WordPress theme.

Changed

  • The default form theme now depends on the core form stylesheet so its layout primitives are always present.
  • Added regression coverage for standalone asset loading.
Stable

Core Forms 4.7.0

Read release notes

Core Forms 4.7.0 is the admin, design, migration, and Core Commerce release.

Highlights

  • Unified Core Forms, Submissions, Core Commerce, and Settings under one compact, responsive navigation.
  • Added a dedicated Form Theme Customizer with presets, live desktop/mobile preview, accessibility checks, and generated cache-versioned CSS.
  • Added selective portable JSON backup and restore for forms, submissions, polls, settings, analytics, and complete Core Commerce data.
  • Rebuilt Core Commerce around next actions, product readiness, customers, licenses, orders, and storefront publishing.
  • Added case-insensitive customer records with order, license, activation, and site metadata.
  • Added copy-ready product blocks and shortcodes plus single-product-page publishing guidance.
  • Replaced the all-submissions card grid with a searchable sortable table and improved responsive controls throughout the plugin.
  • Fixed starter-template previews, preview/frontend theme drift, Warm preset styling, LTR select arrows, checkbox alignment, and help text sizing.

Compatibility

  • WordPress 6.4 or newer
  • Tested through WordPress 6.8
  • PHP 8.1 or newer

Integrity

  • SHA-256: 9c4974ebe162f16790e7fc7c8927458473ca894b7abc2a57b20f13b9be537c4b
  • ZIP size: 1,097,202 bytes

Full public changelog: https://core-forms.com/changelog/

Stable

Core Forms 4.6.3

Read release notes

Core Forms 4.6.3 improves validation, licensing reliability, headless submissions, and the Core Forms admin experience.

  • Renames the Forms dashboard to Core Forms, adds the installed version badge, and renames Products & Licensing to Core Commerce.
  • Fixes schema and legacy-form validation, same-name choice groups, empty select placeholders, and invalid-submission rate-limit accounting.
  • Fixes headless REST error statuses, nonce-enforced submissions, array-field normalization, and canonical field descriptions.
  • Fixes Emailit v2 sends and contact subscriptions being marked failed after a valid HTTP 200 response.
  • Makes activation records self-healing, retries transient license requests, and preserves the local key when remote deactivation fails.
  • Removes the redundant one-page Core Commerce footer and misplaced card treatment.
Stable
Read release notes

What's Changed

  • New: Geolocation targeting. Any link can route visitors to a different destination based on their country, with rules evaluated in order and the first country match winning.
  • New: Country detection with zero dependencies. The country is read from request variables your CDN or web server already provides — Cloudflare (CF-IPCountry), CloudFront, Vercel, Google App Engine, nginx GeoIP2, Apache mod_geoip, mod_maxminddb, or a custom header you name. No GeoIP database file, no third-party API, no outbound request.
  • New: EU country group expands to all 27 member states in a single rule; extendable via gtlm_geo_country_groups.
  • New: Per-rule status codes, and a "show a 404" fallback for visitors matching no rule.
  • New: Geolocation settings section with a live "Detected Now" readout showing which country and source resolved for the current request — the fastest way to confirm your CDN is forwarding a country header.
  • New: "Check Detection" button. Lists every country header present on the request with its raw value, and runs a loopback self-test — it sends the site a request carrying a country header and reports what the plugin detected at the other end. That proves detection works even on a local or staging install with no CDN in front, where "no country on this request" is correct rather than a fault. Also validates a country code you type before you use it in a rule.
  • New: The detection readout distinguishes "nothing is proxying this site, so no country is expected" from "your CDN is in front but sent no country header" — only the second is a misconfiguration, and it now says how to fix it.
  • New: Rule builder in the link editor. Numbered rows show match precedence, rules can be reordered, one-click picks cover common markets (US + CA, EU, UK, India, AU + NZ), the long country list is filterable, selections show as removable chips, and the "Everyone else" fallback reads as the final row. It warns when a country is listed twice (only the highest rule can ever match) or when a rule has countries but no URL.
  • New: Rule preview. Pick a country and see exactly which rule wins and where it sends — evaluated in the browser against your unsaved edits, with no request made.
  • New: Privacy disclosure. The plugin registers a suggested privacy-policy section under Settings → Privacy → Policy Guide, and states inline that country detection reads only a CDN-provided header — never the visitor's IP address, never an external service, and the country is never stored or logged.
  • Fixed: a partial REST update (PATCH) of one field silently reset every field that was not included, because each write argument declared a schema default that WP_REST_Request materialises into the request. Sending only geo_rules would reset redirect_type to 301 — which quietly breaks geo targeting — and blank tags, notes, and rel. Omitted fields now keep their stored values. Create defaults are unchanged.
  • New: Optional X-GTLM-Country debug response header showing the detected country, its source, and whether a rule matched.
  • New: Geo rules are exposed in the REST API on /links (create, read, update) with a self-describing schema, so links can be geo-targeted programmatically. Posting geo_rules without geo_mode opts the link in automatically.
  • New: Geo rules round-trip through CSV import and export; a malformed rules cell is dropped without failing the row.
  • New: Geo column in the links list table, and geolocation status in Diagnostics.
  • Performance: geolocation costs nothing on links that do not use it — the check is a single array read, and country detection is never invoked unless a matched link opts in. Detection and settings are resolved once per request.
  • Note: geo-targeted links should use 302, not 301. A 301 is cached by the browser permanently, which pins a visitor to whichever country they were in on their first click. The link editor warns when a geo link is set to 301.
  • Note: a country header can be forged on requests that reach your site without passing through your CDN, so the 404 fallback is not a security control. Behind Cloudflare, CF-IPCountry is rewritten at the edge and cannot be spoofed; the "Cloudflare only" detection method is the strictest setting.

= 1.6.1 = = 1.7.0 = Adds geolocation targeting: route each link by visitor country using the header your CDN already sends — no GeoIP database, no external API, no added latency. Two columns are added to the links table automatically on upgrade; existing links are untouched and keep redirecting exactly as before. Enable it under GT Links → Settings → Geolocation Targeting.

Commits

  • Deploy the bare version to WordPress.org, not the tag name (03e7b9f)
  • Add geolocation targeting, bump to 1.7.0 (d45326c)
  • Add Playground blueprint for wp.org Live Preview (6ea77f0)
Beta

GT Performance 1.0.0-beta-5

Read release notes

Changed

  • Moved the everyday operations — purge GT cache, Cloudflare sync, and the two drop-in installers — from the Tools tab onto the dashboard. Purging after a content change no longer takes a detour, and the installers are visible during setup, which is exactly when they are needed. Tools keeps runtime drop-in status and database maintenance. Each operation now remembers which screen it was run from and returns there instead of always landing on Tools.

Fixed

  • Stale pages are now rebuilt instead of being served indefinitely. Nothing regenerated an entry between fresh_ttl and stale_ttl: the drop-in served the stale body and exited, and a preload request received that same stale body, so the only escape from the stale window was stale_until expiring. A live site measured 1,011 of 1,023 cached pages stale, median age 14.3 hours. The queue now sweeps for stale entries on each scheduled run and enqueues preloads, and the drop-in treats a stale entry as a miss when the request carries X-GT-Preload, so those preloads actually rebuild the page. Batches are capped at 5 per run — matching what the queue drains per tick, since enqueue() does not deduplicate — and skipped entirely while a preload backlog is still pending, so the job table cannot grow faster than it clears. The cap is filterable via gt_performance_revalidate_batch.
  • Fixed the Redis object cache silently flushing nothing. flush() and flush_group() build a SCAN MATCH pattern from the key prefix, which defaults to WP_CACHE_KEY_SALT — a random string that regularly contains [, ?, or *, all glob metacharacters. An unclosed [ makes the pattern match zero keys, so both calls deleted nothing and still returned true; a live site's wp cache flush reported success while the entries stayed in Redis. Literal prefixes are now escaped before use in a pattern.
  • Re-arm the queue cron when the scheduled event is missing. Activator schedules it once at activation and nothing restored it if it was later lost, which stops the queue permanently: purges never preload, warms never run, stale pages are never rebuilt. A production site was found with the event absent and jobs pending for seven days.
  • Invalidate a rebuilt page's metadata in the opcode cache. The drop-in reads metadata with include, so a refreshed entry could be read back with its previous timestamps until opcache revalidated — and never, on a host running opcache.validate_timestamps=0.
  • Wrapped the Redis object cache's SCAN loop in the same error handling every other Redis call already had. It was the one unguarded call in the drop-in, so a mid-scan disconnect raised an uncaught RedisException through group flushes and took the request down with a fatal instead of degrading to a cache miss. The loop is now bounded as well, so a driver that returns without advancing the cursor cannot spin.
Stable

Core Forms 4.6.2

Read release notes

A public Storefront API for headless storefronts, plus a block editor and builder preview that finally look like the real form.

Added

  • Added a public, read-only Storefront REST API for static sites and external product embeds, exposing active-only product and plan data with resolved icons, hosted checkout URLs, filters, pagination, CORS, caching, and ETags.
  • The form skeleton (forms.css) and default theme (form-theme.css) now load inside the Block Editor canvas, so the Core Form block preview matches the published page instead of rendering unstyled.

Changed

  • The License Issuing Server no longer takes over an existing /checkout/ page it does not own. When that slug is already taken it provisions /core-checkout/ instead, leaving WooCommerce and hand-built checkout pages untouched.
  • Replaced every DOING_AJAX constant check with wp_doing_ajax(), which is filterable and the supported API.
  • Removed the orphaned AllSubmissionsTable::forms_dropdown() and ::date_filters() methods.

Fixed

  • Fixed the form builder preview pane painting unstyled before restyling itself. Its stylesheets were enqueued from a wp_head callback at priority 10, after core prints styles at priority 8, so they only ever reached the footer's late-style pass.
  • Fixed the form builder preview request not being recognised as containing a form, which let the unused-asset cleanup dequeue the preview's own stylesheets.
  • Corrected several inaccurate PHPDoc return types reported to callers and tooling, and declared Form::$id as the read-only alias __get() already served.
  • The licensing maintenance cron callback no longer returns its summary array to do_action().

Note: 4.6.1 was prepared but never published, so its changes are folded into this release and no v4.6.1 tag exists.

Requires: WordPress 6.4+ · PHP 8.1+ · Tested up to WordPress 6.8