Géolocaliser les articles en fonction de l’ip de l’internaute qui se connecte à votre site

Remerciements : CM, Sam, Florence HENRY

Objectif : Géolocaliser les articles en fonction de l’ip de l’internaute qui se connecte à votre site.

Prérequis : Avoir installé le plugin GIS et avoir géolocalisé les articles de votre site en fonction des lieux qu’ils évoquent
Avoir créé un compte sur http://ipinfodb.com et avoir récupéré l’API key.

Possible : Vous êtes lecteur d’un quotidien régional. La page d’accueil du site du journal affiche en priorité les articles qui concernent votre canton.

Exemple en ligne : Géolocalisez les livres proches de chez vous http://www.bibliosurf.com/spip.php?page=jeu_de_cartesbis.

Méthode

1. Copier les fonctions suivantes dans le fichier mes_fonctions.php

function get_url_contents($url){
       $crl = curl_init();
       $timeout = 5;
       curl_setopt ($crl, CURLOPT_URL,$url);
       curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
       curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
       $ret = curl_exec($crl);
       curl_close($crl);
       return split("\n", $ret);
}

 $ip = $_SERVER['REMOTE_ADDR'];
 $xml = get_url_contents("http://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=" . $ip);

  $latitude = preg_replace("/<\/?Latitude>/", "", $xml[9]);
  $longitude = preg_replace("/<\/?Longitude>/", "", $xml[10]);

Cette fonction utilise le site http://ipinfodb.com pour récupérer la latitude et la longitude de l’IP qui se connecte au site.

function balise_LATITUDE($p){
   $ip = $p->param[0][1][0]->texte ;
   $p->code = "calculer_balise_LATITUDE($ip)";
   $p->interdire_scripts = false;
   return $p;
}

function calculer_balise_LATITUDE() {
   $xml = get_url_contents("http://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=" . $_SERVER['REMOTE_ADDR']);
  $latitude = preg_replace("/<\/?Latitude>/", "", $xml[9]);
   return round($latitude, 1);
}


function balise_LONGITUDE($z){
   $ip = $z->param[0][1][0]->texte ;
   $z->code = "calculer_balise_LONGITUDE($ip)";
   $z->interdire_scripts = false;
   return $z;
}

function calculer_balise_LONGITUDE() {
   $xml = get_url_contents("ttp://api.ipinfodb.com/v2/ip_query.php?key=<your_api_key>&ip=" . $_SERVER['REMOTE_ADDR']);
  $longitude = preg_replace("/<\/?Longitude>/", "", $xml[10]);
   return round($longitude, 1);
}

Ces fonctions transforment la valeur du code PHP en balise spip en l’occurrence #LATITUDE et #LONGITUDE.

2. Copier le code suivant dans votre squelette

#SET{demi_precision, 0.3} 
#SET{lat_min, #LATITUDE|moins{#GET{demi_precision}}}
#SET{lat_max, #LATITUDE|plus{#GET{demi_precision}}}
#SET{long_min, #LONGITUDE|moins{#GET{demi_precision}}}
#SET{long_max, #LONGITUDE|plus{#GET{demi_precision}}}

<BOUCLE_gis(spip_gis){lat >= #GET{lat_min}}
                     {lat <= #GET{lat_max}}
                     {lonx >= #GET{long_min}}
                     {lonx <= #GET{long_max}}>

Vous pouvez élargir ou diminuer le périmètre de la géolocalisation en modifiant la valeur 0.3.

On fait la requête sur la table SPIP_GIS pour obtenir les #ID_ARTICLE correspondant au périmètre de la géolocalisation. (Attention à partir de SPIP 2.1, le nom de la table s’écrit comment il est saisi dans la base en l’occurrence spip_gis).

suite du code

<BOUCLE_bis(ARTICLES){id_article}{pagination}>
   <a href="#URL_ARTICLE">
   #TITRE
   </a>
</BOUCLE_bis>
       <div>#PAGINATION{precedent_suivant}</div>
 </B_bis>
         Il n'y a pas encore d'article géolocalisé proche de chez vous. 
 <//B_bis>

</BOUCLE_gis>

NB :Cette boucle est bien sûr à modifier en fonction de vos attentes d’affichage des données.

Discussion

7 discussions

  • Bonjour,

    Je trouve cette contrib intéressante, mais je rencontre un soucis pour la mettre en œuvre.

    En SPIP 2.1 et PHP5, je récolte le message :

    Deprecated: Function split() is deprecated in /var/www/rictus/squelettes/mes_fonctions.php

    que j’ai traité en remplaçant

     return split(« \n », $ret) ;

    par

    return preg_split(« /\n/ », $ret) ;

    , ce qui à fait taire le message, mais dont j’ignore si ça fait bien la même chose

    Le problème c’est que les balise #LONGITUDE et #LATITUDE ne sont pas initialisées, ce qui est quand même l’intérêt principal du mécanisme.

    Je trouve étonnant cette accolade fermante anticipée dans la fonction get_url_contents. N’y a t’il pas un problème de syntaxe ?

    Merci à toute personne maitrisant PHP d’être bien sympa de jeter un oeil.

    Répondre à ce message

  • Compatible googlemap3 ?

    Répondre à ce message

  • 1
    Gil FOURGEAUD

    Bonjour,

    Quid de la compatibilité avec GoogleMap API V3 ?

    Répondre à ce message

  • Gil FOURGEAUD

    Bonjour.

    Auid de la compatibilité avec GoogleMap V3 ?

    Répondre à ce message

  • Gil FOURGEAUD

    Dommage, cela serait très intéressant ... appel à contributeurs donc ...

    Répondre à ce message

  • A ma connaissance, on ne peut pas géolocaliser les évènements.

    Répondre à ce message

  • Gil FOURGEAUD

    Bonjour,

    Quelqu’un a-t-il adapté ce plugin pour l’agenda SPIP ?

    -  > « Trouver les dates proches de chez vous ... »

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom

Dernière modification de cette page le 11 juin 2012