Информация Геолокация для Contact Form 7

Ivan45

Постоялец
Регистрация
22 Янв 2015
Сообщения
59
Реакции
145

Вам нужно знать
местоположение клиента, который написал вам с вашего сайта через форму Cоntact Form 7? Да не вопрос.
Версия Contact Form 7, на момент написания статьи, 5.0.5 (04.09.20 - обновил часть статьи до версии 5.2.2)

Создадим почтовый тег, который будет передавать IP клиента стороннему сервису, а мы от него получать страну, область и город (на самом деле, не только их, но в рамках этой инструкции я покажу только их; с полным выводом можно ознакомиться Для просмотра ссылки Войди или Зарегистрируйся) в формате JSON, а затем преобразуем в человеко-понятный. [_city_ip] — этот тег в дальнейшем будет заменяться страной, областью и городом отправителя. Сервис будем использовать sypexgeo, рекомендую зарегистрироваться на нем и получить (в личном кабинете) ключ веб-сервиса (в данной инструкции мы будем отсылать запрос к их базе используя, как ключ, так и без него), ибо после регистрации будет доступно 30 тысяч запросов к их базе, вместо 10 тысяч, плюс можно наблюдать сколько запросов было к базе (в личном кабинете).
  1. Идем в папку с плагином по адресу: /wp-content/plugins/contact-form-7/includes
    Файлы, которые нам нужны - открываем их для редактирования: submission.php и special-mail-tags.php, а также по адресу: /wp-content/plugins/contact-form-7/modules файл flamingo.php.
  2. Займемся сначала submission.php.
    Поиском ищем по файлу фразы: remote_ip и далее буду показывать на скриншотах и вставлять код для удобства копирования.

    2.1

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    'city_ip' => $this->get_city_ip_addr(),
    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    $city_ip = $this->get_city_ip_addr();
    PHP:
    'city_ip' => $city_ip,

    2.2

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    $this->get_meta( 'city_ip' ),

    2.3

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    private function get_city_ip_addr() {
            $is_bot = preg_match("~(Google|Yahoo|Rambler|Bot|Yandex|Spider|Snoopy|Crawler|Finder|Mail|curl)~i", $_SERVER['HTTP_USER_AGENT']);
            $geo = !$is_bot ? json_decode(file_get_contents("https://api.sypexgeo.net/ключ/json/".$_SERVER['REMOTE_ADDR']), true) : [];
            $city_ip_addr = $geo['country']['name_ru'] . ", ". $geo['region']['name_ru'] .  ", " . $geo['city']['name_ru'];
    
            return apply_filters( 'wpcf7_city_ip_addr', $city_ip_addr );
        }
    Вместо "ключ" в ссылке - вставляем ключ из личного кабинета Для просмотра ссылки Войди или Зарегистрируйся.
    Не хотите регистрироваться? Зря. Тогда вместо api.sypexgeo.net/ключ/json/ вводите: api.sypexgeo.net/json/

    В $is_bot мы отсеиваем обращения ботов к базе, чтобы они не тратили установленный системой лимит запросов.
    В $geo мы делаем запрос с IP клиента к их базе, чтобы затем в $city_ip_addr сформировать страну, область и город.

    Внимание! Начиная примерно с лета 2020 года, перестал работать скрипт (на почту приходят пустые значения), если ссылка api.sypexgeo.net/ключ/json/ начинается с https, я поменял на http, так работает, техподдержка молчит.

    2.4

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    $target[] = $this->get_meta( 'city_ip' );
  3. Теперь займемся файлом special-mail-tags.php.
    Так же поиском ищем по файлу фразы: remote_ip.

    3.1

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    if ( '_city_ip' == $name ) {
            if ( $city_ip = $submission->get_meta( 'city_ip' ) ) {
                return $city_ip;
            } else {
                return '';
            }
        }

  4. Теперь займемся файлом flamingo.php.
    Так же поиском ищем по файлу фразы: remote_ip.

    4.1

    Для просмотра ссылки Войди или Зарегистрируйся
    PHP:
    'city_ip',

    С файлами покончено, займемся шаблоном письма.

  5. В админке Wordpress переходим в плагин Contact Form 7, затем в вашу созданную форму, затем во вкладке "Письмо -> Тело письма" вставляем созданный нами новый почтовый тег в то место, где вам надо вывести в письме страну, область и город: [_city_ip]

    У меня это выглядит вот так:
    Для просмотра ссылки Войди или Зарегистрируйся

    На почту придет вот так:
    Для просмотра ссылки Войди или Зарегистрируйся

    Переменная выводит то, что нам надо в формате: "Страна, Область, Город".
    Если нужен другой формат, то правится в файле submission.php в переменной:
    PHP:
    $city_ip_addr = $geo['country']['name_ru'] . ", ". $geo['region']['name_ru'] . ", " . $geo['city']['name_ru'];
 
Последнее редактирование:
Сверху