Magento Asked on January 6, 2022
I have 3 websites in my current Magento installation and are as follows website1 Code: base
, website2 Code: au
, website3 Code: ca
. Each website has one store
and one store_view
except for website3 which has 2 store-views
.
I want the users to be automatically navigated to a specific website based on their country. For example, all users with the country code US
to be navigated to website1.
I have checked that ipinfo.io provides country code through an API call as follow
# Get country ISO code as plaintext
$ curl ipinfo.io/8.8.8.8/country?token=$TOKEN
US
Can anyone help with its implementation for my Magento 2.2.6 instance?
I've had the same issue, I'm using geoplugin to get the country of my customers ip address. I also have a cookie just in case the customer after being redirected to a store let's say in Portuguese actually prefers to use the English version, I store a value in the cookie so the customer doesn't get redirected back to the Portuguese version. Let me know if you need any further assistance and don't forget to upvote / mark as answer if this solved your problem :)
In your etcevents.xml
<event name="controller_action_postdispatch">
<observer name="controller_action_postdispatch" instance="VendorModuleObserverPostDespatchEvent" />
</event>
In your VendorModuleObserverPostDespatchEvent.php
<?php
namespace VendorModuleObserver;
use MagentoFrameworkEventObserverInterface;
use MagentoStoreModelStoreManagerInterface;
use MagentoFrameworkAppHelperAbstractHelper;
use MagentoFrameworkAppConfigScopeConfigInterface;
use MagentoFrameworkStdlibCookieCookieMetadataFactory;
use MagentoFrameworkStdlibCookieManagerInterface;
use MagentoFrameworkSessionSessionManagerInterface;
class PostDespatchEvent implements ObserverInterface
{
/**
* Name of Cookie that holds private content version
*/
CONST COOKIE_NAME = 'COOKIE_DEFAULT_LANG_CUSTOM';
/**
* Cookie life time
*/
CONST COOKIE_LIFE = 3600;
/**
* @var MagentoFrameworkStdlibCookieManagerInterface
*/
protected $_storeManager;
protected $cookieManager;
protected $cookieMetadataFactory;
private $scopeConfigInterface;
protected $checkoutSession;
protected $cart;
protected $customerSession;
public function __construct(
StoreManagerInterface $storeManager,
ScopeConfigInterface $scopeConfigInterface,
CookieManagerInterface $cookieManager,
CookieMetadataFactory $cookieMetadataFactory,
SessionManagerInterface $sessionManager,
MagentoCheckoutModelSession $checkoutSession,
MagentoCheckoutModelCart $cart,
MagentoCustomerModelSession $customerSession
) {
$this->_storeManager = $storeManager;
$this->scopeConfigInterface = $scopeConfigInterface;
$this->cookieManager = $cookieManager;
$this->cookieMetadataFactory = $cookieMetadataFactory;
$this->sessionManager = $sessionManager;
$this->checkoutSession = $checkoutSession;
$this->cart = $cart;
$this->customerSession = $customerSession;
}
public function getCookie($name)
{
return $this->cookieManager->getCookie($name);
}
public function setCookie($value, $duration = 604800)
{
$metadata = $this->cookieMetadataFactory
->createPublicCookieMetadata()
->setDuration($duration)
->setPath($this->sessionManager->getCookiePath())
->setDomain($this->sessionManager->getCookieDomain());
$this->cookieManager->setPublicCookie(self::COOKIE_NAME, $value, $metadata);
}
public function execute(MagentoFrameworkEventObserver $observer)
{
$cookie = self::getCookie(SELF::COOKIE_NAME);
if(!isset( $cookie))
{
$countryCode = SELF::ip_info("Visitor", "Country Code");
if($countryCode == 'PT')
{
$this->_storeManager->setCurrentStore('default');
}
else
{
if($countryCode == 'DE')
{
$this->_storeManager->setCurrentStore('DE');
}
else
{
$this->_storeManager->setCurrentStore('EN');
}
}
self::setCookie( SELF::COOKIE_NAME);
}
}
public static function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
$output = NULL;
if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
$ip = $_SERVER["REMOTE_ADDR"];
if ($deep_detect) {
if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
}
$purpose = str_replace(array("name", "n", "t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
$support = array("country", "countrycode", "state", "region", "city", "location", "address");
$continents = array(
"AF" => "Africa",
"AN" => "Antarctica",
"AS" => "Asia",
"EU" => "Europe",
"OC" => "Australia (Oceania)",
"NA" => "North America",
"SA" => "South America"
);
if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
$ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp"));
if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
switch ($purpose) {
case "location":
$output = array(
"city" => @$ipdat->geoplugin_city,
"state" => @$ipdat->geoplugin_regionName,
"country" => @$ipdat->geoplugin_countryName,
"country_code" => @$ipdat->geoplugin_countryCode,
"continent" => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
"continent_code" => @$ipdat->geoplugin_continentCode
);
break;
case "address":
$address = array($ipdat->geoplugin_countryName);
if (@strlen($ipdat->geoplugin_regionName) >= 1)
$address[] = $ipdat->geoplugin_regionName;
if (@strlen($ipdat->geoplugin_city) >= 1)
$address[] = $ipdat->geoplugin_city;
$output = implode(", ", array_reverse($address));
break;
case "city":
$output = @$ipdat->geoplugin_city;
break;
case "state":
$output = @$ipdat->geoplugin_regionName;
break;
case "region":
$output = @$ipdat->geoplugin_regionName;
break;
case "country":
$output = @$ipdat->geoplugin_countryName;
break;
case "countrycode":
$output = @$ipdat->geoplugin_countryCode;
break;
}
}
}
return $output;
}
}
?>
Answered by Joao71 on January 6, 2022
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP