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; | |
| } |