Как подружить Яндекс Метрику с публичными формами

Делитесь своими плагинами и темами оформления.
Ответить
Аватара пользователя
mailarn
Инвестор
Инвестор
Сообщения: 164
Зарегистрирован: 18 июн 2021, 10:33
Имя: Антон
Откуда: Екатеринбург
Контактная информация:

Как подружить Яндекс Метрику с публичными формами

Сообщение mailarn »

Появилась необходимость через Яндекс метрику вести статистику публичной формы.
Стандартная цель метрики JavaScript-событие никогда не может посчитать точное количество отправки формы.
Идею сделать onclick= на кнопку отправки формы или onsubmit= на форму пришлось отмести сразу.
Сделал учет событий отправки данных формы по факту добавления данных в БД.

Вот пошаговая инструкция как это сделать

1.
В настройках счетчика метрики активируем Measurement Protocol
Настройки счетчика - Дополнительные настройки - Безопасность и использование данных - Поставить галочку
2.
Сохранить Токен доступа Measurement Protocol
3.
Создать цель JavaScript с Идентификатором цели, например savetocrm
4.
В файл template/public_layout.php добавить код счетчика Яндекс метрики перед тегом </head>
5.
В сущность, которая является публичной формой добавить поле ym_client_id. В это поле будет записываться Идентификатор клиента (ClientID) Яндекс метрики.
В данном примере ID поля 240
6.
В настройки публичной формы в поле JS вставляем следующий код. Этот код будет извлекать из куков счетчика Яндекс метрики ClientID и подставлять его в поле ym_client_id
В первой строчке поменяйте ID счетчика на свой и измените fields[240] на свое id поля.

Код: Выделить всё

    // ID вашего счетчика Яндекс.Метрики
    var yaCounterId = 99999999;

    function setYaClientId() {
        // Пытаемся получить объект счетчика каждые 300 мс, но не более 30 попыток (9 секунд)
        var attempts = 0;
        var maxAttempts = 30;
        var checkInterval = setInterval(function() {
            attempts++;
            // Проверяем, инициализирован ли нужный счетчик и есть ли метод getClientID
            if (typeof window['yaCounter' + yaCounterId] !== 'undefined' && 
                typeof window['yaCounter' + yaCounterId].getClientID === 'function') {
                
                var clientId = window['yaCounter' + yaCounterId].getClientID();
                if (clientId) {
                    var field = document.getElementById('fields_240');
                    if (field) {
                        field.value = clientId;
                        // Для надёжности также пробуем установить по name (если форма с name="fields[240]")
                        var fieldByName = document.querySelector('input[name="fields[240]"]');
                        if (fieldByName && fieldByName !== field) {
                            fieldByName.value = clientId;
                        }
                    }
                }
                clearInterval(checkInterval);
                return;
            }
            
            if (attempts >= maxAttempts) {
                clearInterval(checkInterval);
                console.warn('Yandex Metrica counter not loaded in time, clientId not set');
            }
        }, 300);
    }
    
    // Запускаем, когда DOM готов
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', setYaClientId);
    } else {
        setYaClientId();
    }
7.
Протестируйте публичную форму, если в поле ym_client_id записывается много цифр, то значит скрипт работает, тогда в настройках - Пользовательский css можно скрыть это поле от пользователей

Код: Выделить всё

#public_form .form-group-240 {
  display: none;
}
8.
Создаем автоматизацию - действие при добавлении записи - php код
Эта автоматизация отправит напрямую в Яндекс метрику данные по цели JavaScript-событие

Код: Выделить всё

$counterId = <id вашего счетчиа>;
$secretToken = '<ваш токен>'; //смотри п.п.2
$goalId = 'savetocrm'; //Идентификатор цели JavaScript-событие
$clientId = [240]; //поле с ClientID
$pageUrl = '<url страницы публичной формы>';

$url = 'https://mc.yandex.ru/collect?tid=' . $counterId . '&cid=' . $clientId . '&t=event&ea=' . $goalId . '&ms=' . $secretToken . '&dl=' . urlencode($pageUrl);

file_get_contents($url);
Это гарантированно 100% точный способ отслеживать заполненные публичные формы по факту записи в базу данных.

После срабатывания события данные в статистику Яндекс метрики попадают примерно через 20 минут!
Создание отраслевых решений на базе CRM Руководитель https://webus.pro
Ответить