Magento 2.1.9: Cambiar tienda según el país


10

Importante: no quiero comprar ninguna extensión GeoIP. Tengo un sitio web Magento 2.1.9 con configuración de múltiples sitios y múltiples tiendas. Tengo un sitio web de configuración para KSA, EAU, CHINA, EGIPTO, etc. y en cada sitio web hay al menos 2 vistas de la Tienda, por ejemplo, para KSA tengo vistas de la tienda en árabe e inglés.

Quiero mostrarle al usuario el sitio web según su país según la dirección IP. por ejemplo, para los usuarios que acceden desde KSA, ar_sa (la tienda árabe - Arabia Saudita debería ser la predeterminada) de manera similar para los usuarios de EAU (ar_uae o en_uae).

Hice la siguiente codificación hasta ahora y obtuve el país de la dirección IP con éxito.

Este es mi etc/frontend/events.xmlarchivo:

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

Y esta es mi 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();
    }
}

Pero esto solo cambia el nombre de la tienda y no otras cosas, como el idioma / moneda o el diseño.


simplemente use el geoip provisto libremente en su webstack, ya sea php-geoip o geoip apache module, luego simplemente redirija a los usuarios para almacenar el código, por defecto magento MAGE_RUN_TYPE MAGE_RUN_CODE ... simple como 1 2 3
MagenX

¿Puedo usar de alguna manera MAGE_RUN_TYPE y MAGE_RUN_CODE desde el módulo personalizado
Abid Malik

Puede probar la extensión a continuación si le conviene: magedelight.com/magento-2-extensions/… Espero que funcione bien para usted.
Himmat Paliwal

@AbidMalik, ¿obtuviste alguna solución? Por favor compártelo aquí. También necesito lo mismo
pregunte Bytes el

@AskBytes: no, todavía estoy deambulando.
Abid Malik

Respuestas:


0

Al observar el conmutador de tienda predeterminado de Magento, descubrí que llama {{url}}? ___ store = {{store_code}}. Por lo tanto, tendría que redirigir al usuario a la misma URL pero agregando el parámetro get que contiene el código de la tienda, por ejemplohttps://www.my-store.com/sofas?__store=france

Tenga en cuenta que esta detección PHP de ubicación y redireccionamiento nunca funcionará si planea usar una tecnología de almacenamiento en caché como el barniz, que creo que debería. Si usa barniz, aún puede usar la mayor parte de su código, pero debe ejecutarse desde una solicitud AJAX después de cargar la página.


¿Puedo usar de alguna manera MAGE_RUN_TYPE y MAGE_RUN_CODE desde el módulo personalizado
Abid Malik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.