Visitors: Посетители
Каждому владельцу сайта интересно знать: откуда на сайт пришел посетитель, и что его на сайте заинтересовало?
Особено ценна такая информация о посетителях, которые становятся клиентами. Если клиент сделал заказ через форму на сайте, то нет никаких проблем передать вместе с данными формы информацию о реферере и пути по сайту. Но вот что делать, если клиент звонит по телефону? Расспрашивать его об источнике информации о сайте? О пути по сайту?
Клиенту это вряд ли понравится: он звонит ради своих интересов, а не ради интересов владельца сайта.
Компонент Visitors решает эту проблему. На сайте, где-нибудь в незаметном, но легко обнаруживаемом месте, отображается некий уникальный для каждого посетителя числовой идентификатор.
И менеджеру, принимающему заказы по телефону, остается только попросить клиента продиктовать его. По этому идентификатору он легко получает всю необходимую информацию: откуда пришел клиент, по какому запросу (если с поисковой системы), какие страницы сайта посещал.
Установка и настройка счетчика
Необходимые плагины для работы счетчика
Для работы счетчика необходима установка jquery-плагина cookie.js. Если он у вас ранее не был установлен, то необходимо его прописать в лэйауте (layouts). Помимо этого, надо загрузить файл watch.js из установочного пакета компонента. Эти плагины должны вызываться на всех страницах сайта, где будет работать счетчик.
$this->use_script(CMS::component_static_path('scripts/cookie.js', 'Visitors')); $this->use_script(CMS::component_static_path('scripts/watch.js', 'Visitors'));
В файл css со стилями сайта необходимо поместить стили для плашки с выводимым номером посетителя. Например:
#visitor_number { position: fixed; bottom: 0; left: 10px; padding: 2px 10px 2px 10px; background-color: #47484c; color: #d7d7d9; font-size: 13px; z-index: 1000; } #visitor_number .visitor_uid { font-weight: bold; color: #d7d7d9; }
Далее, необходимо скопировать код, представленный ниже, и поставить его на всех страницах сайта перед закрывающим тэгом </body>.
<div id="visitor_number"> Номер посетителя: <span class="visitor_uid"></span> </div> <script type="text/javascript"><!-- $(function($){ $.detect_visitor(1, {order: 0}); }); //--></script>
Если требуется только сбор статистики по посещениям страниц, то блок с номером посетителя можно не выводить. Статистика при этом будет собираться и выводиться в администраторе.
Фиксация обращений с форм сайта
Существует два способа.
1. Вызывать php-функцию после отправки формы.
Для отправки данных через php в контроллере Component_Visitors_Controller существует метод set_order(). Чтобы, например, фиксировать все обращения со стандатных форм компонента Forms надо вызвать метод on_after_insert($post):
// app/components/Forms/app/Forms/Controller.php ... public function on_after_insert($post) { Core::load('Component.Visitors.Controller'); Component_Visitors_Controller::set_order(); }
2. Передача данных после отправки формы в виде яваскрипт-кода.
На результирующих страницах обращений (которые грузятся после того, как посетитель сайта отправил обращение или заказ) необходимо в код счетчика передавать параметр order равный 1. То есть вместо строки
$(function($){ $.detect_visitor(, {order: 0}); });
должно стоять
$(function($){ $.detect_visitor(, {order: 1}); });
В случае, если форма отправляется скриптом, то после отправки можно просто вызвать функцию detect_visitor c нужным параметром. Например:
$(function($){ function on_sumbit() { //... $.detect_visitor(1, {order: 1}); } });
Далее надо добавить в крон необходимые вызовы.
Настройка крона
В кроне следует настроить скрипт очистки и скрипт формирования отчетов.
0 1 * * * (cd /путь к www/www; /usr/bin/php index.php move_outdated) 0 3 * * * (cd /путь к www/www; /usr/bin/php index.php fill_urls_stat)
Где
- move_outdated - скрипт удаляет устаревшие данные о пользователях. Таковыми считаются лица, не сделавшие заказ за указанное количество дней.
- fill_urls_stat - скрипт отвечает за формирование отчетов по utm-меткам.
Количество дней, через которое информация о пользователях считается устаревшей, можно изменить в администраторе, заполнив соответствующее поле на форме добавления/редактирования проекта. По умолчанию срок 45 дней (для того чтобы успеть залить ежемесячные отчеты о звонках от клиентов).
Дополнительные возможности
После определения идентификатора генерируется javascript-событие visitor_detect, которое можно отследить с помощью jquery и сделать какие-то действия. Например, можно воспользоваться данным событием при формировании кода купона на основе идентификатора посетителя, который затем будет распечатывать пользователь.
$('body').bind('visitor_detect', function(e) { alert(e.visitor); });
Иногда при оформлении заказа через сайт, требуется получить историю перемещения пользователя по сайту.
Для этого достаточно вызвать метод Component_Visitors::history(). Метод вернет массив объектов-урлов с информацией о страницах и времени их посещения. Если функция вызывается без параметра, то история будет определена для текущего посетителя (номер которого записан в куках). Также возможно передать конкретный номер любого посетителя и будет возвращена история именно для него.
Отправка уведомления о заказе по телефону в Google Analytics
Если заказ принимается по телефону, и нужно отследить это действие в Google Analytics, то для этого необходимо произвести следующие действия:
- Нужно убедиться, что на сайте установлен скрипт Google Analytics нового образца (analytics.js)
- В настройках компонента (app/components/Visitors/config/visitors.php) нужно добавить массив следующего вида:
// app/components/Visitors/config/visitors.php 'ga' => array( 'tracking_id' => 'UA-xxxxxxxx-xx', 'Y' => 1, ),
Здесь tracking_id - уникальный ID Google Analytics, его можно найти в коде, предоставляемом GA для размещения на сайте, в следующей строке:
ga('create', 'UA-xxxxxxxx-xx', 'auto');
Y - идентификатор пользовательской переменной GA, обычно предоставляет интернет-маркетолог.
Для отправки уведомления GA есть три способа:
1. Вызвать статический метод
Core::load('Component.Visitors.Utils');
Component_Visitors_Utils::ga_send_call();
Если Метод ga_send_call() вызывается без параметра, тогда номер посетителя будет получен из cookie. В качестве параметра можно передать номер посетителя:
Component_Visitors_Utils::ga_send_call(100);
2. С помощью javascript
$.ga_send_call();
Можно также передать номер посетителя с помощью параметра:
$.ga_send_call(100);
3. Запросить url вида /visitors/ga_send_call/.
Передать номер посетителя можно через параметр: /visitors/ga_send_call/?v=100
Переход со старой версии компонента Visitors на новую
Если требуется переход на новую версию компонента с сохранением всей статистики, следует воспользоваться следующей инструкцией, описанной ниже.
Следует отметить, что в процессе переноса придется на время приостанавливать компонент Visitors на хостинге для корректного переноса старой информации в новую структуру. Однако это время можно минимизировать. Сначала сделать все манипуляции по шагам (до 9 пункта включительно) локально. После отладки на хостинге остановить Visitors, а затем локально остановить отслеживание в лэйауте, локально удалить все таблицы visitors... и old_visitors..., залить свежие с хостинга и проделать все шаги, начиная с 4.
Так как компонент будет уже протестирован, все остальные шаги не займут много времени. Далее необходимо залить visitors таблицы и файлы на хостинг. И останется сделать конвертацию и прочие шаги на самом хостинге (пункт 10 и дальше).
1) Обновить ТАО до актуального состояния.
2) Приостановить старый компонент. Убрать вывод номера посетителя в лэйауте (layout), все его использования закомментировать. Проще всего сделать поиск по слову «Visitors» в проекте. Будут правки, например, в следующем примерном наборе файлов:
- app/layouts/work.phtml
- app/components/Forms/Controller.php
- www/index.php
- другие, если Visitors использовался нестандартно.
3) Выложить файлы на хостинг. Убрать все скрипты связанные с посетителями из крона (так как данные о заказах еще не сконвертированы). После этого сбор статистики остановится, и мы сможем забрать свежий бэкап таблиц visitors и поднять их локально.
Далее начнем локально ставить новый компонент.
4) Переименовать папку app/components/Visitors в app/components/Visitors_ и файл app/components/Visitors.php в app/components/Visitors_.php.
5) Из app/components/.info удалить (на всякий случай забэкапить себе) файл Visitors...
6) Далее необходимо забэкапить данные таблиц, чтобы они не потерялись.
rename table visitors to old_visitors; rename table visitors_archive to old_visitors_archive; rename table visitors_free_ids to old_visitors_free_ids;
7) Теперь установить новый компонент, подключить в index.php и после создания таблицы visitors (проверить ее наличие в базе) прогнать следующий скрипт:
insert into visitors select id, 1, '', ip, last_visit, last_order, '' from old_visitors; insert into visitors_free_ids select id, 1, 0 from old_visitors_free_ids;
8) Выполнить скрипт:
ALTER TABLE `old_visitors` ADD COLUMN `move_url` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `last_order`;
9) После этого необходимо локально наладить и проверить работу нового счетчика. Перед выкладкой удалить записи с локальными посещениями (желательно) из базы и закачать все таблицы visitors... на хостинг, перелить скрипты.
10) Далее следует запустить на хостинге в кроне конвертер, который перенесет историю посещений и заказов. Так как данных бывает много, то это может занять длительное время. В скрипте, который сейчас есть в библиотеке, задание выполняется порциями по 1000 посетителей. Рекомендуется поставить в крон эту обработку раз в пять минут. За сутки, таким образом, будет обработано примерно 280 тыс. посетителей. Можете спрогнозировать примерное время окончания конвертации.
*/5 * * * * (cd /путь/www; php index.php convert)
Чтобы проверить перенесены ли уже все данные необходимо сделайть запрос к БД: select count(*) from old_visitors where move_url = 0;. move_url будет равно нулю в этом случае. После этого скрипт из крона надо удалить.
11) Наладить в кроне процесс очистки Visitors.
12) После того как убедились, что все работает правильно - можно удалить лишние файлы (папку с бэкапом app/components/Visitors_) и таблицы БД:
drop table old_visitors; drop table old_visitors_archive; drop table old_visitors_free_ids;