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

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

HIT

01.03.2021

2669

В данном решении используется сервис 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]
  • Похожие записи
  • Комментарии
  • Вложения
Подгрузка постов «налету» I: Скроллинг

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

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

Фильтр по меткам (изменение основного запроса)

Фильтр по меткам (изменение основного запроса)

Реализуем фильтрацию записей по меткам путем изменения основного запроса на лету (ajax). Находим все теги записей входящих в категорию Данный код можно вставить в боковую колонку в виде виджета. <?php Читать далее »

/ /
Новинка (товар NEW полем)

Новинка (товар NEW полем)

Ранее были рассмотрены варианты добавления лэйбла New полуавтоматическим способом (последние созданные товары, либо по времени от текущего), либо назначением метки NEW. Здесь разберем как сделать данный функционал полем и какие Читать далее »

/

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

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 6260

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

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