Importante: no quiero comprar ninguna extensión GeoIP. Tengo un sitio web Magento 2.1.9 con configuración de múltiples sitios y múltiples tiendas. Tengo un sitio web de configuración para KSA, EAU, CHINA, EGIPTO, etc. y en cada sitio web hay al menos 2 vistas de la Tienda, por ejemplo, para KSA tengo vistas de la tienda en árabe e inglés.
Quiero mostrarle al usuario el sitio web según su país según la dirección IP. por ejemplo, para los usuarios que acceden desde KSA, ar_sa (la tienda árabe - Arabia Saudita debería ser la predeterminada) de manera similar para los usuarios de EAU (ar_uae o en_uae).
Hice la siguiente codificación hasta ahora y obtuve el país de la dirección IP con éxito.
Este es mi etc/frontend/events.xml
archivo:
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='urn:magento:framework/Event/etc/events.xsd'>
<event name='controller_action_predispatch'>
<observer name='Asoft_GeoIP_Redirect' instance='Asoft\GeoIP\Observer\Redirect' />
</event>
</config>
Y esta es mi Observer/Redirect.php
:
namespace Asoft\GeoIP\Observer;
class Redirect implements \Magento\Framework\Event\ObserverInterface
{
protected $_objectManager;
protected $_storeManager;
protected $_curl;
public function __construct(
\Magento\Framework\ObjectManagerInterface $objectManager,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\HTTP\Client\Curl $curl
) {
$this->_objectManager = $objectManager;
$this->_storeManager = $storeManager;
$this->_curl = $curl;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
//echo 'You are browsing from : '.$this->getCountryName();
switch ($this->getCountryName()){
case 'UAE':
$store_id = '11';
break;
default :
$store_id = '7';
}$this->_storeManager->setCurrentStore($store_id);
}
public function getCountryName()
{
$visitorIp = $this->getVisitorIp();
$url = "freegeoip.net/json/".$visitorIp;
$this->_curl->get($url);
$response = json_decode($this->_curl->getBody(), true);
//echo '<pre>';
//print_r($response);
$countryCode = $response['country_code'];
$countryName = $response['country_name'];
$stateName = $response['region_name'];
return $countryCode;
}
function getVisitorIp()
{
$remoteAddress = $this->_objectManager->create('Magento\Framework\HTTP\PhpEnvironment\RemoteAddress');
return $remoteAddress->getRemoteAddress();
}
}
Pero esto solo cambia el nombre de la tienda y no otras cosas, como el idioma / moneda o el diseño.
fuente
Respuestas:
Al observar el conmutador de tienda predeterminado de Magento, descubrí que llama {{url}}? ___ store = {{store_code}}. Por lo tanto, tendría que redirigir al usuario a la misma URL pero agregando el parámetro get que contiene el código de la tienda, por ejemplo
https://www.my-store.com/sofas?__store=france
Tenga en cuenta que esta detección PHP de ubicación y redireccionamiento nunca funcionará si planea usar una tecnología de almacenamiento en caché como el barniz, que creo que debería. Si usa barniz, aún puede usar la mayor parte de su código, pero debe ejecutarse desde una solicitud AJAX después de cargar la página.
fuente