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.
Discussions par date d’activité
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 :
que j’ai traité en remplaçant
par
, 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
Bonjour,
Quid de la compatibilité avec GoogleMap API V3 ?
Je viens de modifier la contribution pour la rendre compatible avec spip 2.1
Répondre à ce message
Bonjour.
Auid de la compatibilité avec GoogleMap V3 ?
Répondre à ce message
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
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 :
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.
Suivre les commentaires : |