Penting: Saya tidak ingin membeli ekstensi GeoIP. Saya memiliki situs web Magento 2.1.9 dengan pengaturan multi-situs dan multi-store. Saya memiliki situs web pengaturan untuk KSA, UEA, CHINA, MESIR dll. Dan di bawah setiap situs web setidaknya ada 2 tampilan Toko, misalnya, untuk KSA saya memiliki tampilan toko Arab dan Inggris.
Saya ingin menunjukkan kepada pengguna situs web menurut negaranya sesuai Alamat IP. mis., untuk pengguna yang mengakses dari KSA ar_sa (toko Arab - Arab Saudi harusnya default) serupa untuk pengguna dari UEA (ar_uae atau en_uae).
Saya telah melakukan pengkodean berikut sejauh ini dan berhasil mendapatkan negara dari alamat IP.
Ini etc/frontend/events.xml
file saya :
<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>
Dan ini milik saya 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();
}
}
Tetapi ini hanya mengubah nama toko dan bukan hal lain - seperti bahasa / mata uang atau tata letak.
sumber
Jawaban:
Saya menemukan dengan melihat switcher toko Magento default yang dipanggil {{url}}? ___ store = {{store_code}}. Jadi, Anda harus mengarahkan ulang pengguna ke url yang sama tetapi menambahkan parameter get yang berisi kode toko, mis
https://www.my-store.com/sofas?__store=france
Perhatikan bahwa deteksi lokasi dan pengarahan ulang PHP ini tidak akan berfungsi jika Anda berencana menggunakan teknologi caching seperti pernis yang saya pikir Anda harus. Jika Anda menggunakan pernis, maka Anda masih dapat menggunakan sebagian besar kode Anda tetapi harus dijalankan dari permintaan AJAX setelah halaman dimuat.
sumber