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

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

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];

}
[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
Имитация Ajax загрузки контента

Имитация Ajax загрузки контента

Создадим эффект перехода внутри сайта имитирующий подгрузку контента ajax’ом, как будто без перезагрузки. Принцип эффекта: при переходе по ссылке плавно скрываем изменяемую часть контента, и при загрузке новой плавно ее Читать далее »

Массовое редактирование свойств товаров

Массовое редактирование свойств товаров

Быстрое изменение товаров Для того чтобы массово отредактировать товары woocommerce нужно установить плагин Woocommerce advanced bulk edit. В репозитории плагинов WordPress его нет, он платный. Если поискать на просторах интернета Читать далее »

/ /
Json Начало

Json Начало

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

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

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

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