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.

updated on 2 October 2019

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 :

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

    Reply to this message

  • Compatible googlemap3 ?

    Reply to this message

  • 1
    Gil FOURGEAUD

    Bonjour,

    Quid de la compatibilité avec GoogleMap API V3 ?

    • Je viens de modifier la contribution pour la rendre compatible avec spip 2.1

    Reply to this message

  • Gil FOURGEAUD

    Bonjour.

    Auid de la compatibilité avec GoogleMap V3 ?

    Reply to this message

  • Gil FOURGEAUD

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

    Reply to this message

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

    Reply to this message

  • Gil FOURGEAUD

    Bonjour,

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

    -  > “Trouver les dates proches de chez vous ...”

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom