Важно: я не хочу покупать какие-либо расширения GeoIP. У меня есть веб-сайт Magento 2.1.9 с настройкой нескольких сайтов и нескольких магазинов. У меня есть настроенный веб-сайт для KSA, ОАЭ, КИТАЯ, ЕГИПЕТА и т. Д., И под каждым веб-сайтом по крайней мере 2 просмотра магазина, например, для KSA у меня есть арабские и английские представления магазина.
Я хочу показать пользователю веб-сайт в соответствии с его страной согласно IP-адресу. например, для пользователей, получающих доступ из KSA, ar_sa (по умолчанию арабский - хранилище в Саудовской Аравии) аналогично для пользователей из ОАЭ (ar_uae или en_uae).
До сих пор я выполнил следующее кодирование и успешно получил страну с IP-адреса.
Это мой etc/frontend/events.xml
файл:
<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>
И это мое 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();
}
}
Но это меняет только название магазина, а не другие вещи, такие как язык / валюта или макет.
источник
Ответы:
Посмотрев на переключатель хранилища Magento по умолчанию, я обнаружил, что он вызывает {{url}}? ___ store = {{store_code}}. Таким образом, вам придется перенаправить пользователя на тот же URL-адрес, но добавить параметр get, содержащий код хранилища, например
https://www.my-store.com/sofas?__store=france
Обратите внимание, что это обнаружение и перенаправление в PHP никогда не сработает, если вы планируете использовать технологию кэширования, такую как лак, что, я думаю, вам следует. Если вы используете лак, то вы все равно можете использовать большую часть своего кода, но его необходимо выполнить из запроса AJAX после загрузки страницы.
источник