Changelogs

Follow the improvements and fixes in each product release.

Products

Recent Releases

Permalink

GT Performance 1.0.8

Correctness release. Everything here is a defect a site could hit without opting into anything, or a claim the shipped documents made that was not true.

Fixed

  • The managed Cloudflare Cache Rule instructed the edge to cache responses the origin marks no-store, private. cloudflare.edge_ttl now defaults to 0, so the rule compiles as respect_origin. A positive lifetime still compiles as override_origin, but the expression is then narrowed to requests with no query string, because overriding the origin cannot be made safe for the unbounded set of query parameters the origin refuses.
  • Trashing, unpublishing, or renaming a post never cleared its cached page. The save_post handler returns early for posts that are not publicly viewable, and a status change reaches it with the new status already applied, so a withdrawn page kept returning 200 for the rest of its stale window.
  • Saving settings orphaned the whole cache. generation is part of the cache key and is bumped on every save; nothing deleted the now-unreachable entries.
  • The capture pipeline ran when no page-cache drop-in was installed, which is the state directly after activation.
  • A full purge deleted the .htaccess and index.html that keep the cache directory unreadable from the web.
  • The private-fragments AJAX endpoint was registered even when the feature was off.

Removed

  • The WordPress revision limit control. It filtered wp_revisions_to_keep unconditionally at 5 on every activation, whether or not its own module was enabled, discarding revision history irreversibly on the next save.
  • The X-GT-Performance-Bypass request header. Its reason code claimed a signature that nothing ever computed or verified, so any client could force a full uncached render on every request.
  • The “Remove unused CSS” setting. The engine flattens native CSS nesting, drops @import stylesheets, prunes escaped utility class names, and runs during the visitor request; the damage was silent and cached. Define GTPERF_UNUSED_CSS in wp-config.php to run it anyway. It returns as a supported feature once generation moves out of the request and the differential safety net lands.
  • Multisite activation. One compiled config and one cache root are shared across a network, so the last subsite to save decided every other subsite’s cache behavior.

Added

  • LICENSE, and a Third-party libraries section disclosing the three bundled MIT libraries.
  • Update URI: false, so nothing claiming the unclaimed gt-performance directory slug can push a package to existing installs.
  • A golden-file HTML regression fixture, and a Plugin Check job in CI that runs against the built ZIP rather than the working tree.
  • Upgrade Notice entries, including the one 1.0.4 shipped without.

Changed

  • Documentation no longer describes WordPress.org as the update authority. The plugin is not listed in the directory yet.
Permalink

GT Link Manager 1.8.1

What’s Changed

  • New: a copy button on the Branded URL column. It appears when you hover the row or focus it with the keyboard, copies the full branded link, and confirms with an inline Copied badge that clears itself.
  • New: the plugin’s own icon now appears in the admin menu, replacing the generic WordPress link dashicon. It is painted as a mask filled with the menu’s own text colour, so it matches the icons beside it in every state and every admin colour scheme, staying light on dark sidebars and dark on light ones.
  • Updated: refreshed the WordPress.org plugin icon.

= 1.8.0 = = 1.8.1 = Adds a hover-and-click copy button to the Branded URL column and the plugin’s own icon in the admin menu, plus an expanded readme and FAQ. No database changes.

Commits

  • Release 1.8.1: copy button, brand menu icon, expanded readme (ead0ff0)

Full Changelog: https://github.com/wpgaurav/gt-link-manager/compare/v1.8.0…v1.8.1

Permalink

GT Link Manager 1.8.0

What’s Changed

  • Fixed: the links table collapsed narrow columns when many were shown at once. With every column visible, Mode and Clicks were squeezed to a few pixels and their values wrapped one character per line. Every column now has a minimum width, the wide ones wrap instead of being clipped, and the table scrolls sideways on its own rather than stretching the admin page.
  • New: Optional click counting, off by default. Turn it on under Settings and each link gets a running total of how many times it has been followed, shown as a sortable Clicks column and included in CSV export. It stores one number per link and nothing else — no IP address, user agent, referrer, or timestamp — and the count is written after the redirect has already been sent, so the redirect itself is not slowed down. The plugin’s suggested privacy-policy text updates itself to match whichever setting you choose. Use gtlm_count_click to skip clicks you do not want counted.
  • Fixed: a deleted, trashed, or deactivated short link returned HTTP 200 with the site’s front page instead of a 404. The prefix rewrite rule matches the whole namespace, so an unresolved slug fell through to the home page, and search engines could index every dead link as duplicate front-page content. Unresolved prefixed links now return a real 404 rendered by the theme’s own template. Direct and regex mode still fall through untouched, and the gtlm_404_on_missing_link filter restores the old behaviour.
  • Fixed: rel values separated by spaces were silently discarded. The plugin writes space-separated rel into Link headers and core Button blocks, but only accepted commas on input, so round-tripping a value emptied it. Commas, spaces, and arrays are all accepted now, and the allowed-token validation is unchanged.
  • Fixed: the Active, Inactive, and Trash views were implemented but never rendered, leaving them reachable only by typing the URL by hand. They now appear above the links table.
  • Fixed: bulk actions ran while the page rendered, which gave no confirmation message and re-ran the action on a browser refresh. They now run before output and redirect to a clean URL with a result message.
  • New: Undo. Trashing, restoring, activating, and deactivating a link now offer a one-click Undo in the success notice, for single links and bulk selections alike.
  • New: Trash retention. Links left in the Trash can be permanently deleted after a configurable number of days, set under Settings. New installs start at 30 days. Existing sites are left at 0 (keep forever) on upgrade, so nothing already sitting in your Trash is deleted because you updated; switch it on yourself when you want it.
  • New: Empty Trash button on the Trash view.
  • Improved: the admin screens now inherit the WordPress admin surface instead of painting over it. Custom admin colour schemes, high-contrast mode, and reduced-motion preferences are all respected.
  • Improved: accessibility. Row checkboxes and every filter dropdown have proper labels, keyboard focus is visible, and the notice area sits where WordPress expects it.
  • Improved: long URLs no longer break across three lines in the links table. The Branded URL column shows the readable path, with the full URL on hover and in the Copy URL action.
  • Improved: a fresh install now records its schema version during activation instead of re-running the migration on the first admin page load.
  • Compatibility: Tested against WordPress 7.1. Verified on a WordPress 7.1 and PHP 8.4 install: redirects, geolocation targeting, the REST API, CSV import and export, the links list table, and both block editor inserters all behave as before, with no deprecation notices raised.
  • Compatibility: Confirmed the GT Link format and the core Button control still work inside the iframed block editor canvas, including search, insertion, and rel handling.

= 1.7.1 = = 1.8.0 = Tested with WordPress 7.1. Fixes a soft 404 that made every dead, trashed, or deactivated short link return the site’s front page at HTTP 200, and fixes space-separated rel values being silently dropped. Adds optional click counting (off by default), Undo for trash and status changes, optional automatic Trash cleanup (off for existing sites, so nothing in your Trash is deleted by updating), and an accessibility and native-UI pass on the admin screens. Adds one column to the links table on upgrade; existing links are untouched.

Commits

  • Release 1.8.0: WordPress 7.1 support, redirect fixes, trash undo, click counting (b120a8c)

Full Changelog: https://github.com/wpgaurav/gt-link-manager/compare/v1.7.1…v1.8.0

Permalink

GT Performance 1.0.7

Fixed

  • The gtperf_private_island shortcode now escapes the fragment fallback where it is returned. The fallback was already filtered through wp_kses_post() inside the fragment registry, so the rendered output is unchanged, but the escaping was applied in a different class and was not visible at the point of output.

Changed

  • The release package no longer contains the extensionless command line wrappers that Composer packages ship in their own bin/ directories, such as matthiasmullie/minify/bin/minifyjs and bin/minifycss. WordPress.org does not permit them, and the minifier library itself is unaffected.
  • bin/build-package.sh now fails the build when the staged package contains a file type the plugin directory does not permit, instead of producing an archive that is rejected on review.
Permalink

GT Performance 1.0.6

Added

  • Separate controls for the main feed and the secondary feeds. “Disable secondary feeds only” keeps /feed/ serving and indexable while returning a 404 for comment feeds (site-wide and per post), category, tag, custom taxonomy, author, date, search, and post type archive feeds. “Remove secondary RSS feed links” keeps the main feed’s discovery link in the document head and removes the rest. The existing all-or-nothing controls are unchanged and still win when enabled: “Disable every RSS feed” blocks the main feed too, and “Remove every RSS feed link” removes every discovery link.

Changed

  • The gauravtiwari.org WordPress preset now applies the two secondary-feed controls instead of removing every feed discovery link, so the main feed stays discoverable and indexable.
Permalink

GT ACF Blocks Plugin 2.11.1

What’s Changed

Fixed

  • Callout labels ignored the colour the block was given, and every one of them failed contrast. .acf-callout-label carried a hardcoded color:#d4a600 that never varied with the block’s own callout_bgColor or callout_textColor, and four style variations replaced it with literals that were just as uncoupled. Across 501 labelled callouts on 272 posts, 500 of the 500 evaluable labels came in under 4.5:1 — none passed. The mustard sat at 2.17:1 on #f0fdf4 (172 blocks) and 2.09:1 on #eff6ff (131), and a “Warning” label on #f8d7da bottomed out at 1.70:1. The label now resolves to currentColor, inheriting the callout’s own text colour, which authors already pick to pair with the background: 415 of 415 blocks carrying explicit colours now pass, and the 85 with none fall back to the theme’s own --acfb-text on --acfb-bg pair. The Dark and Dashed Dark variants keep their --acfb-star label, which is token-based and already correct on a dark ground.
  • Custom border-color could not override a variation’s border. Highlight, Dashed Light, and Dashed Dark set border as a shorthand, so a block supplying only callout_borderColor kept the variation’s width and style and changed nothing but the hue — a Highlight callout with custom colours rendered a 3px dashed border it never asked for, on top of the 1px solid the base rule intended. The three variations now set border-width, border-style, and border-color as longhands so a per-block colour lands without dragging the rest of the shorthand with it.
  • Highlight and Testimonial opted out of dark mode. Both hardcoded their surface (#f0fff0 and #fdf6e3) instead of deriving it from --acfb-bg, so they stayed bright on a dark page while every other callout followed the theme. Both now tint the token with color-mix(), which reproduces the previous light-mode surface to within a couple of values and yields a correspondingly dark tint in dark mode. Highlight’s → list marker keeps its green.

Notes

  • Callout registers style as an array in block.json, so WordPress inlines the bytes rather than linking a URL. There is no asset URL to bust here; page caches need a purge for the change to appear on already-cached HTML.

Commits

  • 2.11.1: callout labels inherit the block’s text color (543e820)

Stats

  • Commits: 1
  • Changes: 8 files changed, 25 insertions(+), 15 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
Permalink

GT ACF Blocks Plugin 2.11.2

Fixed

  • The URL Preview button was white-on-white in dark mode. .acf-url-preview__button fills with background:var(--acfb-text) and wrote its label in var(--acfb-text-invert). Those two are only inverses of each other in light mode: --acfb-text-invert aliases --color-button-text, which MD deliberately holds at white in both schemes so it stays legible on the saturated --color-button fill, while --acfb-text flips to a light value for dark. Measured on a live page, the button rendered #FFFFFF on #E4E4E4, a contrast ratio of 1.27:1 against the 4.5:1 AA floor, while light mode was fine at 16.09:1. The Featured variant inherited the same label color under an --acfb-text gradient fill. Seven published posts and pages carry URL Preview blocks; every button on them was affected.
  • Dark callouts had the same defect, latent. .acf-callout.is-style-dark also fills with --acfb-text and set its body text, its links, and its button links in --acfb-text-invert, so the box inverted into a light panel with white text wherever dark mode was on. No published post currently uses the variation, so nothing shipped broken, but the rule was wrong in the same way.

Added

  • --acfb-on-text, the companion to --acfb-text used as a background, mirroring how --acfb-on-primary companions --acfb-button. It resolves to --color-content-bg, which is the true inverse of --color-text and flips under both the [data-theme] toggle and the prefers-color-scheme fallback, so a single :root declaration covers both paths and no dark-mode override is required. The five affected rules now use it: the URL Preview button and its :hover, and the Dark callout’s base, link, and button-link rules. Dark mode measures 13.69:1 after the change, light mode is untouched at 16.09:1.

--acfb-text-invert keeps its meaning and its 41 remaining consumers across 17 stylesheets, all of which pair it with a saturated accent or brand fill where white is the correct choice. Redefining it for dark would have fixed these five rules and put those at risk, so it was left alone. Reach for --acfb-on-text whenever --acfb-text is the background, and --acfb-text-invert only on a brand-colored one.

Permalink

Core Forms 4.8.0

Core Forms now ships minified CSS and JavaScript, and only loads them where a form actually renders.

Changed

  • All first-party stylesheets and scripts are served minified on the front end and in the admin. Across the library that is 716 KB of CSS/JS down to 553 KB. forms.css drops 48%, forms.js 48%, smart-forms.js 52%.
  • Readable sources still ship alongside the minified files. Define SCRIPT_DEBUG or use the new cf_use_minified_assets filter to serve them instead.
  • Assets that arrive already minified (the webpack admin bundle, vendored Prism) are served as-is rather than duplicated in the package.

Added

  • Core_Forms\Assets resolves an asset path to the file that should be served, with cf_use_minified_assets as the escape hatch.
  • npm run build:assets regenerates the minified files; build.sh fails the build when they are stale.

Fixed

  • Page-level form detection now also inspects reusable blocks, widget areas, and block-theme template parts, so a form placed outside post content gets its stylesheets in <head> instead of after first paint. The template-part scan is cached and flushed on part save, delete, or theme switch.

Full changelog:

Permalink

GT Extensions for FluentCart 2.4.2

Load the External Product resolver only where a product can appear.

  • Its script and stylesheet were enqueued on every request, so about 11KB downloaded and a DOM scan ran on posts, pages, and the home page that never render a FluentCart button.
  • The decision now runs through the shared storefront check every other module already uses, so External Product also recognises the configured cart, checkout, shop and account pages and FluentCart shortcodes.
  • FluentCart blocks rendered outside post content, such as template parts and saved page blocks, still get the resolver.

Product pages, product archives and categories, the store pages, and any post embedding a FluentCart block or shortcode are unaffected.

Permalink

Alpha Chat 0.5.1

Full Changelog: https://github.com/wpgaurav/alpha-chat/compare/v0.5.0…v0.5.1

Permalink

GT Page Blocks Builder 2.8.0

  • The library shows what each block looks like. Every thumbnail was an empty frame: the preview document was escaped into an HTML attribute by a helper that handles &, < and > but not quotes, so each one was cut off at the quote in its own charset tag. Blocks with no markup to render — CSS-only token blocks, PHP-only blocks — say so instead of showing an empty rectangle, and thumbnails render at a desktop width and scale down, so a section built for 1200px shows the layout it actually produces.
  • Each block reports how many posts and pages place it, counted across both the editor block and the shortcode. That is the number that tells you whether a block is safe to delete. Counted in a single pass and cached, so a library of two hundred blocks does not mean two hundred table scans to draw one screen.
  • Bulk selection with duplicate, trash, restore and delete forever; sorting by recently updated, title, most used or least used; and a grid/list switch that remembers which you prefer. The shortcode is now a chip you can see and click to copy rather than an action that copied it silently.
  • Import in Page Settings is two buttons, add or replace, instead of one dialog whose Cancel meant “replace every section”. Only replace confirms, and it says how many blocks the builder cannot rebuild are about to go.
  • A Build button in the block editor saves the page and opens it in the visual builder. The builder reads from the database, so saving first is what keeps unsaved editor changes from being silently absent.
  • The library and settings screens now follow the admin around them: WordPress’ own status filters, search box, view switcher and row actions, real section headings instead of headings faked with table cells, and no inline styles left in the settings template.
  • Fixed: block toolbar buttons were two different heights, 26px and 29.6px, because one of them was never given a height — it inherited whatever the editor’s line-height produced, and WordPress 7 changed that. Both are pinned now, and the icons are 18px rather than 14px.
  • Fixed: the settings screen still documented the old md_ filter name for preview injection. It shows gt_page_blocks_builder_preview_injection.
Permalink

GT Page Blocks Builder 2.7.5

  • Fixed: the section panel vanished off the right edge once the AI assistant had filled the code editors. Nothing was hiding it — the builder had grown wider than the window, and the panel is the last column of that row. The code area was reporting its own content width as a minimum, which with the assistant open kept the whole builder above 1552px; a 14-inch laptop is 1512. It now fits from 1920px down to 1000px with the panel fully visible, and the tag-snippet toolbar scrolls inside its own bar instead.
  • Import in Page Settings is two buttons, Import & add and Import & replace. It was one button behind a dialog whose Cancel meant “replace every section” — the destructive choice sitting on the dismissive button. Only replace asks for confirmation, and it says how many blocks the builder cannot rebuild are about to be removed.
  • Page Settings opens with a count of what is on the page, reports the result of an import or export inline instead of through a browser alert, and stays open while you work. Exported files are named after the page rather than its post ID.
  • The AI model list keeps only the GPT-5.6 family: Sol, Terra and Luna. A site still set to an older model falls back to the default rather than sending one the API would reject.