Счетчик посещений страницы для MODX Revolution (модернизация HitsPage)

Возникла задача собирать статистику по сайту гостиницы (агрегатор гостиниц, но не суть). Количество посещений страниц (уникальных посещений), подсчет количества кликов по ссылкам "забронировать номер" (некий аналог целей из Яндекс метрики), кликов по телефонному номеру объекта. В ссылках, ведущих на страницу бронирования, присутствует GET праметр id, содержащий id ресурса, ссылки с номерами телефонов имеют класс "call" и параметр data-url, содержащий ссылку на документ, к которому этот телефон относится. В итоге, задача более формально описывается как:

  1. собирать статистику уникальных посещений страниц с определенным шаблоном
  2. считать клики по ссылкам вида /?id=###, где id - id интересующих нас документов
  3. считать клики по ссылкам вида <a class="call" href="tel:##########" data-url="url">
  4. Результаты подсчета по каждому документу нужно хранить в его TV

За основу взял дополнение HitsPage, которое позволяет собирать статистику посещений определенных страниц сайта. Сниппет, идущий в комплекте дополнения прост в использовании - достаточно вызвать его в нужном шаблоне. Сниппет HitsPage понимает единственный параметр - &saveTv=`true`, при наличии данного параметра количество посещений ресурса записывается в TV HitsPage данного ресурса. Немного модифицировал сниппет HitPage, а именно, добавил возможность:

  • регистрировать только 1 посещение конкретной страницы каждым пользователем (подсчет уникальных посетителей в сутки);
  • создавать несколько счетчиков (разные TV) для каждой страницы;
  • вызывать сниппет без вывода количества посещений;
  • крутить счетчик документа с другим id;

Итак, устанавливаем HitsPage из репозитария MODX и меняем код сниппета HitsPage на следующий:


<?php
/**
 * This file is extra HitsPage Pageviews for MODX Revolution.
 *
 * @copyright Copyright (C) 2013, Artdevue Ltd, <info@artdevue.com>
 * @author Valentin Rasulov <info@artdevue.com>
 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License v2
 * @package hitspage
 *
 */
/* Modified by saytoshop.ru 21-05-2017
*
* &tvname - имя TV, в которой содержится счетчик посещений
* &id - id ресурса, которому принадлежит tvname
* &silentmode - сниппет по умолчанию не возвращает ничего, укажите &silentmode=`0`, чтобы получить текущее количество
* &interval - если указать &interval=`daily` - сниппет засчитывает только одно посещение страницы в сутки одним пользователем
*
*/

$tvname = isset($tvname) ? $tvname : "HitsPage";
$silentmode = isset($silentmode) ? $silentmode : "1";
$id     = isset($id) ? $id : $modx->resource->get('id');
$page =  $modx->getObject('modResource', $id);

if ($interval=="daily" && isset($_COOKIE[$id.$tvname])){
    if ($silentmode=="0") return $modx->resource->getTVValue($tvname);
    return;
}

$view = 0;
// Check the option to record in TV
if($saveTv == 'true') {
    // get the required TV object by name (or id)
    $tv = $modx->getObject('modTemplateVar',array('name'=>$tvname));
    if($tv) {
        $tvs = $modx->getObject('modTemplateVarResource',array('tmplvarid'=>$tv->id, 'contentid'=>$page->get('id')));
        if($tvs) {
            $viewTv = $tvs->get('value');
            $tvs->set('value',intval($viewTv) + 1);
            if($tvs->save()) $view = $viewTv;
        } else {
            $tvn = $modx->newObject('modTemplateVarResource');
            $tvn->set('tmplvarid',$tv->id);
            $tvn->set('contentid',$page->get('id'));
            $tvn->set('value',1);
            if($tvn->save()) $view = 1;
        }       
    } 
} else {
    $view = $page->getProperty('hitts','hitspage',$view);
}
if ($tvname=="HitsPage") $page->setProperty('hitts',intval($view) + 1,'hitspage');
$page->save();
setcookie($id.$tvname,$tvname,time()+3600*24);
if ($silentmode=="0") return $view;
return;
    
    

Теперь сниппет принимает следующие параметры:

  • &tvname - имя TV, в которой содержится счетчик посещений
  • &id - id ресурса, которому принадлежит tvname
  • &silentmode - сниппет по умолчанию не возвращает ничего, укажите &silentmode=`0`, чтобы получить текущее количество
  • &interval - если указать &interval=`daily` - сниппет засчитывает только одно посещение страницы в сутки одним пользователем


Теги: Revolution, сниппет, HitsPage

Сообщение отправлено

Закрыть