Magento 2.1.9: mudar de loja com base no país

10

Importante: não quero comprar nenhuma extensão GeoIP. Eu tenho um site Magento 2.1.9 com configuração de vários sites e várias lojas. Eu tenho um site de configuração para KSA, EAU, CHINA, EGIPTO etc., e em cada site há pelo menos duas visualizações de loja, por exemplo, para KSA, tenho visualizações de loja em árabe e inglês.

Quero mostrar ao usuário o site de acordo com o país dele, de acordo com o endereço IP. por exemplo, para usuários acessando do KSA, a ar_sa (loja da Arábia Saudita deve ser o padrão) da mesma forma para usuários dos Emirados Árabes Unidos (ar_uae ou en_uae).

Fiz a codificação a seguir até agora e obtive o país do endereço IP com sucesso.

Este é o meu etc/frontend/events.xmlarquivo:

<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>

E este é o meu 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();
    }
}

Mas isso altera apenas o nome da loja e não outras coisas - como idioma / moeda ou layout.

Abid Malik
fonte
basta usar o geoip fornecido gratuitamente no seu webstack, seja o módulo php-geoip ou geoip apache, e depois apenas redirecione os usuários para armazenar o código, como padrão magento MAGE_RUN_TYPE MAGE_RUN_CODE .... simples como 1 2 3
MagenX 4/18
i pode de alguma forma usar MAGE_RUN_TYPE e MAGE_RUN_CODE do módulo personalizado
Abid Malik
Você pode tentar a extensão abaixo, se for adequado para você: magedelight.com/magento-2-extensions/… Espero que esteja funcionando bem para você.
Himmat Paliwal
@AbidMalik você conseguiu alguma solução.? Por favor, compartilhe aqui. Eu também preciso do mesmo
Pergunte Bytes
@AskBytes - não, eu ainda estou vagando.
Abid Malik

Respostas:

0

Eu descobri olhando para o comutador de lojas padrão do Magento que ele chama {{url}}? ___ store = {{store_code}}. Então você teria que redirecionar o usuário para o mesmo URL, mas adicionando o parâmetro get contendo o código da loja, por exemplohttps://www.my-store.com/sofas?__store=france

Observe que essa detecção de localização e redirecionamento do PHP nunca funcionará se você planeja usar uma tecnologia de cache como verniz, que eu acho que deveria. Se você usa verniz, ainda pode usar a maior parte do seu código, mas ele precisa ser executado a partir de uma solicitação AJAX após o carregamento da página.

デ リ エ ゴ く ん
fonte
i pode de alguma forma usar MAGE_RUN_TYPE e MAGE_RUN_CODE do módulo personalizado
Abid Malik