/ Scripts & jquery / Автоматическое определение координат по адресу

Автоматическое определение координат по адресу

01.03.2021

376

В данном решении используется сервис geocode-maps.yandex.ru.

Функция определения координат по адресу

function get_geolocation($address){

	$geocode = my_url_encode($address);
	$key     = 'yandex-api-key';

	$response = json_decode(file_get_contents('https://geocode-maps.yandex.ru/1.x/?apikey='.$key.'&geocode='.$geocode.'&results=1&format=json'));
 
	if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0) {
		$position = $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
		$position_array = explode(" ", $position);
		return $position_array[1].','.$position_array[0];
	} else { return 'Ничего не найдено'; }
}

// Функция кодировки символов
function my_url_encode($s){
$s= strtr ($s, array (" "=> "%20", "а"=>"%D0%B0", "А"=>"%D0%90","б"=>"%D0%B1", "Б"=>"%D0%91", "в"=>"%D0%B2", "В"=>"%D0%92", "г"=>"%D0%B3", "Г"=>"%D0%93", "д"=>"%D0%B4", "Д"=>"%D0%94", "е"=>"%D0%B5", "Е"=>"%D0%95", "ё"=>"%D1%91", "Ё"=>"%D0%81", "ж"=>"%D0%B6", "Ж"=>"%D0%96", "з"=>"%D0%B7", "З"=>"%D0%97", "и"=>"%D0%B8", "И"=>"%D0%98", "й"=>"%D0%B9", "Й"=>"%D0%99", "к"=>"%D0%BA", "К"=>"%D0%9A", "л"=>"%D0%BB", "Л"=>"%D0%9B", "м"=>"%D0%BC", "М"=>"%D0%9C", "н"=>"%D0%BD", "Н"=>"%D0%9D", "о"=>"%D0%BE", "О"=>"%D0%9E", "п"=>"%D0%BF", "П"=>"%D0%9F", "р"=>"%D1%80", "Р"=>"%D0%A0", "с"=>"%D1%81", "С"=>"%D0%A1", "т"=>"%D1%82", "Т"=>"%D0%A2", "у"=>"%D1%83", "У"=>"%D0%A3", "ф"=>"%D1%84", "Ф"=>"%D0%A4", "х"=>"%D1%85", "Х"=>"%D0%A5", "ц"=>"%D1%86", "Ц"=>"%D0%A6", "ч"=>"%D1%87", "Ч"=>"%D0%A7", "ш"=>"%D1%88", "Ш"=>"%D0%A8", "щ"=>"%D1%89", "Щ"=>"%D0%A9", "ъ"=>"%D1%8A", "Ъ"=>"%D0%AA", "ы"=>"%D1%8B", "Ы"=>"%D0%AB", "ь"=>"%D1%8C", "Ь"=>"%D0%AC", "э"=>"%D1%8D", "Э"=>"%D0%AD", "ю"=>"%D1%8E", "Ю"=>"%D0%AE", "я"=>"%D1%8F", "Я"=>"%D0%AF"));
return $s;
}

// Функция кодировки символов
function my_url_decode($s){
$s= strtr ($s, array ("%20"=>" ", "%D0%B0"=>"а", "%D0%90"=>"А", "%D0%B1"=>"б", "%D0%91"=>"Б", "%D0%B2"=>"в", "%D0%92"=>"В", "%D0%B3"=>"г", "%D0%93"=>"Г", "%D0%B4"=>"д", "%D0%94"=>"Д", "%D0%B5"=>"е", "%D0%95"=>"Е", "%D1%91"=>"ё", "%D0%81"=>"Ё", "%D0%B6"=>"ж", "%D0%96"=>"Ж", "%D0%B7"=>"з", "%D0%97"=>"З", "%D0%B8"=>"и", "%D0%98"=>"И", "%D0%B9"=>"й", "%D0%99"=>"Й", "%D0%BA"=>"к", "%D0%9A"=>"К", "%D0%BB"=>"л", "%D0%9B"=>"Л", "%D0%BC"=>"м", "%D0%9C"=>"М", "%D0%BD"=>"н", "%D0%9D"=>"Н", "%D0%BE"=>"о", "%D0%9E"=>"О", "%D0%BF"=>"п", "%D0%9F"=>"П", "%D1%80"=>"р", "%D0%A0"=>"Р", "%D1%81"=>"с", "%D0%A1"=>"С", "%D1%82"=>"т", "%D0%A2"=>"Т", "%D1%83"=>"у", "%D0%A3"=>"У", "%D1%84"=>"ф", "%D0%A4"=>"Ф", "%D1%85"=>"х", "%D0%A5"=>"Х", "%D1%86"=>"ц", "%D0%A6"=>"Ц", "%D1%87"=>"ч", "%D0%A7"=>"Ч", "%D1%88"=>"ш", "%D0%A8"=>"Ш", "%D1%89"=>"щ", "%D0%A9"=>"Щ", "%D1%8A"=>"ъ", "%D0%AA"=>"Ъ", "%D1%8B"=>"ы", "%D0%AB"=>"Ы", "%D1%8C"=>"ь", "%D0%AC"=>"Ь", "%D1%8D"=>"э", "%D0%AD"=>"Э", "%D1%8E"=>"ю", "%D0%AE"=>"Ю", "%D1%8F"=>"я", "%D0%AF"=>"Я"));
return $s;
}

my_url_encode, my_url_decode — вспомогательные функции по кодировке/декодировке символов для правильного url-запроса.

Использование функции

<?php echo get_geolocation('352332 Краснодарский край, г. Усть-Лабинск, ул. Заполотняная, 19 В') ?>

Ajax-функция определения координат

Добавим функцию подключения скрипта, и немного изменим саму функцию определения координат. my_url_encode также используем.

add_action('wp_print_scripts', 'ajax_geoload_script', 100);
function ajax_geoload_script() {

	wp_register_script('geoload_script', get_template_directory_uri(). '/js/geoload.js', array('jquery'), null, true);
	wp_enqueue_script( 'geoload_script' );

	wp_localize_script( 
		'geoload_script', 
		'geoload_vars', 
		array(
			'geoload_nonce' => wp_create_nonce( 'geoload_nonce' ),
			'geoload_ajax_url' => admin_url( 'admin-ajax.php' ),
		)
	);
}

function get_geoload(){
	
	$geocode = my_url_encode( $_POST['source'] );
	$key = 'yandex-api-key';

	$response = json_decode(file_get_contents('https://geocode-maps.yandex.ru/1.x/?apikey='.$key.'&geocode='.$geocode.'&results=1&format=json'));
 
	if ($response->response->GeoObjectCollection->metaDataProperty->GeocoderResponseMetaData->found > 0) {
		$position = $response->response->GeoObjectCollection->featureMember[0]->GeoObject->Point->pos;
		$position_array = explode(" ", $position);
		$response = $position_array[1].','.$position_array[0];
	} else { $response = 'Ничего не найдено'; }
	
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){
        echo $response;
        wp_die();
    }
}

add_action('wp_ajax_geoload', 'get_geoload');
add_action('wp_ajax_nopriv_geoload', 'get_geoload');

Скрипт захвата адреса и передачи координат (geoload.js):

jQuery(document).ready(function($) {
	
	$('.geo-start').click( function(event) {
			
		// Prevent defualt action - opening tag page
		if (event.preventDefault) {
			event.preventDefault();
		} else {
			event.returnValue = false;
		}

		// Get tag slug from title attirbute
	    var source = $(".geo-source").val();

		data = {
			action: 'geoload',
			geoload_nonce: geoload_vars.geoload_nonce,
			source: source,
		};
	  
	  
		$.ajax({
			type: 'post',
			dataType: 'html',
			url: geoload_vars.geoload_ajax_url,
			data: data,
			success: function( data, textStatus, XMLHttpRequest ) {
				$('.geo-target').html(data);
			},
			error: function( MLHttpRequest, textStatus, errorThrown ) {
				$('.geo-target').html('Ошибка запроса');
			}
		})

	});	
  
});

Выводим во фронтенде управляющие элементы:

<input type="text" value="" class="geo-source">
<div class="btn geo-start">Найти координаты</div>
<div class="geo-target"></div>

Массовое добавление координат точкам

Должно быть заполнено метаполе адрес (address). Перебираем все записи у которых не заполнено метаполе координаты (coordinates), и используя первую функцию определения координат по полю адрес прописываем значения координат.

<?php global $post;
$args = array(
	'posts_per_page' => -1,
);

$myposts = get_posts( $args );
$i = 0;
foreach( $myposts as $post ) : setup_postdata($post);

	$coordinates = get_post_meta($post->ID, 'coordinates', 1);

	if( empty($coordinates) ) {
		$i ++;
		$address = get_post_meta($post->ID, 'address', 1);
		$location = get_geolocation($address);
		update_post_meta($post->ID, 'coordinates', $location);
		
		echo $post->post_title.'<br>';
	}

endforeach;
wp_reset_postdata();
echo '<br><br>'.$i.' обновлений'; ?>

Предпочтительно делать в виде шаблона страницы.

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Подгрузка постов «налету» I: Скроллинг

Подгрузка постов «налету» I: Скроллинг

Добавляем на сайт функционал подгрузки постов «налету». Данная технология применяется в соц. сетях, а также крупных интернет-магазинах. В funсtion.php // Добавляем подгрузку постов function true_loadmore_scripts() { wp_enqueue_script('jquery'); // скорее всего Читать далее »

Загрузка контента без перезагрузки

Загрузка контента без перезагрузки

Подгрузка контента средствами Ajax Создаем тестовую верстку <p>Какую страницу желаете открыть?</p> <form> <input onclick="showContent('https://opttour.ru/main-rublik/sites/fotofit/')" type="button" value="Страница 1"> <input onclick="showContent('https://opttour.ru/main-rublik/sites/dtex/')" type="button" value="Страница 2"> </form> <div id="contentBody"></div> <div id="loading" style="display: none"> Идет Читать далее »

Выбор города пользователя

Выбор города пользователя

Создадим модуль выбора города пользователя, на основе которого, будем менять некоторые аспекты сайта. Автоматически определяем и сохраняем город в SESSION Автоматически определяем город (в основу которого легло решение от Яндекс). Читать далее »

Добавить комментарий

Пока нет комментариев. Будь первым!

Автоматическое определение координат по адресу
Woocommerce основы
Рекомендации для васWoocommerce основыOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.