Wichtig: Ich möchte keine GeoIP-Erweiterung kaufen. Ich habe eine Magento 2.1.9-Website mit Multi-Site- und Multi-Store-Setup. Ich habe eine Website für KSA, VAE, CHINA, ÄGYPTEN usw. eingerichtet und unter jeder Website befinden sich mindestens 2 Store-Ansichten, z. B. für KSA habe ich arabische und englische Store-Ansichten.
Ich möchte dem Benutzer die Website gemäß seinem Land gemäß IP-Adresse anzeigen. Beispiel: Für Benutzer, die über KSA zugreifen, ist der ar_sa (Arabisch - Saudi-Arabien-Store sollte Standard sein) ähnlich wie für Benutzer aus den VAE (ar_uae oder en_uae).
Ich habe bisher die folgende Codierung durchgeführt und das Land erfolgreich von der IP-Adresse erhalten.
Das ist meine etc/frontend/events.xml
Datei:
<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>
Und das ist mein 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();
}
}
Dies ändert jedoch nur den Geschäftsnamen und keine anderen Dinge - wie Sprache / Währung oder Layout.
quelle
Antworten:
Beim Betrachten des Magento-Standardspeicherumschalters habe ich festgestellt, dass er {{url}}? ___ store = {{store_code}} aufruft. Sie müssten den Benutzer also zur gleichen URL umleiten, aber den get-Parameter hinzufügen, der den Geschäftscode enthält, z
https://www.my-store.com/sofas?__store=france
Beachten Sie, dass diese PHP-Erkennung von Standort und Umleitung niemals funktionieren wird, wenn Sie eine Caching-Technologie wie Lack verwenden möchten, die Sie meiner Meinung nach sollten. Wenn Sie Lack verwenden, können Sie den größten Teil Ihres Codes weiterhin verwenden, dieser muss jedoch nach dem Laden der Seite aus einer AJAX-Anforderung ausgeführt werden.
quelle