Реализуем геолокацию на WordPress-сайте с помощью 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