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

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

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