0Localisation of Amazon Affiliates links

I occasionally reference products on my various websites, and usually link them to Amazon for anyone interested in buying them. A long time ago I used to link with an amazon affiliates link but never earned anything from it as my typical readership is well distributed around the world. Unfortunately Amazon don’t provide a way to redirect visitors to their local amazon site whilst retaining to affiliates payments. There are various solutions out there but all the ones I found had issues with them, so I developed my own.

I could develop it into a plugin for release if there is sufficient demand. In the meantime, the code is below. You will need to make some modifications to make it match your site address and your amazon affiliates codes

<?php
/**
* Plugin Name: Amazon Affiliates Redirect
* Plugin URI: https://diymediahome.org/
* Description: Redirects all amazon affiliates links to a local amazon store depending on visitors location.
* Version: 1.0
* Author: Jon P Scaife
* Author URI: https://jonscaife.com
* License: GPL12
*/
function process_link()
{
$debug=false;

//Detect visitor location from IP

if (isset($_SERVER['HTTP_CLIENT_IP']))
{
$real_ip_address = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$real_ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$real_ip_address = $_SERVER['REMOTE_ADDR'];
}

function curl_get_contents($url)
{
$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);

$data = curl_exec($ch);
curl_close($ch);

return $data;
}

$iptolocation = 'http://ip-api.com/php/' . $real_ip_address;
$ipreply = @unserialize(curl_get_contents($iptolocation));
$iplocation = $ipreply['countryCode'];

//Detect visitor language from browser

$browserlang= substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

//Detect language of page visitor is using

if (isset($_GET['lang']))
{
$userlang= $_GET['lang'];
}
else
{
$userlang= "EN";
}

//was a link passed

if (isset($_GET['addr']))
{
$original_link= $_GET['addr'];
}

//Decide best amazon site based on data detected

$linkpartone= $_GET['creativeASIN'];

switch ($iplocation)
{
case 'GB':
        $link="https://www.amazon.co.uk/dp/".$linkpartone."/ref=nosim?tag=dimeho-21";
        break;
case 'IE':
        $link="https://www.amazon.co.uk/dp/".$linkpartone."/ref=nosim?tag=dimeho-21";
break;
case 'US':
        $link="https://www.amazon.com/dp/".$linkpartone."/ref=nosim?tag=jonstech-20";
break;
case 'CA':
        $link="https://www.amazon.ca/dp/".$linkpartone."/ref=nosim?tag=dimeho-20";
break;
case 'CN':
        $link="https://www.amazon.cn/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'HK':
        $link="https://www.amazon.cn/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'MO':
        $link="https://www.amazon.cn/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'IN':
        $link="https://www.amazon.in/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'JP':
        $link="https://www.amazon.co.jp/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'FR':
        $link="https://www.amazon.fr/dp/".$linkpartone."/ref=nosim?tag=Dimeho02-21";
break;
case 'CH':
        $link="https://www.amazon.fr/dp/".$linkpartone."/ref=nosim?tag=Dimeho02-21";
break;
case 'BE':
        $link="https://www.amazon.fr/dp/".$linkpartone."/ref=nosim?tag=Dimeho02-21";
break;
case 'MC':
        $link="https://www.amazon.fr/dp/".$linkpartone."/ref=nosim?tag=Dimeho02-21";
break;
case 'LU':
        $link="https://www.amazon.fr/dp/".$linkpartone."/ref=nosim?tag=Dimeho02-21";
break;
case 'DE':
        $link="https://www.amazon.de/dp/".$linkpartone."/ref=nosim?tag=dimeho0f-21";
break;
case 'CZ':
        $link="https://www.amazon.de/dp/".$linkpartone."/ref=nosim?tag=dimeho0f-21";
break;
case 'IT':
        $link="https://www.amazon.it/dp/".$linkpartone."/ref=nosim?tag=diymediahome-21";
break;
case 'NL':
        $link="https://www.amazon.nl/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'ES':
        $link="https://www.amazon.es/dp/".$linkpartone."/ref=nosim?tag=diymediahom05-21";
break;
case 'MX':
        $link="https://www.amazon.com.mx/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'AU':
        $link="https://www.amazon.com.au/dp/".$linkpartone."/ref=nosim?tag=";
break;
case 'BR':
        $link="https://www.amazon.com.br/dp/".$linkpartone."/ref=nosim?tag=";
break;
default:
$link="https://www.amazon.com/dp/".$linkpartone."/ref=nosim?tag=jonstech-20";
}


if($debug==true)
{
echo "1. $iplocation.  2. $browserlang.  3. $userlang.  4. $link";
}
else
{
header('Location: '.$link);
die();
}

}
if (isset($_GET['addr'])) process_link();

//create filter to replace amazon links with internal redirect inc a random code to prevent caching

function modify_amazon_affiliate_links($content)
{
$content= str_replace('<a rel="nofollow" href="https://www.amazon', '<script>var ran_var= Math.random();</script><a style="background: none;" rel="nofollow" onclick="location.href=this.href+\'?ran=\'+ran_var;return false;" target="_blank" href="https://jonscaife.com/wp-content/plugins/amazon-affiliates-redirect.php?addr=', $content);
return str_replace('<a href="https://www.amazon', '<script>var ran_var= Math.random();</script><a style="background: none;" rel="nofollow" onclick="location.href=this.href+\'?ran=\'+ran_var;return false;" target="_blank" href="https://jonscaife.com/wp-content/plugins/amazon-affiliates-redirect.php?addr=', $content);
}
add_filter( 'the_content', 'modify_amazon_affiliate_links' )

?>

Note – the code is currently early draft.  It works, but it doesn’t make use of some of the detection that it can do.  It doesn’t have a settings page for the associate IDs, and it uses a hardcoded site address, rather than an invisible redirect.  It DOES however use client-side javascript to generate a unique redirect url every time to prevent any caching systems from causing incorrect location detection.

What do you think? Drop us a comment below! If you would like to subscribe please use the subscribe link on the menu at the top right. You can also share this with your friends by using the social links below. Cheers.

Leave a Reply