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

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

HIT

01.03.2021

2619

В данном решении используется сервис 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.' обновлений'; ?>

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

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Отложенная загрузка изображений

Отложенная загрузка изображений

Если на странице есть несколько изображений или есть изображения дублирующиеся на всех страницах (header, footer), то чтобы ускорить общую загрузку сайта, можно установить для изображений отложенную загрузку. Изображение будет появляться Читать далее »

Json Начало

Json Начало

JSON (JavaScript Object Notation) — это текстовый протокол обмена данными, чем-то похожий на более привычный XML, но данные записываются в нем более компактно. Изначально он был разработан для нужд JavaScript Читать далее »

Избранное

Избранное

Реализуем функционал Избранное. Нам надо сделать кнопку добавить в Избранное в шаблоне самой записи и в цикле вывода записей категории. И отдельная страница Избранное где выводятся избранные записи. Плагин Favorites Читать далее »

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

Notice: Функция WP_Styles::add вызвана неправильно. Стиль с дескриптором "editor-buttons" был поставлен в очередь с незарегистрированными зависимостями: dashicons. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 6.9.1.) in /home/t/tiberi6w/opttour.ru/public_html/wp-includes/functions.php on line 6170

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

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