クライアントのホームページでアドバンスド カスタム フィールド(ACF)を使ってます。今回デザイン変更に伴い、ACFとGoogle Mapを再設定することになりました。 以下、忘備録として、必要な作業を書き出しておきます。
Google Mapの設定
Google Map ですが、2018年7月の有料化に伴い、ACFの様にAPIを使ってデータのやりとりをする場合は、設定が少しややこしくなりました。 ゼロからやる場合は、次の様な手順が必要となります。
- Google Cloud Consoleで支払い設定
- プロジェクト作成
- API KEYを取得
- 複数のMAP APIを有効化
- Maps JavaScript API
- Geocoding API
- Geolocation API
- Directions API
- Distance Matrix API
- Maps Elevation API
- Maps Embed API
- Maps Static API
- Places API
ACFの設定
- JavaScriptの読み込み
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=YOUR-API-KEY"></script>
<script type="text/javascript">
(function( $ ) {
function initMap( $el ) {
var $markers = $el.find('.marker');
var mapArgs = {
zoom : $el.data('zoom') || 16,
mapTypeId : google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map( $el[0], mapArgs );
map.markers = [];
$markers.each(function(){
initMarker( $(this), map );
});
centerMap( map );
return map;
}
function initMarker( $marker, map ) {
var lat = $marker.data('lat');
var lng = $marker.data('lng');
var latLng = {
lat: parseFloat( lat ),
lng: parseFloat( lng )
};
var marker = new google.maps.Marker({
position : latLng,
map: map
});
map.markers.push( marker );
if( $marker.html() ){
var infowindow = new google.maps.InfoWindow({
content: $marker.html()
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open( map, marker );
});
}
}
function centerMap( map ) {
var bounds = new google.maps.LatLngBounds();
map.markers.forEach(function( marker ){
bounds.extend({
lat: marker.position.lat(),
lng: marker.position.lng()
});
});
if( map.markers.length == 1 ){
map.setCenter( bounds.getCenter() );
} else{
map.fitBounds( bounds );
}
}
$(document).ready(function(){
$('.acf-map').each(function(){
var map = initMap( $(this) );
});
});
})(jQuery);
</script>
- functions.phpにAPI Keyを設定
function my_acf_google_map_api( $api ){
$api['key'] = 'YOUR-API-KEY';
return $api;
}
add_filter('acf/fields/google_map/api', 'my_acf_google_map_api');
- 地図書き出し部分へのコード追加
<?php
$location = get_field('location');
if( $location ): ?>
<div class="acf-map" data-zoom="16">
<div class="marker" data-lat="<?php echo esc_attr($location['lat']); ?>" data-lng="<?php echo esc_attr($location['lng']); ?>"></div>
</div>
<?php endif; ?>
- CSS書き込み
.acf-map {
width: 100%;
height: 400px;
border:
margin: 20px 0;
}
.acf-map img {
max-width: inherit !important;
}