Important: je ne souhaite acheter aucune extension GeoIP. J'ai un site Web Magento 2.1.9 avec une configuration multi-sites et multi-magasins. J'ai configuré un site Web pour KSA, les Émirats arabes unis, la Chine, l'Égypte, etc. et sous chaque site Web, il y a au moins 2 vues de magasin, par exemple, pour KSA, j'ai des vues de magasin en arabe et en anglais.
Je veux montrer à l'utilisateur le site Web en fonction de son pays selon l'adresse IP. par exemple, pour les utilisateurs accédant à partir de KSA, l'ar_sa (magasin arabe - arabie saoudite doit être par défaut) de même pour les utilisateurs des EAU (ar_uae ou en_uae).
J'ai fait le codage suivant jusqu'à présent et j'ai réussi à obtenir le pays de l'adresse IP.
Voici mon etc/frontend/events.xml
dossier:
<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>
Et voici mon 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();
}
}
Mais cela ne change que le nom du magasin et pas d'autres choses - comme la langue / devise ou la mise en page.
la source
Réponses:
J'ai trouvé en regardant le commutateur de magasin par défaut de Magento qu'il appelle {{url}}? ___ store = {{store_code}}. Vous devrez donc rediriger l'utilisateur vers la même URL mais en ajoutant le paramètre get contenant le code du magasin, par exemple
https://www.my-store.com/sofas?__store=france
Notez que cette détection PHP de l'emplacement et de la redirection ne fonctionnera jamais si vous prévoyez d'utiliser une technologie de mise en cache comme le vernis, ce que je pense que vous devriez. Si vous utilisez du vernis, vous pouvez toujours utiliser la plupart de votre code, mais il doit être exécuté à partir d'une demande AJAX après le chargement de la page.
la source