Как добавить цель «JavaScript-событие» на кнопку «Добавить в корзину» в WooCommerce?

Дано: Интернет магазин под управлением WordPress + WooCommerce.

Задача: Отследить успешное добавление товара в корзину пользователем и передать эту информацию для аналитики в Яндекс Метрику.

Решение: решить подобную задачу можно разными способами: на стороне клиента, исключительно за счёт JavaScript и на стороне сервера — на PHP.

Требования к сайту

При создании цели важно учитывать:

  • Форма должна быть создана с помощью тега form. Если форма сделана через теги div, она отслеживаться не будет.
  • Отправка формы должна выполняться через элементы button type=»submit» и input type=»submit». Если отправка реализована через элемент button type=»button», цель достигаться не будет.
  • Элементы button type=»submit» и input type=»submit» должны находиться внутри элемента form.

Если форма обрабатывается с помощью JavaScript, цель будет работать только для стандартного события onSubmit.

https://yandex.ru/support/metrica/simple-goal/form.html

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

кнопка добавить в корзину

Мы видим элемент кнопки (button) и наличие атрибутов, которые могут помочь «зацепиться» за этот элемент и «повешать» на него нужное нам событие. Также наша кнопка находится в теге <form> , что говорит о соответствии условиям описанных в документации Яндекс Метрики.

Забегая вперёд отмечу, что для точности передачи данных лучше вешать это событие на отправку формы, а не на клик по кнопки (хотя для некоторых задач подойдет именно клик, например, когда вы хотите просто проверить интерес к чему либо, к новому разделу на сайте).

Пример того, как делать не стоит!

<form action="" method="POST" type="submit">

    <input name="name" placeholder="Ваше имя" required> <br>

    <input type="email" name="mail" placeholder="Ваш email" required> <br>

    <input type="button" onclick="yaCounterXXXXXX.reachGoal('form2'); return=true;" value="Отправить">

</form>

В этом случае в Метрику будет отправлена информация по всем кликам, совершенным по кнопке “Отправить” — даже если посетитель не заполнил форму.

https://yandex.ru/blog/metrika-club/kak-pravilno-nastroit-reachgoal-v-formakh

Добавление цели в Яндекс Метрики

Первым делом, нам нужно создать цель в личном кабинете Яндекс Метрики:

1. добавляем цель

Выбираем JavaScript-событие и присваиваем этому событию уникальное имя для дальнейшего отслеживания. В примере ниже, мы можем наблюдать, как после создания идентификатора цели ниже, мы можем наблюдать готовую строку кода, который необходимо будет вызвать на наше событие:

2. Выбираем JavaScript-событие

Готово! Часть задачи мы выполнили. В личном кабинете Яндекс Метрики создана наша цель:

цель события добавления в корзину

Решение на JavaScript

Теперь, мы можем смело приступать к дальнейшей реализации на стороне сайта.

В качестве селектора (выбираемого из DOM элемента) у нас выступает тег form с классом «cart». Наш скрипт может выглядеть примерно так:

Вариант №1

document.addEventListener("DOMContentLoaded", (event) => {
    const cartForm = document.querySelector("form.cart");

    if(cartForm){
        cartForm.addEventListener('submit', function () {
            ym(XXXXXX, 'reachGoal', 'TARGET_NAME');
        });
    }
});
  • XXXXXX — номер вашего счетчика.
  • TARGET_NAME — идентификатор цели.

Пояснение: мы получили наш элемент формы и наблюдем через подписку на событие submit за её успешной отправкой (добавление в корзину — это и есть в нашем случае отправка формы)

Вариант №2

...
<form action="" method="get" onsubmit="ym(XXXXXX, 'reachGoal', 'TARGET_NAME'); return true;">
    ...
</form>
...

Если приглядеться к примеру указанному на сайте Яндекс Метрике, то мы можем заметить, что можем разместить вызов функции Яндекс Метрики (ym) прописав его в атрибут onsubmit нашей формы добавления товара в корзину.

В этом случае наш код немного изменится:

document.addEventListener("DOMContentLoaded", (event) => {
    const cartForm = document.querySelector("form.cart");

    if(cartForm){
        cartForm.setAttribute("onclick", "ym(XXXXXX, 'reachGoal', 'TARGET_NAME'); return true;");
    }
});
  • XXXXXX — номер вашего счетчика.
  • TARGET_NAME — идентификатор цели.

Ну вот и всё!

Если вы всё сделали правильно, то при исследовании элемента непременно должны увидеть добавленный атрибут (справедливо для варианта №2)

добавлен атрибут к тегу form

Теперь в Яндекс Метрике, в разделе Конверсии, мы можем ожидать результат её выполнения:

Конверсии

Вот так выглядит выполнение скрипта (цель отработала):

Цель отработала

Обращу внимание, что можно было воспользоваться методом автоматического добавления цели «Отправка формы»:

автоматическое добавления цели

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

автоматическая цель

На этом всё! Парам-Парам-Пам!