Geo-Based Redirects in GT Link Manager

  • KPrevious lesson
  • FSearch lessons
  • EscClear search

Geo based redirects in WordPress let one short link serve different destinations per country: US visitors to your American storefront, UK visitors to the British one, everyone else to the default. Since version 1.7.0, GT Link Manager ships this as a built-in feature, so start there. This lesson covers when the built-in rules are the right tool, and keeps the original code snippet for anyone on an older version or with detection needs the built-in methods don’t cover.

Use the built-in feature first

GT Link Manager 1.7.0 added native geolocation targeting: enable it in GT Links → Settings, then build country rules per link in a visual rule builder with ordered rules, one-click market presets, an EU group covering all 27 member states, per-rule status codes, and a rule preview. No code required. The geolocation targeting lesson covers it end to end.

The built-in feature replaces this snippet for nearly every use case. Reach for the snippet below only if you’re pinned to a pre-1.7.0 version, or you need country detection from a source the plugin’s methods and the gtlm_geo_country filter can’t reach.

Requirements

  • GT Link Manager 1.5+ installed and active (on 1.7.0+, prefer the built-in feature above)
  • CloudFlare (free tier is sufficient) for automatic country detection via the CF-IPCountry header, OR a hosting provider that sets geo headers

Installation

  • Add the snippet below to your theme’s functions.php or a site-specific plugin
  • No constants to configure — geo mappings are stored per-link in the Notes field
  • Ensure CloudFlare is active on your domain, or that your host provides geo headers

How to Use

Edit any link in GT Link Manager and add country-specific URLs in the Notes field using this format:

geo:US = https://example.com/us-store
geo:GB = https://example.com/uk-store
geo:DE = https://example.com/de-store
geo:FR = https://example.com/fr-store

Use ISO 3166-1 alpha-2 country codes (two uppercase letters). Visitors from a matching country get the localized URL. Everyone else gets the default destination.

The Code

<?php
/**
 * GT Link Manager - Geo-Based Redirects
 *
 * Redirect users to different URLs based on their country.
 * Best used with CloudFlare (free tier provides the CF-IPCountry header).
 *
 * How it works:
 * - Store country-specific URLs in the link's "notes" field:
 *     geo:US = https://example.com/us-store
 *     geo:GB = https://example.com/uk-store
 *     geo:DE = https://example.com/de-store
 * - If the visitor's country matches, they get the localized URL.
 * - Everyone else gets the default destination.
 *
 * Country detection priority:
 * 1. CloudFlare CF-IPCountry header (most reliable, free)
 * 2. WordPress geo headers from hosting (e.g., Flavor, Flavor Starter)
 *
 * Uses the `gtlm_redirect_url` filter.
 */

defined( 'ABSPATH' ) || exit;

add_filter( 'gtlm_redirect_url', 'gtlm_geo_redirect', 10, 3 );

/**
 * Override redirect URL based on visitor's country.
 *
 * @param string $url   Default target URL.
 * @param array  $link  Link data.
 * @param string $slug  Matched slug.
 * @return string Possibly modified URL.
 */
function gtlm_geo_redirect( string $url, array $link, string $slug ): string {

	$notes = $link['notes'] ?? '';
	if ( empty( $notes ) ) {
		return $url;
	}

	// Parse geo:XX = URL from notes.
	$geo_urls = [];
	foreach ( explode( "\n", $notes ) as $line ) {
		$line = trim( $line );
		if ( preg_match( '/^geo:([A-Z]{2})\s*=\s*(.+)$/i', $line, $m ) ) {
			$geo_urls[ strtoupper( $m[1] ) ] = esc_url_raw( trim( $m[2] ) );
		}
	}

	if ( empty( $geo_urls ) ) {
		return $url;
	}

	// Detect country.
	$country = gtlm_geo_detect_country();
	if ( ! $country ) {
		return $url;
	}

	return $geo_urls[ $country ] ?? $url;
}

/**
 * Detect the visitor's country code (ISO 3166-1 alpha-2).
 *
 * @return string|null Two-letter country code or null.
 */
function gtlm_geo_detect_country(): ?string {

	// CloudFlare (free tier).
	if ( ! empty( $_SERVER['HTTP_CF_IPCOUNTRY'] ) ) {
		$code = strtoupper( sanitize_text_field( $_SERVER['HTTP_CF_IPCOUNTRY'] ) );
		if ( strlen( $code ) === 2 && $code !== 'XX' ) {
			return $code;
		}
	}

	// Some hosts provide geo headers.
	$headers = [ 'HTTP_X_COUNTRY_CODE', 'GEOIP_COUNTRY_CODE', 'HTTP_X_GEO_COUNTRY' ];
	foreach ( $headers as $header ) {
		if ( ! empty( $_SERVER[ $header ] ) ) {
			$code = strtoupper( sanitize_text_field( $_SERVER[ $header ] ) );
			if ( strlen( $code ) === 2 ) {
				return $code;
			}
		}
	}

	return null;
}

How It Works

  • Uses the gtlm_redirect_url filter to modify the target URL before redirect
  • Parses geo:{COUNTRY_CODE} = {url} lines from the link’s Notes field
  • Detects the visitor’s country using (in priority order): CloudFlare CF-IPCountry header, X-Country-Code header, GEOIP_COUNTRY_CODE server variable, X-Geo-Country header
  • Returns the matching country’s URL, or the default URL if no match is found

Configuration Notes

CloudFlare’s free tier automatically adds the CF-IPCountry header to every request, making it the easiest and most reliable option for country detection. No additional CloudFlare configuration is needed.

You can combine geo-based and role-based redirects on the same link by adding both geo: and role: lines in the Notes field. The geo filter runs at the default priority, so you can control execution order if needed.

One more thing if you use this snippet: keep the link on 302, not 301. Browsers cache a 301 permanently, so a returning visitor stays pinned to whichever country they were in on their first click.

Geo targeting is one of the few cases where Amazon affiliates genuinely need it; combine it with UTM passthrough so campaign data survives the country split. The underlying filter is documented in hooks and filters, and the built-in feature lives in the geolocation targeting lesson.