/ Адаптивность / Выбор города пользователя

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

HIT

Создадим модуль выбора города пользователя, на основе которого, будем менять некоторые аспекты сайта.

Автоматически определяем и сохраняем город в SESSION

Автоматически определяем город (в основу которого легло решение от Яндекс).

// Первичное определение города
function determinecurrentcity() { 
	var localcity = ymaps.geolocation.city;

	if(localcity == null){ 
		jQuery("#city-ajax").text('unknown');
	} else {
		jQuery("#city-ajax").text(localcity);

		$.ajax({ // Отправка данных в session
			url: "/wp-admin/admin-ajax.php",
			method: 'post',
			data: {
				action: 'ajax_city',
				city: localcity,
			}
		});

		setTimeout(function () { $(".city-descript-block").load("/wp-content/themes/magazin-3.0/city-description.php"); }, 800);
	}
};

Должен быть подключен скрипт:

http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU

Чтобы первоначальный скрипт заработал нужно его инициализировать (условие: сессия user_city не существует):

function sitecities_action_script() {
	if ( !isset( $_SESSION['user_city'] ) ) {
		print '<script type="text/javascript">window.onload = function () { determinecurrentcity(); }</script>';
	}
}
add_action('body-before', 'sitecities_action_script');
body-before — пользовательский хук перед /body

Функция в которую ajax передают город и она записывает его в сессию (user_city).

// Запись города в SESSION
function ajax_city_send(){
    $city = $_REQUEST['city'];
	$_SESSION['user_city'] = $city;
}

add_action('wp_ajax_nopriv_ajax_city', 'ajax_city_send' );
add_action('wp_ajax_ajax_city', 'ajax_city_send' );

Чтобы работало также нужно включить сессии

// Включение / отключение записи сессий
add_action('init', 'start_session', 1);
function start_session() {
	if( !session_id() ) {
		session_start();
	}
}

add_action('wp_logout', 'end_session');
add_action('wp_login', 'end_session');
add_action('end_session_action', 'end_session');

function end_session() { session_destroy(); }

Верстка блока с выводом города:

<div id="site-city">
	<a href="#" title="Выбрать свой регион">
	<i class="fas fa-map-marker-alt"></i>
	
	<?php if ( isset( $_SESSION['user_city'] ) ) {
		echo '<p id="city-ajax">'.$_SESSION['user_city'].'</p>';
	} else {
		echo '<p id="city-ajax">Выбрать город..</p>';
	} ?>
	
	
	</a>
</div>

Где-то ниже на сайте создаем div с классом city-descript-block. В нем будет выводится общий SEO-текст в котором будет меняться город.

Ручной выбор города

Чтобы пользователь мог сам выбрать город, делаем кнопку с городом (#city-ajax) триггером для всплывающего окна.

Содержимое окна с выбором города:

<?php $cities = array ( // список городов для выбора
'Астрахань', 'Белгород', 'Брянск', 'Владикавказ', 'Владимир', 'Воронеж', 'Волгоград', 'Волгодонск', 'Казань', 'Краснодар', 'Махачкала', 'Москва', 'Нальчик',
'Нижний Новгород', 'Новороссийск', 'Оренбург', 'Пенза', 'Пятигорск', 'Ростов-на-Дону', 'Сальск', 'Самара', 'Саратов', 'Санкт-Петербург', 'Смоленск', 'Сочи', 
'Ставрополь', 'Тамбов', 'Тверь', 'Тула', 'Уральск', 'Уфа', 'Чебоксары'
); ?>

<div id="cities-list">

<?php if ( isset( $_SESSION['user_city'] ) ) {
	
	foreach($cities as $city):
		echo '<div';
		if ($_SESSION['user_city'] == $city) { echo ' class="current-city"'; }
		echo '>'.$city.'</div>';
	endforeach;
	
} else {
	
	foreach($cities as $city):
		echo '<div>'.$city.'</div>';
	endforeach;

} ?>
	
</div>

Скрипт изменения города (из вариантов)

jQuery(document).ready(function() { 

	$("body").on("click", "#cities-list > *", function () {	
		
		$('#cities-list > *').removeClass('current-city');
		$(this).addClass('current-city');
		
		var citychoice = $(this).text();
		
		jQuery("#city-ajax").text(citychoice);
		
		$.ajax({
			url: "/wp-admin/admin-ajax.php",
			method: 'post',
			data: {
				action: 'ajax_city',
				city: citychoice,
			}
		});
		
		setTimeout(function () { $(".city-descript-block").load("/wp-content/themes/magazin-3.0/city-description.php"); }, 800);

		//скрипты скрытия окна
	});

});

SEO-описание в зависимости от города

Ранее блок .city-descript-block будет обновляться на лету (по какому принципу описано здесь). Для этого создаем файл city-description.php (путь в скриптах должен быть прописан к нему). Содержимое файла:

<?php require_once("../../../wp-load.php"); ?>	
	
<?php if ( isset( $_SESSION['user_city'] ) ) {
	$value = $_SESSION['user_city']; ?>
	<div class="city-descript">
	О, <?php echo $value; ?>! Много написано книг о <?php echo citys_cases($value, 4); ?>, гордимся <?php echo citys_cases($value, 3); ?>. 
	Мы осуществляем прямые поставки товара в <?php echo citys_cases($value, 2); ?> и развозим их по <?php echo citys_cases($value, 1); ?>. 
	Также мы доставляем грузы из <?php echo citys_cases($value, 0); ?>.
<?php } ?>
В этом блоке не будут передаваться переменные страницы, например мета поля и прочее. Нужно доработать этот момент, т.к. это существенно расширит функциональность.

Пока это не доработано приходится подменять только город (без обновления ajax всего блока). Пример (блок в шаблоне товара woocommerce, как одну из переменных используем фокусное ключевое слово YoastSEO):

<div class="city-descript-block">
<?php $yoast_wpseo_focuskw = get_post_meta($post->ID, '_yoast_wpseo_focuskw', true);
if ( isset( $_SESSION['user_city'] ) ) {
	$value = $_SESSION['user_city']; ?>
	<div class="city-descript">
Компания предлагает широкий ассортимент продукции: наименования. 
<?php echo $yoast_wpseo_focuskw; ?> в наличии на складе в Ростове-на-Дону. Товары, предлагаемые компанией Вы можете купить с доставкой в город <span class="local-city"><?php echo $value; ?></span>.
</div>
<?php } ?>
</div>

Склонение города в разных падежах

Функция склонения города по падежам. Возможно не самое изящное решение, но на данный момент лучшего не придумал.

// Склонения городов
function citys_cases($city, $case){

$local_city = array('Вашего города','Вашему городу','Ваш город','Вашим городом','Вашем городе');

if ( $city == 'Ростов-на-Дону' ) 	{ $local_city = array('Ростова-на-Дону','Ростову-на-Дону','Ростов-на-Дону','Ростовом-на-Дону','Ростове-на-Дону'); }
if ( $city == 'Москва' ) 			{ $local_city = array('Москвы','Москве','Москву','Москвой','Москве'); }
if ( $city == 'Санкт-Петербург' ) 	{ $local_city = array('Санкт-Петербурга','Санкт-Петербургу','Санкт-Петербург','Санкт-Петербургом','Санкт-Петербурге'); }
if ( $city == 'Пенза' ) 			{ $local_city = array('Пензы','Пензе','Пензу','Пензой','Пензе'); }
if ( $city == 'Нижний Новгород' ) 	{ $local_city = array('Нижнего Новгорода','Нижнему Новгороду','Нижний Новгород','Нижним Новгородом','Нижнем Новгороде'); }

return $local_city[$case];

}

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

  • Похожие записи
  • Комментарии
  • Вложения
Юр. или физ. лицо при оформлении

Юр. или физ. лицо при оформлении

Расширим функционал Woocommerce выбором при оформлении заказа: юр. или физ. лицо. Естественно данный выбор будет влиять на множество аспектов самого процесса заказа и прочих функций WC. Создание переключателя и полей Читать далее »

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

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

Подгрузка контента средствами 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"> Идет Читать далее »

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

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

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

/

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

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

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