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

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

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

Блог про WordPress
Комментарии: 20
  1. Alex

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

  2. izmoroz

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

  3. Fring

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

  4. Фарид

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

  5. Мой блог

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

  6. Fylhtq

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

  7. Кирилл Малахов

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

    1. Дмитрий (автор)

      К сожалению, живых примеров применения плагина не обнаружил.

  8. Игорь

    Приветствую! Спасибо за статью. С вашей помощью я нашел этот замечательный плагин.
    Однако в приведенном вами коде
    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;

    });
    получается не совсем ожидаемый результат. Изменяется не один заголовок ‘soccer’, а все заголовки на сайте. Кроме того, они заменяются не на ‘football’, а на $country. Но это так, частности.
    А вообще у меня вопрос: у меня на сайте записи помечены значением ‘city’ в произвольном поле ‘gorod’, путем вывода шорткода из этого плагина , и я хочу указать условие фильтрации на замену заголовков по значению $city из плагина и из произвольного поля. Попытка указать
    add_filter( ‘the_title’, function( $title ) {
    $userInfo = geoip_detect2_get_info_from_current_ip();
    $city = $userInfo->city->name;
    $values = get_post_meta( $post_ID, ‘gorod’, true);

    if ($city !== $values ) {
    $title = str_replace( ‘the_title’, ‘пам пам’, ‘тарам тарам’ );
    }

    return $title;

    });
    не дает результата. Проблема в том, что функция не видит $values.

    Пожалуйста, помогите понять ошибку и исправить ее.
    Спасибо.

    1. Дмитрий (автор)

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

      Если не видит переменную values, попробуйте сделать ее глобальной.

      global $values;

  9. Игорь

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

    if ($values ) {
    $title = str_replace( ‘the_title’, ‘пам пам’, ‘тарам тарам’ );
    }

    return $title;

    });

  10. Алексей

    Спасибо.Очень помогает.

  11. Роман

    Кто подскажет как поправить или куда именно смотреть что бы решить проблему.
    Задаю вопрос в Гугле на русском языке, выдача дает украинскую страницу. Правда не все страницы, но много. Что очень не в тему. Как это поправить?
    В настройках шаблона и плагина везде стоит, основной язік русский
    Сайт в данных

    1. Дмитрий (автор)

      Для поисковиков есть рекомендации ставить rel=”alternate” hreflang=”x” для языковых версий.
      Погуглите про это подробнее, чтобы понять, как это работает.

  12. Роман

    А как корректно спросить, не подскажете ?

  13. Дмитрий (автор)

    Рекомендации гугла: https://support.google.com/webmasters/answer/189077?hl=ru

    Рекомендации Яндекса: https://yandex.ru/support/webmaster/yandex-indexing/locale-pages.xml

    В принципе, там все похоже.

  14. Смешной

    Спасибо за столь интересную и полезную статью. Добавил в закладки.

  15. Евгений

    Как насчёт библиотеки определения геолокации посетителя сайта по IP с использованием библиотеки nikolaevevgeGeoIp, работающей с wordpress, bitrix, joomla?

    О библиотеке тут http://blog.ivru.net/?id=82

    Например нам нужно выводить определённые данные для города Тверь иначе другие
    require(«nikolaevevgeGeoIp.php»);
    $geoAr = nikolaevevgeGeoIp::get($_SERVER[«REMOTE_ADDR»]);

    if ($geoAr[«city»] == «Тверь») {
    echo «Текст для города Тверь»;
    } else {
    echo «Текст для других городов»;
    }

    Библиотека не требует скачивания базы данных, для работы используется API выполненные запросы кешируются в локальную базу данных сайта. Библиотека автоматически определяет CMS и создаёт нужные таблицы в BD. Логин и пароль соединения с базой не требуется, поскольку библиотека использует драйвер для работы с базами данных соответствующей CMS.

  16. Роман

    Спасибо, Дмитрий! Отличная статья.

    К сожалению с плагином Geolocation IP Detection не сталкивался, но надо посмотреть. Интересно как там реализовано обновление базы GeoIP.

    Для настройки геолокации и геотаргетинга по городам России могу порекомендовать плагин WT Geotargeting: https://web-technology.biz/cms-wordpress/plugin-wt-geotargeting/

    Я этот плагин разработал, в своё время, специально для определения городов России. А в одной из недавних версия добавил поддержку неплохого сервиса геолокации DaData.

    1. Дмитрий (автор)

      Роман, благодарю за дополнение статьи.

      Про твой плагин слышал и читал VK. Считаю, что очень полезный инструмент для пометок российских геолокаций.

Добавить комментарий для Fylhtq Отменить ответ

Получать новые комментарии по электронной почте.