WordPress
Indiquer coordonnées Lat et Long dans deux champs personnalisés “lat” et “lng”
Ex : lat = 43.785687 et long = 48,456778
Inclure les champs personnalisés dans REST. Dans fonctions.php :
function slug_get_post_meta_cb( $object, $field_name, $request ) {
return get_post_meta( $object[ 'id' ], $field_name );
}
add_action( 'rest_api_init', function() {
register_api_field( 'post',
'lat',
array(
'get_callback' => 'slug_get_post_meta_cb',
'update_callback' => 'slug_update_post_meta_cb',
'schema' => null,
)
);
register_api_field( 'post',
'lng',
array(
'get_callback' => 'slug_get_post_meta_cb',
'update_callback' => 'slug_update_post_meta_cb',
'schema' => null,
)
);
});
Si les coordonnées sont dans un champ unique “lat_long” (lat_long=”43.785687,48,456778″) séparer en deux champs lorsque le post est enregistré. Dans fonctions.php :
function acf_save_lat_lng( $post_id ) {
$value = get_post_meta( get_the_ID(), 'lat_long', true );
list($lat, $lng) = explode(',', $value);
update_post_meta( $post_id, 'lat', $lat );
update_post_meta( $post_id, 'lng', $lng );
}
add_action('save_post', 'acf_save_lat_lng', 20);
Application
Dans index.html :
<script src="https://maps.google.com/maps/api/js"></script>
Dans controller.js :
.controller('MapsCtrl', function($scope, $ionicLoading, PostService, $http) {
var infoWindow = new google.maps.InfoWindow();
$http({
method: 'GET',
dataType: 'jsonp',
url: 'ADRESSE_DU_SITE/wp-json/wp/v2/posts',
headers: {
'Content-Type': 'application/json'
}
})
.success(function(data) {
$scope.data = data;
var json = $scope.data;
var map = new google.maps.Map(document.getElementById("map"), {
center: new google.maps.LatLng(48.826048, 2.267668),
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
for (var i = 0, length = json.length; i < length; i++) {
var data = json[i],
latLng = new google.maps.LatLng(data.lat[0], data.lng[0]);
var marker = new google.maps.Marker({
position: latLng,
map: map,
title: data.title.rendered
});
(function(marker, data) {
google.maps.event.addListener(marker, "click", function(e) {
infoWindow.setContent('<a href="#/app/post/' + data.id + '">' + data.title.rendered + '</a>' + data.content.rendered);
infoWindow.open(map, marker);
});
})(marker, data);
}
})
.error(function(data) {
console.log('erreur');
});
})
Dans maps.html :
<ion-view class="maps-view"> <ion-nav-title> <span>Carte</span> </ion-nav-title> <ion-content scroll="false"> <div id="map"></div> </ion-content> </ion-view>
Dans apps.js :
.state('app.maps', {
url: "/maps",
views: {
'menuContent': {
templateUrl: "views/maps.html",
controller: 'MapsCtrl'
}
}
})