Новый способ подключения целей Метрики и Аналитики к формам «WordPress Contact Form 7»

Опубликовано 7 лет назад

Разработчик плагина «Contact Form 7» обещал к концу 2017 года прекратить поддержку хука «on_sent_ok», с помощью которого мы отслеживали действия с формами, подключали цели Яндекс Метрики и Гугл Аналитики.

Не будем ждать когда все отвалится и в панике искать решения. Лучше заранее подготовиться и переустановить код. Я пропущу теоретическую часть. Кому интересно, что такое цели, для чего они нужны на сайте, могут обратиться к моим прошлым публикациям, где я подробно останавливался на этих вопросах. Перейдём сразу к практической технической части.

Подключаем цели Google Analytics к WordPress Contact Form 7

Подключаем цели Яндекс Метрики к Вордпресс плагину «Contact Form 7»

Итак, хуки on_sent_ok и on_submit в Contact Form 7 (WPCF7) скоро перестанут работать. Если вы что-то подключали с их помощью — имеет смысл поискать альтернативные решения. Разработчик рекомендует использовать для отслеживания события DOM. В частности, используемый ранее хук on_sent_ok следует заменить событием wpcf7mailsent.

Полный список DOM-событий доступный в Contact Form 7 версии 4.7

  • wpcf7mailsent — успешная отправка формы;
  • wpcf7invalid — имеются поля с недопустимыми данными;
  • wpcf7spam — подозрение на спам;
  • wpcf7mailfailed — проблема с доставкой;
  • wpcf7submit — передача формы без проверок.

Как видим, есть и другие события, которые тоже могут быть очень полезны, но о них поговорим в другой раз. А сегодня научимся вешать цели на успешную отправку форм, используя wpcf7mailsent. Начнём с Яндекс Метрики.

Яндекс Метрика

Новый способ основан на методе addEventListener. В качестве примера будем использовать цель из моей прошлой публикации «Подключаем цели Яндекс Метрики к WordPress Contact Form 7».

Напомню, она называлась myForm и подключалась так:

on_sent_ok: "yaCounter100500.reachGoal('myForm');"

Теперь она подключается таким образом:

document.addEventListener( 'wpcf7mailsent', function( event ) {
yaCounter100500.reachGoal('myForm');
}, false );

Все просто.

Гугл Аналитикс

Аналогичная картина и с Аналитикой, в старом способе у нас была цель Consultation и подключалась так:

on_sent_ok: "ga('send', 'event', 'Consultation', 'Submit');"

Значит теперь должно быть так:

document.addEventListener( 'wpcf7mailsent', function( event ) {
ga('send', 'event', 'Consultation', 'Submit');
}, false );

Тоже ничего сложного.

Как подключить цели Яндекс Метрики и Гугл Аналитикс одновременно

Интересно, а зачем?

После прошлых публикаций мне неоднократно задавали этот немного странный вопрос, поэтому предположу, что вместе они подключаются примерно так:

document.addEventListener( 'wpcf7mailsent', function( event ) {
yaCounter100500.reachGoal('myForm');
ga('send', 'event', 'Consultation', 'Submit');
}, false );

Работоспособность не проверял.

Куда вставлять код

Способов размещения много, расскажу о некоторых из них.

Самый простой — это вывести код непосредственно в HTML, вставив его где-нибудь в футере активной темы.

<script>
document.addEventListener( 'wpcf7mailsent', function( event ) {
ga('send', 'event', 'Consultation', 'Submit');
}, false );
</script>

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

Но все может быть гораздо проще — многие премиум-темы Вордпресс позволяют внедрять кастомный код прямо в своих настройках. Для внедрения JavaScript достаточно обычного блока установки кода счетчиков, который имеется практически во всех премиум-темах.

Вот так, например, выглядит этот раздел в легендарной теме Авада.

Avada — установка счетчиков

Код отслеживания целей можно разместить следом за уже имеющимися кодами счетчиков. Таким образом он попадет непосредственно в HTML-код всех страниц.

Но JS в HTML — не кошерно, было бы правильнее вынести его во внешний файл. Для этого в активной теме создаём директорию /js, в ней файл goals.js и сохраняем туда весь отслеживающий код. Напомню, в Вордпресс все внешние скрипты подключаются с помощью функции wp_enqueue_script() в файле functions.php или через плагины.

wp_enqueue_script( 'goals', get_template_directory_uri() . '/js/goals.js');

Что делать если много разных форм, много целей

Вариантов тоже несколько.

Например, вынести весь код в отдельный файл, создать для каждой отслеживаемой формы цель и простой обработчик. Для идентификации конкретной формы в дереве DOM-объектов, её родителю нужно задать уникальный класс (или ID). Для этого можно воспользоваться очень полезной функцией Вордпресс body_class(), которая присваивает тегу body все относящиеся к текущей странице классы. В том числе и уникальный page-id, который я использовал в примере ниже.

var myForm = document.querySelector('.page-id-1 .wpcf7');
myForm.addEventListener( 'wpcf7mailsent', function( event ) {
yaCounter100500.reachGoal('myForm');
}, false );

Не исключено, что в вашей теме уже имеется и body_class(), и другая идентификация. Нужно просто открыть HTML-код страницы и проанализировать его структуру.

И ещё, вынося скрипты во внешний файл, нужно понимать, что они будут работать на всех страницах сайта, где загружается JS-файл. Я рекомендую перед использованием addEventListener() обязательно производить проверку на наличие слушаемого объекта на странице.

Например, для двух целей myForm и mySecondForm, размещенных в родительских блоках с классами page-id-1 и page-id-2 проверка будет выглядеть так:

var myForm = document.querySelector('.page-id-1 .wpcf7');
if(myForm){
myForm.addEventListener( 'wpcf7mailsent', function( event ) {
yaCounter100500.reachGoal('myForm');
}, false );
}
var mySecondForm = document.querySelector('.page-id-2 .wpcf7');
if(mySecondForm){
mySecondForm.addEventListener( 'wpcf7mailsent', function( event ) {
yaCounter100500.reachGoal('mySecondForm');
}, false );
}

Если этого не сделать, скорее всего вернется ошибка: Uncaught TypeError: Cannot read property ‘addEventListener’ of null.

В заключение

Я не думаю, что веб-разработчики сильно расстроились от новшеств Contact Form 7.

Все таки обработка и контроль событий DOM даёт более широкие возможности в более привычном, предсказуемом виде, в контексте полного дерева объектов DOM.

Немного пострадают простые пользователи, не имеющие навыков программирования. Но до конца года ещё много времени, и я уверен, появятся более простые, более юзабельные способы установки целей. Возможно в виде сторонних плагинов, а возможно и средствами самого Contact Form 7.

Если что-то не получается, рекомендую ознакомиться с материалами официальных источников.

Успехов! ✌?

Иван Данилин
Автор Иван Данилин

Фулстек веб‑разработчик, специализируюсь на платформе WordPress

Подробнее
Комментарии
  1. Привет. Как поставить разные цели метрики для разных форм на одной странице?
    • Есть новый вид записи для нового формата Метрики типа:
      ym(89731945, ‘reachGoal’, ‘callForm’);

      Если использовать для одной формы на странице, то ок, работает.
      Если использовать конструкцию для разных форм:
      var allForms = document.querySelector(‘#wpcf7-f97-p12-o3’);
      if(allForms){
      allForms.addEventListener( ‘wpcf7mailsent’, function( event ) {
      ym(89750428, ‘reachGoal’, ‘allForms’);
      console.log(‘работает’);
      }, false );
      }
      То не работает.
      Где ошибка?
  2. Здравствуйте, Иван ! Не могу установить цель событие JS. Пробую через плагин Code Snippets Extended не работает, цель не отображается в метрике ?
  3. Код установил, но Аналитика цели так и не фиксирует. Прошла неделя… В чём же проблема?
    • В первую очередь проверьте срабатывает ли событие. Вставьте после ga(‘send’, ‘event’, ‘Consultation’, ‘Submit’); такую строку: alert( ‘Event Ok’ ); и посмотрите будет ли появляться окно при клике по кнопке. Если нет — значит код не выполняется или выполняется с ошибками. Их можно посмотреть в консоли браузера. Если окно появляется, значит проблема с GA.
  4. Добрый день! У всех работает данный код? Я на 10 раз перечитал статью пробовал пробовал, но ничего не получается.. У меня стоит тема xlander..

    Подскажите пожалуйста что я делаю не так, очень нужно цели метрики привязать к форме..
  5. Добрый день! А если у меня на странице несколько форм в разных вкладках и я через события переключал на следующую вкладку при отправке формы. Как это можно сделать сейчас? И возможно ли?
    on_sent_ok: «location.replace(‘http://www.***.com/registration#2’);»

    Зачем они убирают эти хуки? Кучу проблем создали.
    • Добрый день, то же самое на JS
      document.addEventListener( ‘wpcf7mailsent’, function( event ) {
      location.replace(‘http://www.***.com/registration#2’);
      }, false );
      И там в статье смотрите как идентифицировать конкретную форму если их несколько, табы скорее всего имеют какие-то уникальные классы или ID
      А зачем убирают не знаю, к сожалению
  6. для тех у кого шаблон AVADA если пригодиться)
    протестировал и заметил, код
    document.addEventListener( ‘wpcf7mailsent’, function( event ) {
    yaCounter100500.reachGoal(‘myForm’);
    }, false );

    можно просто добавить в кодовый блок на нужно странице, где есть та форма
    http://joxi.ru/krDL3l1hE94LLr.png
    http://joxi.ru/1A55gxQInxbkpA.png

    при этом даже не добавляя в доп. настройки самой формы
    http://joxi.ru/L2198zpC830VX2.png

    Цель срабатывает, все норм
    • при вставке кода в доп. настройки формы
      document.addEventListener( ‘wpcf7mailsent’, function( event ) {
      yaCounter100500.reachGoal(‘myForm’);
      }, false );
      без кода на самой странице который описал выше, цель не работала
  7. Все сделал по инструкции. Но меню Цели http://take.ms/kTL8W не отображает данные.
    В меню события, все ок, данные приходят http://take.ms/LWBDk
    Скрин настройки целей http://take.ms/q6act
  8. А зачем что-то в код прописывать, когда у CF7 есть дополнительные поля? Вот какой должен быть хук в новом формате?
    • Разработчик официально заявил, что поддержка хуков on_sent_ok и on_submit скоро будет прекращена, о новых речи не было, рекомендовано использовать события DOM.

      Источники:

      https://contactform7.com/additional-settings/
      https://contactform7.com/dom-events/
  9. А можно ли обойти добавление page-id через body_class(), просто активировав код отслеживания отправки формы на странице через google tag manager? Без вставки его напрямую в код сайта?
  10. Иван, спасибо за статью, как раз пробую настроить плагин. Я правильно понимаю, что в самой форме, в закладке дополнительно ничего не надо прописывать?
  11. Иван, а как добавить через эти события дополнительный обработчик? Например я хочу форму интегрировать с crm битрикса, чтобы сразу создавались лиды в CRM. Обработчик находится в отдельном файле php
    • Алексей, я не работал с Битрикс24, коллеги подсказывают, что самый простой способ — отправлять ему копию письма и создавать из него лид.
  12. возникла проблема прописал как у вас написано, но аналитика игнорит просто
Добавить комментарий