• Как вывести метки на яндекс карту взяв адреса из кастомных полей записей?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Нечто похожее нам приходилось реализовать для одного клиента.
    Единственное отличие - метка добавляется не из катомных записей, а на конкретной странице, на которой при помощи ACF Repeater созданы кастомные поля.
    Краткая инструкция:
    1) Создайте поле ACF Repeater + 2 кастомных поля Широта и Долгота и выведите на странице
    2) При помощи яндекс карт (https://yandex.ru/maps/) клиент находит координаты объекта и прописывает его через repeater в кастомные поля Широта и Долгота.
    3) Создайте шаблон (скопируйте page.php) и назначьте его для созданной вами страницы.
    Пример подобного шаблона:
    В данном коде присутствует лишний код. Но думаю, что вы найдете необходимые участки...
    Пример шаблона
    <div class="container content-page">
    		<div class="page-content">
    			<div class="row">
    				<div class="content col-md-12">
    					<div id="customMap" class="YMaps" style="width:100%;height:400px;">
    					</div>
    					<?php if( have_rows('example_mebel') ): ?>
    						<?php $yamap = [];?>
    						<?php while( have_rows('example_mebel') ): the_row(); ?>
    							<!-- baloon content -->
    							<?php $example_title = get_sub_field('example_title') ?>
    							<?php $example_address = get_sub_field('example_address') ?>
    							<?php $example_phone = get_sub_field('example_phone') ?>
    							<?php $example_time = get_sub_field('example_time') ?>
    							<?php 
    
    	$example_placemark_type = array
    	("twirl#darkgreenStretchyIcon","twirl#greenStretchyIcon"); 
    
    								// $example_placemark_type = array("twirl#redIcon", "twirl#darkblueIcon", "twirl#pinkIcon", "twirl#darkorangeIcon", "twirl#violetIcon"); 
    							?>
    							<!-- baloon content -->
    							<?php $tempID = get_sub_field( 'example_id'); ?>
    							<?php $cityName = get_sub_field( 'example_city'); ?>
    							<?php if( have_rows('example_places') ): while( have_rows('example_places') ): the_row();  ?>
    								<?php $example_longitude = get_sub_field( 'example_longitude'); ?>
    								<?php $example_lattitude = get_sub_field( 'example_lattitude'); ?>
    								
    							
    							<!---->
    
    							<?php
    								array_push
    								(
    									$yamap,
    									[
    										"lat" => $example_lattitude,
    										"lon" => $example_longitude,
    										"header" => $example_title,
    										"address" => $example_address,
    										"time" => $example_time,
    										"footer" => $example_phone,
    										"placemark" => $example_placemark_type[array_rand($example_placemark_type)],
    										"id" => $tempID,
    										"city" => $cityName
    									]
    								);
    
    							?>
    								<?php endwhile; endif; ?>
    						<?php endwhile; ?>
    					<?php endif; ?>
    				</div>
    				<div style="padding: 10px 0 !important; clear: both;"></div>
    				<div class="content col-md-12">
    					<?php if( have_rows('example_mebel') ): ?>
    						<div class="example_accordion">
    							<div class="panel-group" id="accordion">
    
    						<?php while( have_rows('example_mebel') ): the_row(); ?>
    							
    							<!--example_places-->
    								<!-- begin object -->
    								
    										<!-- ** -->
    										<?php if ($example_title = get_sub_field('example_title')) { ?>
    											<?php ($example_id = get_sub_field('example_id')); ?>
    										
    
    										 
    											<div class="panel panel-default">
    											  <div class="panel-heading">
    												<h4 class="panel-title">
    												  <a data-toggle="collapse" data-parent="#accordion" href="#<?php echo $example_id ?>"><?php echo $example_title ?><?php if ($example_city = get_sub_field('example_city')) { ?><span style="float:right;"><?php echo $example_city  ?></span><?php } ?></a>
    												</h4>
    											  </div>
    											  <div id="<?php echo $example_id ?>" class="panel-collapse collapse">
    												<div class="panel-body">
    													<?php if ($example_address = get_sub_field('example_address')) { ?>
    														<div class="faq_answer"><span class="fa fa-map-marker"><?php echo $example_address ?></span></div>
    													<?php } ?>
    													<?php if ($example_time = get_sub_field('example_time')) { ?>
    														<div class="faq_answer"><span class="fa fa-clock-o"><?php echo $example_time ?></span></div>
    													<?php } ?>
    													<?php if ($example_phone = get_sub_field('example_phone')) { ?>
    														<div class="faq_answer"><span class="fa fa-phone"><?php echo $example_phone ?></span></div>
    													<?php } ?>
    													<?php if ($example_mail = get_sub_field('example_mail')) { ?>
    														<div class="faq_answer"><span class="fa fa-at"><?php echo $example_mail ?></span></div>
    													<?php } ?>
    													<div class="gallery">
    														<?php $images = get_sub_field('example_gallery');
    															if( $images ): ?>
    																<ul>
    																	<?php foreach( $images as $image ): ?>
    																		<li>
    																			<a href="<?php echo $image['url']; ?>">
    																				 <img src="<?php echo $image['sizes']['thumbnail']; ?>" alt="<?php echo $image['alt']; ?>" />
    																			</a>
    																		</li>
    																	<?php endforeach; ?>
    																</ul>
    														<?php endif; ?>
    													</div>
    												</div>
    												<div class="panel-footer">
    													
    												</div>
    											  </div>
    											</div>
    										  
    										<?php } ?>
    								
    								<!-- end object -->
    						<?php endwhile; ?>
    							</div>
    						</div>
    					<?php endif; ?>
    				</div>
    			</div><!-- end row-fluid -->
    		</div>
    	</div><!-- end container -->
    <?php echo "<script type=\"text/javascript\"> var points=".json_encode($yamap, true)."</script>" ?>;


    4) Далее подключите 2 скрипта для данной страницы:
    function register_scripts_map() {
    		wp_register_script('custom', get_stylesheet_directory_uri() .
    			'/js/custom.js');
    		wp_enqueue_script('custom');	
    		wp_register_script("yMapJS", "https://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU");
    		wp_enqueue_script("yMapJS");
    }
    
    add_action('wp_enqueue_scripts', 'register_scripts_map');

    5) Содержимое скрипта custom.js
    custom скрипт
    var zoom = 16,
        // mapCenter = [55.709992,37.654287];
        // mapCenter = [points[0].lat, points[0].lon],
        referenceCity = ['Москва', 'Санкт-Петербург'],
        mapAlwaysReady = false;    
    var customMap,
        mapCenter;
    function showCurrentPlace(event)
    {
        event.preventDefault();
        var currentSelectedItem = jQuery(this).find('a').attr('href').substr(1),
        currentSelectedPoint = 
            points.filter(function(item){return item.id == currentSelectedItem;})[0];
        if(mapAlwaysReady)
        {        
            customMap.setCenter([currentSelectedPoint.lat, currentSelectedPoint.lon]);
            customMap.setZoom(zoom);
        }    
        console.table(currentSelectedPoint);
    }
    
    function getMinMax(sourceArray, field)
    {
        var maxPrice = Math.max.apply(Math, sourceArray.map(function(item){return item[field];})),
            minPrice = Math.min.apply(Math, sourceArray.map(function(item){return item[field];})) 
        return {max: maxPrice, min: minPrice};
    }
    function mapReady()
    {   
        customMap = new ymaps.Map('customMap', 
        {
            center: mapCenter,
            zoom: zoom
        });
    
        points.forEach(function(item)
        {
            customMap.geoObjects.add
            (
                new ymaps.Placemark
                (
                    [item.lat, item.lon], 
                    {
                        iconContent: item.header, 
                        balloonContentHeader: item.header, 
                        balloonContentBody: 
                            item.address + 
                            '<br>' +
                            item.time
                            , 
                        balloonContentFooter: item.footer
                    },
                    {
                        preset: item.placemark //"twirl#pinkStretchyIcon"
                    }
                )
            );    
        });
        mapAlwaysReady = true;    
        var tempBounds = points.reduce
        (
            function(prev, cur)
            {       
                // return referenceCity.filter(function(itemCity)
                // {
                //     return itemCity == cur.city;
                // }).length > 0 ? prev.concat({lat: cur.lat, lon: cur.lon}) : prev; 
                return prev.concat({lat: cur.lat, lon: cur.lon});
            }, 
            []
        ),
        referenceBounds = 
        {
            lats: getMinMax(tempBounds, 'lat'),
            longs: getMinMax(tempBounds, 'lon'),
        };
        customMap.setBounds
        (
            [
                [referenceBounds.lats.min, referenceBounds.longs.min], 
                [referenceBounds.lats.max, referenceBounds.longs.max]
            ]
        );
    }

    Конечный результат - https://massimomebel.com/gde-kupit
    Конечно же вам придется переделать скрипт, чтобы собирать метки из кастомных записей, а не со страницы. Но в целом идея похожа.
    Если вас устроит идея добавления маркеров на основе Google Maps, то тут подробная инструкция об интеграции с CPT https://wpbeaches.com/create-multiple-marker-map-f...
    Ответ написан
    4 комментария