17 ответов

  • 0
    Алексей Webasyst 3 октября 2016 22:41 #

    По шаблону https://yandex.ru/support/metrika/data/e-commerce.... добавляете скрипты для нужной информации. Технически никаких сложностей нет.


    • +2
      cofix cofix 3 октября 2016 22:48 #

      Скрипты добавил в файлы

      checkout.success.html

      cart.html

      product.cart.html

      product.html

      добавлял без {literal}

      но сбор статистики не происходит


  • 7
    def 10 февраля 2017 03:15 #

    Перекопал всю эту базу знаний, ничего кроме "тут несколько раз всё писали" и "мы сделаем вам со скидкой" не нашел. При этом вопрос у людей возникает, и странно, почему было бы не сделать один раз подробное описание, что и куда прописывать. Буду в эту ветку писать всё, что получилось настроить, очень рассчитываю на помощь более опытных участников форума.

    Сижу ковыряюсь с подключением yandex ecommerce. Удалось подключить учет просмотра товаров, для этого:

    1. Установил в шаблон магазина в перед закрывающим тегом head(можно сразу после открывающего body) код метрики с отслеживанием ecommerce dataLayer( отдельная галочка при формировании кода счетчика)
    2. Выше кода метрики в head прописал:

    <script type="text/javascript">
    <strong>window.dataLayer</strong> = window.dataLayer || [];
    </script>

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

    3. Дальше разобрался, как добавить отслеживание в карте товара. В файл product.html(шаблон карты товара) вверху добавил следующую конструкцию:

    <script type="text/javascript">
        dataLayer.push({
            'ecommerce' : {
                'currencyCode': 'RUB',
                'detail' : {
                    'products' : [
                        {
                          'name' : '{$product.name|escape}',
                          'id' : '{$product.id}',
                          'price' : {$product.price},
                          'brand' : '{$product.features.vendor}',
                          'category' : '{if count($product.categories) > 0}{foreach 
    $product.categories as $c}{if 
    $c.status}{$c.name|escape}{/if}{/foreach}{/if}'
                        }
                    ]
                }
            }
        });
    </script>
    

    По результату это позволило мне получить в метрике отображение посещения карт товаров(В метрике > Отчеты > Стандартные > Электронная коммерция > Популярные товары). Это уже что-то.

    Осталось два важных участка:

    1. Отслеживание добавления/удаления в корзину(пока до конца не понял где)
    2. Отслеживание отправки итоговой транзакции(в файле checkout.success.html)

    Теперь пытаюсь понять, как правильно сделать dataLayer.push при добавлении в корзину. Подумал, что нужно либо в js-обработчик adding2cart добавить, либо в onClick на кнопку Купить. Ковырял обработчик, но так и не понял как получить там id товара.
    На этом этапе нужно минимально передать id и quantity вот такой примерно конструкцией:

    dataLayer.push({
            'ecommerce' : {
                'add' : {
                    'products' : [
                        {
                          'id' : '{$product.id}',
                          'quantity' : 1,
                        }
                    ]
                }
            }
        });

    qantity передаю просто цифрой, так как у меня нет возможности добавлять произвольное количество товара, товар добавляется 1 клик - 1 штук. Понимаю, что вызов {$product.id} в js не будет работать, но никак не пойму, как правильно написать. Буду рад любой помощи.

    Этот пост сохранил, если разберусь сам - обязательно допишу до конца, как все получилось. Всем добра!






  • 4
    def 10 февраля 2017 13:18 #

    Как и обещал, пишу в этом треде дальше, что у меня получается.

    Напишу здесь один несущественный но, как мне кажется важный момент:

    Когда настраиваете статистику, обязательно примите во внимание, что данные в метрике обновляются с небольшим лагом!

    ДОБАВЛЕНИЕ В КОРЗИНУ


    Решил идти путем через onclick. Понятно, что для красоты можно вынести код в функцию, и ее уже вызывать в onclick, Но для наглядности делаю прям по месту. В product.cart.html добавил в input кнопки "Купить" вот такую штуку(оказалось не совсем правильно):

    onclick="dataLayer.push({
            'ecommerce' : {
                'add' : {
                    'products' : [
                        {
                          'id' : '{$product.id}',
                          'quantity' : 1,
                        }
                    ]
                }
            }
        });"<code class="javascript"></code>


    Заработало, стал считать добавления, но неправильно отображал их в статистике метрики - стал показывать id вместо имени. Чтобы все заработало как надо вернул параметр name, получилось так:

    <input type="submit" {if !$product_available}disabled="disabled"{/if}
     value="{if $wa->shop->cart->total() > 0}[`Add to 
    cart`]{else}[`Buy now`]{/if}" onclick="dataLayer.push({
            'ecommerce' : {
                'add' : {
                    'products' : [
                        {
                          'id' : '{$product.id}',
                          'name' : '{$product.name|escape}',
                          'quantity' : 1,
                        }
                    ]
                }
            }
        });">


    УДАЛЕНИЕ ИЗ КОРЗИНЫ

    В файле cart.html Нашел блок <!-- cart item -->

    В нем нашел кнопку удаления товара(с классом .delete) из списка и по аналогии с предыдущим примером добавил в нее onclick:

    <a class="delete" href="#" title="[`Remove from cart`]"  onclick="dataLayer.push({
            'ecommerce' : {
                'remove' : {
                    'products' : [
                        {
                          'id' : '{$item.product.id}',
                          'name' : '{$item.product.name|escape}',
                          'quantity' : {$item.quantity},
                        }
                    ]
                }
            }
        });"> <code class="javascript"></code>

    От добавления товара (см предыдущую конструкцию) Отличается тем что 'add' заменено на 'remove' и добавлен параметр количетсво, а сам вызов происходит через $item.product, а не через $product

    Проверил, вычет из статистики - работает! Правда есть один баг. Если вручную изменить количество товара, а потом нажать удалить, то зачтется вычет измененного количества товаров, а не всего, которое было добавлено изначально. Но думаю что это не самый принципиальный момент, т.к. дальше должен быть checkout-контроль.

    Теперь курю в сторону checkout.success.html , но пока не понимаю, как там притянуть данные заказа. Рад буду услышать любую подсказку, но если не дождусь и разберусь сам, также обязательно напишу сюда.
    Всем пятницы!


    • +1
      macsol macsol 24 марта 2023 12:18 #

      Я выбрал немного другой путь.
      В шаблоне product.cart.html добавил все нужные данные в (data-) параметры
      <form class="v-products-card-add__form js-add-to-cart" method="post" action="/cart/add/" data-price="11176" data-name="Инженерная доска Coswick Дуб Кедр (Cedar) Таверн 15 мм" data-category="Инженерная доска" data-brand="Coswick">

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

      $('.js-main-columns-center').on('click', '.v-products-card-add__button', function() {    
      var $element = $(this);    
      var $form = $element.closest('.v-products-card-add__form');   
      
      //передача в ecommerce   
      dataLayer.push({  
      'ecommerce': {   
          'currencyCode': 'RUB', 
           'add': {  
               'products': [            { 
                             'id': String($element.data('added-id')), 
                             'name': $form.data('name'),
                             'price': parseFloat($form.data('price')), 
                             'brand': $form.data('brand'), 
                             'category':  $form.data('category'),
                             'quantity': 1  }   ]  }  }   });    
      
      //передача события в метрику 
      ym(62097127,'reachGoal','addtocart');   
      
      });


      Если в каком либо месте (например в плагине "купить в 1 клик" не хватает данных, например бренда, можно написать собственную функцию. Пример получения характеристики по id товара.


      Создаем файл shopMacsol.class.php, название shopMacsol можно поменять на своё (при этом не забыть поменять название класса и вызова).


      /wa=apps/shop/lib/classes/shopMacsol.class.php

      В файле размещаем код

      <?php

      class shopMacsol
      {

      // Возвращает массив характеристик по id товара public static function GetProductFeatures($id) {

      $model = new shopProductFeaturesModel();
      return $model->getValues($id);

      }


      //Возвращает характеристику по id и её коду.
      //Если характеристика отсутствует, возрат "Не определен"
      public static function GetFeature($id,$feature_name){ $features = self::GetProductFeatures($id);

      return (array_key_exists($feature_name,$features) ? $features[$feature_name] : 'Не определен'); }
      }



      После сброса кеша в шаблонах станет доступен вызов {shopMacsol::GetProductTypes(product.id,'brand')}

      По аналогии можно создавать различные функции вызываемые из шаблона.

  • 0
    Eugen Nichikov 10 февраля 2017 13:44 #

    Столько действий, чтобы не заплатить 659 руб. :)

    • +4
      def def 10 февраля 2017 17:03 #

      Дело отнюдь не в деньгах. Мы для текущего проекта покупаем программные решения и подороже. Дело в том, что на простой вопрос в нескольких тредах все почему-то стараются уйти от ответа, закрадывается сомнение, что с документацией грусть потому что хочется побольше настругать вот этих 600-700 р.

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

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


      Имхо, это вредит развитию довольно неплохого движка в целом. Очень не хватает аналога wp-kama для вордпресса. https://developers.webasyst.ru/ у меня открыт на соседнем экране. Но у меня не получается найти в нем описания очевидных для каждого интернет магазина вещей. Я все понимаю, что монетизация. Но мы ведь купили в конце концов лицензию, даже партнерку оформили, и идеальной была бы такая ситуация, что в следующий раз на переговорах мы без задней мысли рекомендовали бы клиенту Webasyst + SS не задумываясь о том, что нам придется вновь и вновь читать бесполезные комментарии при разработке нового проекта. Это личное мнение. И я стараюсь исправить ситуацию, чем могу, поэтому пишу подробное описание проблемы, которая судя по истории Хаба возникает у людей периодически, но которую почему-то никто толком так и не осветил.

      Поэтому читаем код )

      По сабжу, Можете что-то толковое по $order посоветовать? Где посмотреть структуру этого массива с описанием стандартных полей?
      Если я верно понял именно оттуда надо выьщить состав заказа, для того чтобы отправить финальные метрики.

      • +2
        Eugen Nichikov Eugen Nichikov 10 февраля 2017 17:41 #

        Партнёрам за 325р.

        {wa_dumpc($order)} в checkout.success.html или {debug}

        Можно (вроде) и {waLog::dump($order, 'dataLayer.log')}

      • +1
        Ren Ren 13 февраля 2017 23:15 #

        Не разобрался с checkout.success.html?

        Тоже мучаю эту тему, пока сделал такой "полурабочий" вариант:


        <script type="text/javascript">
        dataLayer.push({
        'ecommerce' : {
        'purchase' : {
        'actionField': {
        'id' : {$order.id},
        },
        'products' : [
        {foreach $order.items as $item}
        {
        'name' : '{$item.name|default:" "}',
        'id' : '{$item.id}',
        'price' : {$item.price},
        'quantity' : {$item.quantity}
        }
        {/foreach}
        ]}}});
        </script>

        В итоге, все данные по заказу получает, но в Метрике почему-то не учитываются.

        • +1
          Ren Ren 14 февраля 2017 00:49 #

          Извиняюсь, наврал. Вариант рабочий, только кавычки упустил.

          Ошибка в 'id' : {$order.id},

          Правильно: 'id' : '{$order.id}',

          Для полного счастья, осталось к названию товара прикрутить наименование артикула. В "покупке" он автоматом прикручивается в поле $item.name, в остальных случаях его надо как-то добавлять к названию. А то товар при наличии "наименования артикула" (варианты покупки) в метрике считается как разный. Пока мучаюсь.

      • +1
        list list 2 сентября 2017 00:20 #

        Спасибо огромное за идею с ecommerce. У меня другой движок, но суть оказалась та же самая.

    • +1
      Виталий Виталий 23 мая 2018 14:58 #

      2400 - не хотите!...

  • 1
    Тоторо 24 июня 2017 09:51 #

    Коллеги, добрый день!
    Прошу помощи, полностью по вашему сабжу.

    На данный момент, плагин на который вы ссылаетесь стоит уже 2399 руб.

    По сему, я предполагаю, он стал мега рабочим и полностью решающим все задачи касаемо:

    Ecommerce от Яндекс

    Если не сложно, дайте обратную связь. Работает, а?!

  • 1
    Vladislav Rakhnyanskiy 11 декабря 2017 23:08 #

    Народ, так что в итоге-то?


    • +1
      Виталий Виталий 23 мая 2018 15:01 #

      что что - плати деньги товарищам)) они все настроят! Инструкций нет нихрена...

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите