Реализуем геолокацию на WordPress-сайте с помощью GeoIP

Дата публикации:Март 1, 2015

Онлайн-бизнес несет в себе одно важное преимущество – он позволяет охватить клиентов со всего мира. Естественно, такой подход создает уникальные сложности, поскольку пользователи в разных странах и регионах имеют специфические потребности, подпадают под разные законы. Если брать в качестве примера сайты электронной коммерции, то для них представление о посетителях (их географическом расположении) позволяет сразу же вычислять налоговые ставки. Некоторые товары, которые вы предлагаете, могут быть запрещены в тех или иных регионах, и этот вопрос также нужно рассмотреть.

geoip

Для таких сайтов очень важную роль играет геолокация, т.е. возможность программно распознавать расположение посетителя, регион, или даже долготу и широту. Обычно это делается при помощи базы данных GeoIP от Maxmind. Эта бесплатная база данных используется для перевода IP-адреса в геолокационные данные.

Есть несколько WordPress-плагинов, которые используют эту базу данных, чтобы создавать интересные вещи. К примеру, есть плагин, который позволяет автоматически переключаться на переведенную версию сайта, если такая доступна в WPML, на основе региона пользователя. Есть даже расширение для WooCommerce, которое позволяет устанавливать разные цены в зависимости от географического расположения пользователя.

GeoIP – очень полезная технология для всех типов приложений. Вычисление налога с продаж на основе географического расположения стало очень важным фактором вследствие изменений в европейских законах VAT (налог на добавленную стоимость). Также можно привести приложения, которые выводят рекламу в зависимости от географического расположения; существуют приложения, которые блокируют продажи определенных продуктов на определенных рынках.

Разработка сайтов WordPress, определяющих георасположение с помощью GeoIP

GeoIP Detect – это бесплатный плагин, который автоматически обновляет базу данных GeoIP и предлагает вам набор полезных функций для получения специфичной в плане географического расположения информации о пользователях (на основе IP-адреса).

После своей установки плагин предложит вам установить свежую базу данных GeoIP. Как только это будет выполнено, вы будете перенесены на экран настроек.

Здесь вы можете вручную обновить данные GeoIP – сам плагин будет автоматически обновляться раз в месяц. Вы можете также добавить класс с кодом страны к тегу body. Если ваша тема использует функцию body_class() (как это обычно и происходит), вы можете использовать данный тег для создания специальных правил CSS для разных географических локаций.

Плагин дает вам практически все, что вам нужно для создания контента, зависящего от географического расположения. К примеру, если вы хотите отфильтровать заголовки записи, касающиеся, скажем, футбола, в зависимости от локации, вы можете написать следующее:

add_filter( 'the_title', function( $title ) {
	$geoip = geoip_detect2_get_info_from_current_ip();
	$country = $geoip->raw[ 'country' ][ 'iso_code' ];
		if ( 'US' !== $country ) {
		$title = str_replace( 'soccer', 'football', $country );
	}
 
	return $title;
 
});

Мы используем функцию geoip_detect2_get_info_from_current_ip(), которая предлагается данным плагином. С ее помощью мы получаем код страны ISO, состоящий из 2 букв. Если этот код не является US, то в таком случае мы меняем слово soccer на football.

Это – упрощенный пример, однако я надеюсь, что вы поймете, как вы можете использовать данный тип информации о ваших пользователях для генерации динамического контента. К примеру, похожий код может использоваться для замены кнопки «Купить/Добавить в корзину» на уведомление о том, что данный продукт недоступен в соответствующей стране или в определенном регионе этой страны.

Свойство, расположенное в объекте, который функция возвращает, содержит массив полезной информации. Следующий фрагмент кода демонстрирует, как получить долготу, широту и часовой пояс текущего пользователя. Затем вы сможете использовать эти данные для вывода магазинов, ближайших к пользователям, со временем работы, которое будет задано в верном часовом поясе. Или вы можете использовать код для направления посетителей к самому подходящему событию.

$location_data = geoip_detect2_get_info_from_current_ip( )->raw;
$location = $location_data[ 'location' ];
$longitude = $location[ 'longitude' ];
$latitude = $location[ 'latitude' ];
$timezone = $location[ 'time_zone' ];

Кэширование и GeoIP

Проблема GeoIP – то, что определение геолокации не работает с традиционной полностраничной системой кэширования. Обычно такая система хранит обработанный HTML-файл каждой страницы на вашем сайте. Таким образом, системе просто нужно создать страницу, выполнив весь PHP-код и запросы к базе данных, которые она включает. Естественно, если у вас всего одна версия вашего сайта, которая выдается всем пользователям, то в таком случае любой тип динамического контента, как, к примеру, контент, зависящий от географического расположения, не будет работать.

Решение этой проблемы – использование фрагментарного кэширования. Этот метод, известный как частичное кэширование страницы, позволяет вам кэшировать определенные участки страницы, или даже только запросы к базе данных, в то время как динамично генерируемый контент будет загружаться на странице. Такая методика часто используется на сайтах сообществ, которые имеют небольшой объем контента, выводимого для разных пользователей.

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

Я рекомендую кэшировать результаты поиска по базе данных GeoIP в недолговечных transient’ах. Вот простая функция, которая позволяет получить геолокационные данные для IP-адреса, при этом используя кэширование данных там, где это возможно:

function slug_geoip_data() {
	  $ip = geoip_detect2_get_client_ip();
	  $cache_key = 'geoip_cache' . $ip;
	  if ( false == ( $location = get_transient( $cache_key ) ) ) {
			 $location_data = geoip_detect2_get_info_from_ip( $ip );
			 if ( is_object( $location_data ) ) {
				$location = $location->raw;
				$location = $location_data[ 'location' ];
				set_transient( $cache_key, $location, 99 );
			 }
	  }
 
	  return $location;
 
}

Есть несколько плагинов кэширования, которые могут использовать разный кэш для географический версий сайтов, основанных на GeoIP. Следующая статья, опубликованная на WPtest, предлагает прекрасное описание опций, доступных для реализации кэширования, совместимого с GeoIP . С ростом известности GeoIP будут появляться все новые и новые плагины кэширования, которые будут иметь поддержку этого сервиса.

Источник:http://torquemag.io

Поделиться

8 комментариев

  1. Alex says:

    Большое спасибо, Дмитрий за ценную информацию! Отложил в «копилку» )

  2. izmoroz says:

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

  3. Fring says:

    Какие есть варианты показа разной рекламы разным пользователям?
    Например, пользователям из России показывать рекламу из одной рекламной сети, а пользователям из США из другой?
    Если использовать рекламные сети параллельно, тогда очень загруженной получается страница.

  4. Здравствуйте!
    Спасибо за информацию. У меня вопрос. Плагин и базу установил. Подскажите как мне определенную страницу показывать пользователям из другой страны?

  5. Попробуем поставить. Можете мне дать пару советов еще, как привлечь иностранный трафик? Жду ответа, и оцените пожалуйста мой сайт:)

  6. Fylhtq says:

    Спасибо, очень полезная статья да и плагин тоже. Скажите, как можно технически реализовать с помощью данного плагина вывод того или иного рекламного баннера в pop up в зависимости от страны посетителя? Думаю, это будет полезно многим, кто монетизирует трафик.
    Спасибо.

  7. Спасибо за статью. Буду тестировать этот плагин.
    P.S. Было бы здорово если бы в статье были еще ссылки на пару живых примеров, показывающих что возможно реализовать на этом решении.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.