WordPress hwk Blog ACF: Ajouter des Options au Champ Google Map avec Markers, Zoom & Style Personnalisé

ACF: Ajouter des Options au Champ Google Map avec Markers, Zoom & Style Personnalisé

14 April 2018

Ajout des icônes

<?php
add_filter('hwk/acf/google_map/icons', 'hwk_acf_google_map_icons');
function hwk_acf_google_map_icons($icons){
$icons[] = get_template_directory_uri() . '/assets/markers/1.svg';
$icons[] = get_template_directory_uri() . '/assets/markers/2.svg';
$icons[] = get_template_directory_uri() . '/assets/markers/3.svg';
$icons[] = get_template_directory_uri() . '/assets/markers/4.svg';
$icons[] = get_template_directory_uri() . '/assets/markers/5.svg';
return $icons;
}

Création des Paramètres

<?php
add_action('acf/render_field_settings/type=google_map', 'hwk_acf_google_map_settings');
function hwk_acf_google_map_settings($field){
acf_render_field_setting($field, array(
'key' => 'hwk_google_map_option_style_switch',
'name' => 'hwk_google_map_option_style_switch',
'type' => 'true_false',
'label' => 'Style par défaut',
'instructions' => 'Définir un style par défaut',
'value' => (isset($field['hwk_google_map_option_style_switch'])) ? $field['hwk_google_map_option_style_switch'] : '',
'default_value' => true,
'ui' => true,
));
acf_render_field_setting($field, array(
'key' => 'hwk_google_map_option_style_default',
'name' => 'hwk_google_map_option_style_default',
'type' => 'textarea',
'label' => 'Style par défaut',
'instructions' => '<a href="https://snazzymaps.com/" target="_blank">Snazzy Maps</a>',
'value' => (isset($field['hwk_google_map_option_style_default'])) ? $field['hwk_google_map_option_style_default'] : '',
'new_lines' => '',
'conditional_logic' => array(
array(
array(
'field' => 'hwk_google_map_option_style_switch',
'operator' => '==',
'value' => '1',
),
),
),
));
acf_render_field_setting($field, array(
'name' => 'hwk_google_map_option_style_user',
'type' => 'true_false',
'label' => 'Style utilisateur',
'instructions' => 'Laisser l\'utilisateur appliquer un style?',
'value' => (isset($field['hwk_google_map_option_style_user'])) ? $field['hwk_google_map_option_style_user'] : '',
'default_value' => true,
'ui' => true,
));
acf_render_field_setting($field, array(
'name' => 'hwk_google_map_option_zoom',
'type' => 'true_false',
'label' => 'Niveau de Zoom',
'instructions' => 'Laisser l\'utilisateur choisir le zoom?',
'value' => (isset($field['hwk_google_map_option_zoom'])) ? $field['hwk_google_map_option_zoom'] : '',
'default_value' => true,
'ui' => true,
));
}

Affichage des Paramètres dans le Champ

<?php
add_action('acf/render_field/type=google_map', 'hwk_acf_google_map_render');
function hwk_acf_google_map_render($field){
echo '<div class="acf-fields -left hwk_google_map_wrapper">';
acf_render_field_wrap(array(
'key' => 'hwk_google_map_options',
'name' => 'hwk_google_map_options',
'label' => 'Options',
'type' => 'accordion',
'open' => false,
'multi_expand' => true
));
// Icons
$icons = array();
$icons = apply_filters('hwk/acf/google_map/icons', $icons);
if(!empty($icons)){
$choices = array();
foreach($icons as $icon){
$choices[$icon] = '<div><img src="'.$icon.'" /></div>';
}
acf_render_field_wrap(array(
'label' => 'Icône',
'instructions' => 'Sélectionnez un icône',
'type' => 'radio',
'name' => 'hwk_google_map_icon',
'prefix' => $field['name'],
'value' => (isset($field['value']['hwk_google_map_icon'])) ? $field['value']['hwk_google_map_icon'] : '',
'choices' => $choices,
'allow_null' => true,
'layout' => 'horizontal',
'class' => 'hwk_google_map_icon'
));
}
if($field['hwk_google_map_option_zoom'] == '1'){
acf_render_field_wrap(array(
'label' => 'Zoom utilisateur',
'instructions' => 'Définissez votre préférence',
'type' => 'range',
'name' => 'hwk_google_map_zoom',
'prefix' => $field['name'],
'value' => (isset($field['value']['hwk_google_map_zoom'])) ? $field['value']['hwk_google_map_zoom'] : 14,
'min' => 0,
'max' => 21,
'step' => 1,
'class' => 'hwk_google_map_zoom'
));
}
if($field['hwk_google_map_option_style_user'] == '1'){
acf_render_field_wrap(array(
'label' => 'Style personnalisé',
'instructions' => '<a href="https://snazzymaps.com/" target="_blank">Snazzy Maps</a>',
'type' => 'textarea',
'name' => 'hwk_google_map_style_user',
'prefix' => $field['name'],
'value' => (isset($field['value']['hwk_google_map_style_user'])) ? $field['value']['hwk_google_map_style_user'] : '',
'class' => 'hwk_google_map_style_user'
));
}
// Style: Default
if($field['hwk_google_map_option_style_switch'] == '1' && !empty($field['hwk_google_map_option_style_default'])){
acf_hidden_input(array(
'value' => $field['hwk_google_map_option_style_default'],
'class' => 'hwk_google_map_style_default'
));
}
echo '</div>';
}

Affichage des options en Front

<?php
function hwk_acf_map_icon($options){
if(!isset($options['value']['hwk_google_map_icon']) || empty($options['value']['hwk_google_map_icon']))
return;
echo ' data-icon=\'' . $options['value']['hwk_google_map_icon'] . '\'';
}
function hwk_acf_map_atts($options, $mode = false){
$atts = array();
if($options['hwk_google_map_option_zoom'] == '1' && isset($options['value']['hwk_google_map_zoom']) && !empty($options['value']['hwk_google_map_zoom']))
$atts['data-zoom'] = $options['value']['hwk_google_map_zoom'];
if($options['hwk_google_map_option_style_user'] == '1' && isset($options['value']['hwk_google_map_style_user']) && !empty($options['value']['hwk_google_map_style_user']))
$atts['data-style'] = $options['value']['hwk_google_map_style_user'];
if($options['hwk_google_map_option_style_switch'] == '1' && isset($options['hwk_google_map_option_style_default']) && !empty($options['hwk_google_map_option_style_default']) && ($options['hwk_google_map_option_style_user'] != '1' || empty($options['value']['hwk_google_map_style_user'])))
$atts['data-style'] = $options['hwk_google_map_option_style_default'];
if(empty($atts))
return;
foreach($atts as $k => $v){
echo ' ' . $k . '=\'' . $v . '\'';
}
}

<?php get_header(); ?>
<?php if(have_posts()): ?>
<?php while(have_posts()): the_post(); ?>
<?php if($map = get_field('google_map')){ ?>
<?php $options = get_field_object('google_map'); ?>
<div class="acf-map"<?php hwk_acf_map_atts($options); ?>>
<div class="marker" data-lat="<?php echo $map['lat']; ?>" data-lng="<?php echo $map['lng']; ?>"<?php hwk_acf_map_icon($options); ?>></div>
</div>
<!– Résultat:
<div class="acf-map" data-zoom='5' data-style='[{"featureType"…}]'>
<div class="marker" data-lat="5.00000" data-lng="5.00000" data-icon="http://www.example.com/themes/mon_theme/assets/markers/1.svg"></div>
</div>
–>
<?php } ?>
<?php endwhile; ?>
<?php endif; ?>
<?php get_footer(); ?>

function new_map($el){
var $markers = $el.find('.marker');
var args = {
zoom : 16,
center : new google.maps.LatLng(0, 0),
mapTypeId : google.maps.MapTypeId.ROADMAP
};
// Ajout du Zoom
if($el.attr('data-zoom') != '')
args.zoom = parseInt($acf_map.attr('data-zoom'));
// Ajout du Style
if($el.attr('data-style') != '')
args.styles = $.parseJSON($acf_map.attr('data-style'));
var map = new google.maps.Map( $el[0], args);
map.markers = [];
$markers.each(function(){
add_marker( $(this), map );
});
center_map( map );
return map;
}
function add_marker($marker, map){
var latlng = new google.maps.LatLng( $marker.attr('data-lat'), $marker.attr('data-lng') );
var marker_args = {
position : latlng,
map : map
};
// Ajout du Marker
if($marker.attr('data-icon') != '')
marker_args.icon = {
url: $marker.attr('data-icon'),
scaledSize: new google.maps.Size(50, 50)
};
var marker = new google.maps.Marker(marker_args);
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 center_map(map){
var bounds = new google.maps.LatLngBounds();
$.each( map.markers, function( i, marker ){
var latlng = new google.maps.LatLng( marker.position.lat(), marker.position.lng() );
bounds.extend( latlng );
});
if(map.markers.length == 1){
map.setCenter(bounds.getCenter());
} else{
map.fitBounds(bounds);
}
}

Script Javascript

jQuery(document).ready(function($){
// Google Map Init
acf.add_action('google_map_init', function(map, marker, $field){
google.maps.event.addListener(map, 'zoom_changed', function(e){
this.$el.closest('.acf-field-google-map').find('.hwk_google_map_zoom').val(this.getZoom()).trigger('change');
});
});
// Google Map Args
acf.add_filter('google_map_args', function(el, field){
map_args = {
scrollwheel: el.scrollwheel,
zoom: el.zoom,
center: el.center,
mapTypeId: el.mapTypeId
};
var zoom = $(field).find('.hwk_google_map_zoom');
if(zoom.length)
map_args.zoom = parseInt(zoom.val());
var style_user = $(field).find('.hwk_google_map_style_user');
if(style_user.length){
map_args.styles = $.parseJSON(style_user.val());
}else{
var style = $(field).find('.hwk_google_map_style_default');
if(style.length)
map_args.styles = $.parseJSON(style.val());
}
return map_args;
});
// Google Map Markers Args
acf.add_filter('google_map_marker_args', function(el, field){
var icon = $(field).find('.hwk_google_map_icon input:checked');
if(icon.length == 0)
return el;
marker_args = {
draggable: el.draggable,
raiseOnDrag: el.raiseOnDrag,
map: el.map,
icon: {
url: icon.val(),
scaledSize: new google.maps.Size(50, 50)
}
};
return marker_args;
});
// Icon
if($('.hwk_google_map_icon').length){
$('.hwk_google_map_icon input').click(function(e){
var id = $(this).closest('.acf-field-google-map').find('> .acf-input > .acf-google-map').attr('id');
var googlemap = acf.fields.google_map.maps[id];
var icon = $(this).val();
var marker = googlemap.marker.setIcon({
url: icon,
scaledSize: new google.maps.Size(50, 50)
});
});
}
// Zoom Range
if($('.hwk_google_map_zoom').length){
$('.hwk_google_map_zoom').on('input', function(e){
var id = $(this).closest('.acf-field-google-map').find('> .acf-input > .acf-google-map').attr('id');
var googlemap = acf.fields.google_map.maps[id];
var val = parseInt($(this).val());
var zoom = googlemap.setZoom(val);
});
}
// Style: User
if($('.hwk_google_map_style_user').length){
$('.hwk_google_map_style_user').on('input change paste keyup', function(e){
var val = $(this).val();
var id = $(this).closest('.acf-field-google-map').find('> .acf-input > .acf-google-map').attr('id');
var googlemap = acf.fields.google_map.maps[id];
if(val == ''){
$(this).removeClass('error');
var style = googlemap.setOptions({
styles: ''
});
return;
}
try{
var json = $.parseJSON(val);
}catch(err){
var json = null
}
if(!json){
$(this).addClass('error');
return;
}
$(this).removeClass('error');
var style = googlemap.setOptions({
styles: json
});
});
}
});

Style CSS

.hwk_google_map_wrapper{
border: 1px solid #ddd; border-top:0;
}
.hwk_google_map_wrapper .error{
border:1px solid #bb0000 !important;
}
.hwk_google_map_icon li{
margin-right:5px !important;
}
.hwk_google_map_icon label input{
display:none;
}
.hwk_google_map_icon label div{
width:40px;
height:40px;
padding:7px;
border:1px solid transparent;
}
.hwk_google_map_icon label.selected div{
border:1px solid #ddd;
background:#f8f8f8;
}
.hwk_google_map_icon label:hover div{
border:1px solid #ddd;
}