Jump to content

[SOLUCIONADO] Redireccionar página según país


efer33

Recommended Posts

Buenos días:

 

Tengo montado un prestashop, con una multitienda, una que seria la pagina principal y otra que seria para fuera de españa con precios diferentes (internacional).

 

Pagina principal: www.misitio.com

Pagina fuera:      www.misitio.com/int

 

 

Lo que quisiera saber es como puedo hacer para que cuando se alguien acceda desde fuera de España le redireccione a la web www.misitio.com/int.

 

He probado a hacer esto en el index.php


include("config/geoiploc.php");
$ip = $_SERVER["REMOTE_ADDR"];
if (getCountryFromIP($ip)<>"ES"){
    header ("Location: https://www.misitio.com/int/en/");
}

require(dirname(__FILE__).'/config/config.inc.php');
Dispatcher::getInstance()->dispatch();

Tambien he probado a ponerlo en el config al final de todo

 

Pero no funciona, alguna idea de como podria hacerlo.

 

Gracias
 

geoiploc.zip

Edited by efer33 (see edit history)
Link to comment
Share on other sites

Prestashop incluye la opcion por defecto de geolocalizacion  geoip. Luego para redireccionar deberás hacerlo desde 

classes\controller\FrontController.php

en la funcion init

Deberia activar la geolocalizacion, pero donde pongo los redireccionamientos.

 

Gracias y perdón por las molestias

Link to comment
Share on other sites

En la funcion del archivo indicado en el anterior mensaje, debajo de parent:init

also asi por ejemplo:

 include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
 $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
 $record = geoip_record_by_addr($gi, Tools::getRemoteAddr()); 
  
switch($record->country_code){
     case 'FR' :
      header('Location: https://www.prestashop.com/');
        break;
    case 'DE' :
      header('Location: https://www.prestashop.com/forums');
        break;
    default:
        break;	
	  }	
		
Link to comment
Share on other sites

 

En la funcion del archivo indicado en el anterior mensaje, debajo de parent:init

also asi por ejemplo:

 include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
 $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
 $record = geoip_record_by_addr($gi, Tools::getRemoteAddr()); 
  
switch($record->country_code){
     case 'FR' :
      header('Location: https://www.prestashop.com/');
        break;
    case 'DE' :
      header('Location: https://www.prestashop.com/forums');
        break;
    default:
        break;	
	  }	
		

Buenas tardes: Lo que probado pero me da un error 500

 

la página te ha redirigido demasiadas veces

 

No tendrá algo que ver con la multitenda y la url virtual de esta?

Edited by efer33 (see edit history)
Link to comment
Share on other sites

El ejemplo que te puse funciona sin problemas en un entorno que no es multitienda, para multitienda deberas condicionarlo a la tienda (id) establecida por defecto

 

Perdona las molestias, pero no te comprendo.

 

La Tienda por defecto, España el ID es 1 y la Fuera de España 4

 

Mil gracias por tu ayuda.

Link to comment
Share on other sites

Perdona las molestias, pero no te comprendo.

 

La Tienda por defecto, España el ID es 1 y la Fuera de España 4

 

Mil gracias por tu ayuda.

 

Lo que me he dado cuenta es que en la barra de direcciones, si pone la url a la que hay que redirigir, pero sale el error.

Link to comment
Share on other sites

Una de ellas estará configurada como shop por defecto, en la opción de configuración de la multitienda estará seleccionada la que esta por defecto, también en la base de datos de tu instalación en la tabla configuration estará el registro PS_SHOP_DEFAULT  con el id de la tienda seleccionada, esto sirve que puedas condicionar la redirección solo para la tienda por defecto

 if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT'))
Link to comment
Share on other sites

 

Una de ellas estará configurada como shop por defecto, en la opción de configuración de la multitienda estará seleccionada la que esta por defecto, también en la base de datos de tu instalación en la tabla configuration estará el registro PS_SHOP_DEFAULT  con el id de la tienda seleccionada, esto sirve que puedas condicionar la redirección solo para la tienda por defecto

 if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT'))

Muchas gracias, el código tiene quedar asi, no?

 

 

public function init()

    {

    ....

    parent::init();

        

    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');

    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);

    $record = geoip_record_by_addr($gi, Tools::getRemoteAddr());

    if($record->country_code<>"ES"){

        if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT')){

                //Redireccionamiento a pagina fuera ESPAÑA

        }

    }

    ....

}

 

El Tools::getValue('id_shop') no devuelve nada

 

Lo que tengo creado es el grupo y dentro del grupo las tiendas

Edited by efer33 (see edit history)
Link to comment
Share on other sites

Muchas gracias, el código tiene quedar asi, no?

 

 

public function init()

    {

    ....

    parent::init();

        

    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');

    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);

    $record = geoip_record_by_addr($gi, Tools::getRemoteAddr());

    if($record->country_code<>"ES"){

        if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT')){

                //Redireccionamiento a pagina fuera ESPAÑA

        }

    }

    ....

}

 

 

Lo que tengo creado es el grupo y dentro del grupo las tiendas

 

 

Muchas gracias, el código tiene quedar asi, no?

 

 

public function init()

    {

    ....

    parent::init();

        

    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');

    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);

    $record = geoip_record_by_addr($gi, Tools::getRemoteAddr());

    if($record->country_code<>"ES"){

        if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT')){

                //Redireccionamiento a pagina fuera ESPAÑA

        }

    }

    ....

}

 

 

Lo que tengo creado es el grupo y dentro del grupo las tiendas

 

Muchas gracias, el código tiene quedar asi, no?

 

 

public function init()

    {

    ....

    parent::init();

        

    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');

    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);

    $record = geoip_record_by_addr($gi, Tools::getRemoteAddr());

    if($record->country_code<>"ES"){

        if (Tools::getValue('id_shop') == Configuration::get('PS_SHOP_DEFAULT')){

                //Redireccionamiento a pagina fuera ESPAÑA

        }

    }

    ....

}

 

El Tools::getValue('id_shop') no devuelve nada

 

Lo que tengo creado es el grupo y dentro del grupo las tiendas

 

 

Ya he conseguido que funcione

Link to comment
Share on other sites

  • 1 year later...

Hola tengo el mismo problema como quedaría el código final por favor

 

Con este código se que es la base pero pasa esto

include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
 $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
 $record = geoip_record_by_addr($gi, Tools::getRemoteAddr()); 
  
switch($record->country_code){
     case 'CL' :
      header('Location: https://dominio.cl/');
        break;
    case 'US' :
      header('Location: https://dominio.us/');
        break;
    default:
        break;	
	  }

La idea es que si son de Chile los envie al dominio para Chile y si son de Usa que los envie al dominio de Usa si no son de ninguno de esos países los deje en la tienda que este, pueden ver la pagina pero como catalogo sin poder comprar solo me falta es esta redirección no quiero meterme con el archivo htaccess

1.png

Edited by raul
agregar datos (see edit history)
Link to comment
Share on other sites

Encontré este código en la red pero no se si esta bien o donde colocarlo probé  en FrontController.php en los lugares mencionados en este tema pero lo máximo que logre fue una redireccion desde el dominio.us  al domio.cl pero al tratar de entrar al dominio.us con ip de usa de igual forma me envia al dominio.cl  el código es este.

 public function hookDisplayHeader()
    {
        $this->redirect();
        
    }

 

public function redirect(){    
    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
    $records = geoip_record_by_addr($gi, Tools::getRemoteAddr());
    $URL_P = $_SERVER['REQUEST_URI'];
    $pais = $records->country_code;
    //comprobamos el pais y añadimos toda EU en una sola variable CE o EU
    if ($pais == 'AD' | $pais == 'AT' |
        $pais == 'BE' | $pais == 'BG' |
        $pais == 'HR' | $pais == 'CY' |
        $pais == 'CZ' | $pais == 'DK' |
        $pais == 'EE' | $pais == 'FI' |
        $pais == 'FR' | $pais == 'DE' |
        $pais == 'GR' | $pais == 'HU' |
        $pais == 'IS' | $pais == 'IE' |
        $pais == 'IT' | $pais == 'LT' |
        $pais == 'LU' | $pais == 'MT' |
        $pais == 'NL' | $pais == 'NO' |
        $pais == 'PL' | $pais == 'RO' |
        $pais == 'SK' | $pais == 'SI' |
        $pais == 'SE' | $pais == 'CH' |
        $pais == 'TR' ){
            $pais = 'CE';
        }

       // Comprobamos que el usuario que ha conectado no un un "agente" o bot, de esta manera no vamos a redirigir a
       // a los bots de google googlebot|AdsBot-Google|Googlebot-Image|Googlebot-News|Google-Structured-Data-Testing-Tool|pagespeed|insights|
       // ni a otros bots conocidos, en esta lista solo hay algunos

       if  (isset($_SERVER['HTTP_USER_AGENT'])  && preg_match('/BotLink|ahoy|AlkalineBOT|anthill|appie|arale|araneo|AraybOt|ariadne|arks|ATN_Worldwide|Atomz
            |bbot|Bjaaland|Ukonline|borg\-bot\/0\.9|boxseabot|bspider|calif|christcrawler|CMC\/0\.01|combine|confuzzledbot|CoolBot|cosmos|
            Internet Cruiser Robot|cusco|cyberspyder|cydralspider|desertrealm, desert realm|digger|DIIbot|grabber|downloadexpress|DragonBot|
            dwcp|ecollector|ebiness|elfinbot|esculapio|esther|fastcrawler|FDSE|FELIX IDE|ESI|fido|H�m�h�kki|KIT\-Fireball|fouineur|Freecrawl|
            gammaSpider|gazz|gcreep|golem|googlebot|AdsBot-Google|Googlebot-Image|Googlebot-News|Google-Structured-Data-Testing-Tool|pagespeed|insights|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|iajabot|INGRID\/0\.1|Informant|
            InfoSpiders|inspectorwww|irobot|Iron33|JBot|jcrawler|Teoma|Jeeves|jobo|image\.kapsi\.net|KDD\-Explorer|ko_yappo_robot|label\-grabber|
            larbin|legs|Linkidator|linkwalker|Lockon|logo_gif_crawler|marvin|mattie|mediafox|MerzScope|NEC\-MeshExplorer|MindCrawler|udmsearch|moget|
            Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|sharp\-info\-agent|WebMechanic|NetScoop|newscan\-online|ObjectsSearch|Occam|Orbsearch\/1\.0|
            packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|Getterrobo\-Plus|
            Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Search\-AU|searchprocess|Senrigan|Shagseeker|sift|SimBot|Site Valet|skymob|
            SLCrawler\/2\.0|slurp|ESI|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|nil|suke|http:\/\/www\.sygol\.com|tach_bw|TechBOT|
            templeton|titin|topiclink|UdmSearch|urlck|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|crawlpaper|wapspider|WebBandit\/1\.0|
            webcatcher|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|WebMoose|webquest|webreaper|webs|webspider|WebWalker|wget|winona|whowhere|wlm|WOLP|WWWC|none|XGET|
            Nederland\.zoek|AISearchBot|woriobot|NetSeer|Nutch/i', $_SERVER['HTTP_USER_AGENT'] ) ){
       
       }else {  // Si no es un Bot o agente conocido se redirigira segun el pais              
            $dominiourl =$_SERVER['SERVER_NAME'];
            switch ($pais) {
                case 'ES':
                    if ($dominiourl != 'dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'usa.dominio.com')
                        header("Location: https://dominio.com".$URL_P."");
                    break;
                case 'PT':
                    if ($dominiourl != 'dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'uk.dominio.com || $dominiourl == 'usa.dominio.com')
                        header("Location: https://dominio.com".$URL_P."");
                    break;
                case 'CE' :
                    if ($dominiourl != 'ce.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'usa.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://ce.dominio.com".$URL_P."");
                    break;
                case 'US':
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
                case 'GB' :
                    if ($dominiourl != 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'usa.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://uk.dominio.com".$URL_P."");
                    break;
                case 'AU':
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
                default :
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
            } 
        }
}

Tengo 2 días ya tratando de buscarle una solución funcional para poder usar multitienda por país agregando una redireccion usando geolocalizacion  geoip que trae por defecto

Edited by raul
editar el codigo (see edit history)
Link to comment
Share on other sites

Con este código logro hacer una redireccion desde el dominio.us al dominio.cl pero por lo que mire es una simple redireccion por dominio de defecto y no esta detectando la ip del país porque al tratar de entrar al dominio.us con ip de usa me envia de igual forma al dominio.cl

 

include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
     $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
     $record = geoip_record_by_addr($gi, Tools::getRemoteAddr()); 
  
             
            $dominiourl =$_SERVER['SERVER_NAME'];
            switch ($pais) {
                case 'CL':
                    if ($dominiourl != 'dominio.cl' || $dominiourl == 'dominio.us')
                        header("Location: https://dominio.cl".$URL_P."");
                    break;
                case 'US':
                    if ($dominiourl != 'dominio.us' || $dominiourl == 'dominio.cl')
                        header("Location: https://dominio.us".$URL_P."");
                    break;
                default :
                    if ($dominiourl != 'dominio.cl' || $dominiourl == 'dominio.us')
                        header("Location: https://dominio.cl".$URL_P."");
                    break;
            } 

 

Link to comment
Share on other sites

Hola,

El codigo que has puesto es algo generico por lo que se ve. fijate que pone dominio.XX, deberias cambiarlo por tu dominio

por ejemplo

google.cl, google.com

prestashop.com, prestashop.,cl

Ademas el codigo esta preparado para Europa, si es para Chile y todo el resto del mundo deberia ser asi

Recuerda cambiar tudominio.cl por el tuyo

He mirado y el ISO de chile no lo tengo claro, añade al codigo un echo

Haz un "echo $pais" para mostrar el ISO

 

public function redirect(){    
    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
    $records = geoip_record_by_addr($gi, Tools::getRemoteAddr());
    $URL_P = $_SERVER['REQUEST_URI'];
    $pais = $records->country_code;
     
       if  (isset($_SERVER['HTTP_USER_AGENT'])  && preg_match('/BotLink|ahoy|AlkalineBOT|anthill|appie|arale|araneo|AraybOt|ariadne|arks|ATN_Worldwide|Atomz
            |bbot|Bjaaland|Ukonline|borg\-bot\/0\.9|boxseabot|bspider|calif|christcrawler|CMC\/0\.01|combine|confuzzledbot|CoolBot|cosmos|
            Internet Cruiser Robot|cusco|cyberspyder|cydralspider|desertrealm, desert realm|digger|DIIbot|grabber|downloadexpress|DragonBot|
            dwcp|ecollector|ebiness|elfinbot|esculapio|esther|fastcrawler|FDSE|FELIX IDE|ESI|fido|H�m�h�kki|KIT\-Fireball|fouineur|Freecrawl|gammaSpider|gazz|gcreep|golem|googlebot|AdsBot-Google|Googlebot-Image|Googlebot-News|Google-Structured-Data-Testing-Tool|pagespeed|insights|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|iajabot|INGRID\/0\.1|Informant|
            InfoSpiders|inspectorwww|irobot|Iron33|JBot|jcrawler|Teoma|Jeeves|jobo|image\.kapsi\.net|KDD\-Explorer|ko_yappo_robot|label\-grabber|
            larbin|legs|Linkidator|linkwalker|Lockon|logo_gif_crawler|marvin|mattie|mediafox|MerzScope|NEC\-MeshExplorer|MindCrawler|udmsearch|moget|
            Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|sharp\-info\-agent|WebMechanic|NetScoop|newscan\-online|ObjectsSearch|Occam|Orbsearch\/1\.0|
            packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|Getterrobo\-Plus|
            Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Search\-AU|searchprocess|Senrigan|Shagseeker|sift|SimBot|Site Valet|skymob|
            SLCrawler\/2\.0|slurp|ESI|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|nil|suke|http:\/\/www\.sygol\.com|tach_bw|TechBOT|
            templeton|titin|topiclink|UdmSearch|urlck|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|crawlpaper|wapspider|WebBandit\/1\.0|
            webcatcher|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|WebMoose|webquest|webreaper|webs|webspider|WebWalker|wget|winona|whowhere|wlm|WOLP|WWWC|none|XGET|
            Nederland\.zoek|AISearchBot|woriobot|NetSeer|Nutch/i', $_SERVER['HTTP_USER_AGENT'] ) ){
       
       }else {  // Si no es un Bot o agente conocido se redirigira segun el pais              
            $dominiourl =$_SERVER['SERVER_NAME'];
            
            switch ($pais) {
                case 'CL':
                    if ($dominiourl != 'tudominio.cl')
                        header("Location: https://tudominio.cl".$URL_P."");
                    break;
                default :
                    if ($dominiourl != 'tuotrodominio.us')
                        header("Location: https://tuotrodominio.us".$URL_P."");
                    break;
            }
            
            
        }
}

como solo son 2 dominios, el de clile y otro en vez de usar un swith podrías usar un if

            if($pais == 'CL'){
                if ($dominiourl != 'tudominio.cl' )
                        header("Location: https://tudominio.cl".$URL_P."");
            }else{
                if ($dominiourl != 'tuotrodominio.us')
                        header("Location: https://tuotrodominio.us".$URL_P."");
            }

 

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...