23Ene 2012 9 Comments */?>

Detectar pais, provincia y ciudad de procedencia mediante la IP

Categorías: PHP, Recursos, Tips de wordpress, Tutoriales, Wordpress - Tags: ,

El tip de wordpress de hoy es para poder detectar y mostrar la ubicación de sus visitantes mediante la dirección IP de los mismos. Aunque este tip puede usarse para cualquier otro proyecto, hoy les voy a enseñar como integrarlo en wordpress.

Si todo es correcto, tu mi querido usuario deber estar ubicado en: Mar del Plata, Bs As, Argentina

Para ello vamos primero a crear un shortcode llamado “iplocation” que usaremos para mostrar los datos. Para ello en nuestro functions.php copiamos la siguiente función:

function mqw_iplocation( $atts , $content=null ) {
    return mqw_iplocation_func($_SERVER['REMOTE_ADDR']);
}
add_shortcode('iplocation', 'mqw_iplocation');

Por último la función que devuelve la ubicación mediante IP. Esta función la saque de http://snipplr.com/view/48386/detect-location-by-ip-city-state/ que usa un servicio gratuito llamado http://ipinfodb.com/ aunque existen de pago y mejores (más exactitud de los datos y mayor actualización de las IP).

function mqw_iplocation_func($ip) {
 
        $default = 'Mar del Plata, Bs As, Argentina';
 
        if (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost')
            $ip = '8.8.8.8';
 
        $curlopt_useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)';
 
        $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
        $ch = curl_init();
 
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION  => 1,
            CURLOPT_HEADER      => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_USERAGENT   => $curlopt_useragent,
            CURLOPT_URL       => $url,
            CURLOPT_TIMEOUT         => 1,
            CURLOPT_REFERER         => 'http://' . $_SERVER['HTTP_HOST'],
        );
 
        curl_setopt_array($ch, $curl_opt);
 
        $content = curl_exec($ch);
 
        if (!is_null($curl_info)) {
            $curl_info = curl_getinfo($ch);
        }
 
        curl_close($ch);
 
        if ( preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs) )  {
            $city = $regs[1];
        }
        if ( preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs) )  {
            $state = $regs[1];
        }
        if ( preg_match('{<li>Country : ([^<]*)</li>}i', $content, $regs) )  {
            $country = $regs[1];
        }
 
        if( $city!='' && $state!='' && $country !='' ){
          $location = $city . ', ' . $state . ', '. $country;
          return $location;
        }else{
          return $default; 
        }
 
}

Espero que les haya gustado. Saludos!!

Ahh me olvidaba, tan solo tienen que usar el shortcode de la siguiente manera:

[iplocation]

UPDATE:

Si lo que necesitas es un plugin ya realizado y que funcione 100% te recomiendo mirar estos 2 que son ideales para geolocalización en WordPress:

Geotargeting Lite – Versión gratuita que te permite esconder contenido dependiendo de que pais es un usuario.

Geotargeting Pro – Es la versión pro del plugin anterior que también permite esconder el contenido y filtarlo por ciudades y estados. Permite crear regiones de paises o ciudades para usar distintas combinaciones y permite esconder páginas enteras o productos de Woocommerce si así lo deseas. También incluye un set de shortcodes para mostrar diferente información del usuario.

Damián Logghe

Programador freelancer y emprendedor en sueños. Contento de ser mi jefe y poder hacer lo que me gusta. WordPress es mi principal fuente de ingreso y me escribo tanto para ayudar como para tener una guia de memoria. Quieres contratarme? Déjame un mensaje.

More Posts - Website

Follow Me:
TwitterFacebookLinkedInGoogle Plus

  • harold

    no me muestra el país de procedencia, puede decirme por qué?

    • Donde no te lo muestra? En este post, en tu web ? Más pistas por favor

  • Oto

    Muy interesante, Damián. Andaba yo buscando una solución wordpress y el cliente me pide que se detecte la geolocalización y entregue la web en su idioma… Este post seguro me ayudará

  • Me sale error, supongo que es debido a que hay algunas funciones php que no tengo activadas, por ejem: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set

    • masquewordpress

      Habla con tu hosting para que te activen curl

  • remanencia

    Si es bueno este tips para complementar proyectos que se requieran obtener datos de visitas para una web.
    Thank you

  • Nahuel

    Tengo mi sitio en wordpress y realizo publidad con google adwords, nesecito realizar lo de tu post quisiera que cada vez que le den clik a mi web me diera una ip para yo poder exclui la ip denro de la campaña de adwords y mi competencia no poder ver mi anuncio, es que me hacen unos 30 clik por dia y ni un llamado me dan 5 clik y 5 impresiones y el llamado nunca me llega. me podrias decir que puedo hacer?

  • Frank APG

    I don`t understand… How can I use the shortcode to see the info. print the info

  • Jorge Baffa

    Hola Damián.
    Estaba buscando una solución a ésto y di con tu blog
    ¿Sigue funcionando este ejemplo?
    Yo lo implementé en un plugin pero me devuelve siempre el default.
    Un saludo