Changelogs

Follow the improvements and fixes in each product release.

GT Link Manager

GT Link Manager is a WordPress plugin for managing affiliate links, redirects, and URL tracking from a centralized dashboard. It handles link cloaking, click analytics, category organization, and…

Explore Product

Release History

Permalink

1.9.0

  • Add opt-in Advanced Analytics with WordPress-time trends, referring-page and link reports, instant breakdown tabs, and CSV exports.
  • Keep analytics lightweight with no visitor scripts, cookies or beacons, bounded background processing, and configurable retention including Forever reports.
  • Simplify settings, improve accessibility and diagnostics, and add a copyable AI setup prompt.
  • Fix direct/regex REST paths, CSV roundtrips, redirect matching, and click-counter metadata.
  • Harden protected WordPress routes, CSV upload storage, and spreadsheet exports.

Full changelog

Permalink

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

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

1.7.1

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)

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

Permalink

1.7.0

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)

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

Permalink

1.6.1

What’s Changed

  • Fixed nonce mismatch bug — trash, restore, and permanent delete actions were failing due to inconsistent nonce prefixes.
  • Fixed potential ReDoS vulnerability — removed error suppression on regex pattern matching, added pattern length validation.
  • Standardized all nonce prefixes to gtlm_ across admin actions and list table.
  • Added REST API route descriptions to all endpoints for better discoverability.
  • Added object caching for admin category dropdown with proper invalidation on create, update, and delete.
  • Updated readme with free training course, developer reference, REST API guide, and new FAQ entries.

= 1.6.0 = = 1.6.1 = Fixes nonce mismatch bug affecting trash/restore/delete actions, hardens regex pattern validation, adds REST API descriptions and category caching.

Commits

  • Add 1.6.1 changelog and upgrade notice to readme (fc0c2af)
  • 1.6.1 (c6e0f85)

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

Permalink

1.6.0

What’s Changed

  • Added advanced redirects: Direct (prefix-free) and Regex (pattern-based) link modes.
  • Direct links redirect without the prefix — e.g., yoursite.com/my-page instead of yoursite.com/go/my-page.
  • Regex links match request paths against patterns with capture group substitution in destination URLs.
  • New “Enable Advanced Redirects” toggle in Settings (off by default) to opt in.
  • Link edit form shows mode selector (Standard / Direct / Regex) with contextual fields.
  • Conflict detection warns when direct link paths match existing WordPress posts or pages.
  • Regex patterns are validated on save; invalid patterns are rejected.
  • List table shows link mode with filter support.
  • REST API accepts and returns link_mode, regex_replacement, and priority fields.
  • New database columns: link_mode, regex_replacement, priority — fully backwards compatible.

= 1.5.3 = = 1.6.0 = Adds direct (prefix-free) and regex (pattern-based) redirect modes. Enable in Settings > Advanced Redirects. Fully backwards compatible.

Commits

  • Add advanced redirects: direct (prefix-free) and regex link modes, bump to 1.6.0 (fc691d9)

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

Permalink

1.5.3

What’s Changed

  • Fixed plugin zip size bloat — excluded .wordpress-org assets directory from distribution package.

Commits

  • Exclude .wordpress-org from dist zip, bump to 1.5.3 (9d8135b)

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

Permalink

1.5.2

What’s Changed

  • Added “Delete Data on Uninstall” setting — data is now preserved by default when the plugin is deleted.
  • Uninstall only removes tables and options if the user explicitly opts in via Settings.

= 1.5.1 = = 1.5.2 = Data is now preserved on uninstall by default. Enable “Delete Data on Uninstall” in Settings to remove all data.

Commits

  • Add opt-in data deletion on uninstall, bump to 1.5.2 (87f9b60)
  • added screenshots (6df05b4)

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

Permalink

1.5.1

Initial Release

First release of GT Link Manager v1.5.1.

Historical releasePermalink

1.4.0

  • Renamed internal code prefix from gt_ to gtlm_ (4+ characters) per WordPress.org guidelines.
  • Fixed nonce verification order in CSV import handler — nonce is now checked before reading POST data.
  • Fixed SQL injection vector — $orderby now uses %i identifier placeholder in prepared queries.
  • Added Source Code section to readme for compiled block editor assets.
  • Added card-based UI styling to all admin pages (edit link, categories, settings, import/export).
  • Settings page reorganized into General, Tools, and Diagnostics cards.
  • Clean uninstall now removes both old (gt_) and new (gtlm_) prefix options and tables.
Historical releasePermalink

1.3.1

  • Block editor: aligned GT Link popover anchoring with core rich text behavior using selection-based anchor.