Как улучшить поведенческие факторы сайта на Drupal

Улучшаем поведенческие факторы: увеличить время пребывания на сайте

Наверняка ты не раз задавался вопросом: "Как увеличить время пребывания пользователя на сайте и увеличить количество просмотров содержимого?". По просьбе читателей палю свой алгоритм улучшения поведенческих факторов для сайта на Drupal 6. По доброй традиции весь код и много непонятных слов под катом, угощайтесь.

Постановка задачи

Итак, имеем сайт с некоторым количеством контента. Чувствуем, что пользователь как-то неохотно и вяло ходит по сайту и понимаем, что нужно как-то стимулировать его интерес. Задачу подобного плана я решил самописным алгоритмом, который отбирает случайным образом контент из категории и показывает в виде всплывающего tooltip в тот момент, когда пользователь совершает ключевое действие(наступает на ловушку).

Собственно, выглядит это примерно следующим образом. Человек читает статью, заинтересовывается изображением, сниппетом кода или просто хочет нажать +1. При наведении курсора на предопределенную зону-ловушку срабатывает скрипт, который выводит "читайте также" со ссылкой на другой материал.

Tooltip с приглашением на другую страницу

Смысл подобного рода улучшения поведенческих факторов отражен на скриншоте с Яндекс метрики. Зеленым обозначены внутренние переходы на некотором срезе времени.

Срез показателя внутренних переходов по сайту Яндекс метрики

Листинг

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

PHP

Во первых, мы должны до загрузки страницы сформировать список претендентов на показ. Как вам известно, Drupal имеет мощную таксономию и словари, которые позволяют группировать контент по каким либо признакам. Для выборки используем функцию темизации в template.php.

Сниппет MySQL + PHP
/* 
    @core: Drupal 6
    @location: themes -> theme folder -> template.php 
    @function: node preprocess
    @description: 
         get the range of similar nodes by taxonomy vocabulary type; 
         transport it into JSON to core settings javascript.
*/
function phptemplate_preprocess_node( &$vars ) {
 
    // Similar nodes 
    if( !$vars['page'] || !$vars['node'] || !count($vars['node']->taxonomy) ) {
      return;
    }
 
    $node = $vars['node'];
    $tids = array_keys($node->taxonomy);
    $items = array();
    $step = 0;
 
    $nodes = db_query_range("
        SELECT n.nid, n.title, COUNT(*) AS hits FROM {node} n
        LEFT JOIN {term_node} tn ON n.nid = tn.nid AND n.vid = tn.vid
        WHERE
            n.type = '%s' AND
            n.status = 1 AND
            tn.tid IN (" . db_placeholders($tids) . ") AND
            n.nid <> %d
        GROUP BY n.nid
        ORDER BY hits DESC, n.created DESC
    ", array_merge( array($node->type), $tids, array($node->nid)), 0, 15 );
 
   while( $node = db_fetch_object($nodes) ) {
    $id = $node->nid; 
    $address = url( drupal_get_path_alias( 'node/' . $id) );
    $step ++;
 
    $items[$step] = array('title' => $node->title, 'url' => $address, 'id' => $id);
  }
 
  // write to settings js
  drupal_add_js(array( 'similar' => array( 'range' => $step, 'nodes' => $items ) ), 'setting'); 
 
} // End node preprocess

Из кода понятно, что выбранный контент будет оформлен в формате JSON и встроен в тело скрипта настроек, откуда мы сможем получить данные на стороне клиента(спасибо музицирующему девелоперу за решение выборкой).

JavaScript

Далее, напишем скриптец для выборки и отброса показанных материалов. Drupal располагает великолепным API, позволяющим формировать конфигурационный JSON namespace и выводить его в теле страницы. Им мы и воспользуемся по всем правилам code style.

Сниппет JavaScript
/* 
    Inject the similar nodes tooltip;
    require: https://github.com/x029ah/style-switch/blob/master/sc/jquery.Storage.js
*/
Drupal.behaviors.ProtonAdvertisement = function() {
  if( Drupal.settings.similar ) {
 
    //check for storage & create it if not exist
    var garbage = $.Storage.get('garbage_nodes');
 
    //check for range setting
    var range = Math.floor(Math.random() * Drupal.settings.similar.range) + 1;
 
    var similar = Drupal.settings.similar.nodes[range];     
    var similar_link = '<a href="'+ similar.url +'">' + similar.title + '</a>';
    var placeholder  = '<div id="similar"><b>Читайте также</b><br />' + similar_link + '</div>';
    $('#bottom').prepend( placeholder );
 
      //trap zones
      $('#comments, #relations, #box, .geshifilter pre:last, article p:last').hover(
        function() { 
          //storage already exist, curent node not showing before, curent node not self linking 
          if( garbage && !garbage.match(similar.id) ) {
            $.Storage.set('garbage_nodes', garbage + similar.id + '|');
            $('#similar').delay(550).show(550);       
          } 
 
          if( !garbage ) {          
            $.Storage.set('garbage_nodes', '0|' + similar.id + '|');  
            $('#similar').delay(550).show(550); 
          }     
 
        }
      );
  }
};

Данный код получает данные из региона настроек ядра и случайным образом выбирает страницу для показа. Однажды показанная страница больше не выводится, а данные о всех показах очень компактно пишутся в local storage или cookies.

Также, здесь конфигурируются селекторы для вывода tooltip и зоны-ловушки. Скрипт требует подключенного jQuery local storage плагина и может быть прописан в любой из скриптов вашей темы.

CSS

Прописали, сконфижили, осталось только оформить по вкусу и почистить кэш.

Сниппет CSS
/* Similar nodes tooltip */
#similar {
  font: normal 14px Arial, Verdana, sans-serif;
  border: 4px solid #fc6;
  -moz-border-radius: 8px;
  border-radius: 8px;
  padding: 5px 15px;
  background: #CC5;
  position: fixed;
  z-index: 10000;
  display: none;
  height: 60px;
  float: right;
  bottom: 60px;
  right: 20px; 
  opacity: .6; 
}
 
#similar:hover {
  -webkit-transition: all .2s ease-in-out;
  -moz-transition: all .2s ease-in-out;
  -ms-transition: all .2s ease-in-out;
  -o-transition: all .2s ease-in-out;
  transition: all .2s ease-in-out; 
  border-color: #fff;
  opacity: 1;
}
 
#similar b {
  text-shadow: -1px 0 2px #ff3;
  text-align: right;
  font-size: 15px;
  display: block;
  color: #303;
}
 
#similar a {
  border-bottom: 1px dashed #930;
  text-decoration: none;
  padding: 0 0 2px;
  color: #b22222;
}
 
#similar a:hover {
  color: #000;
}

Результат

Эффект весьма существенный и очень неплохо привлекает внимание пользователя, не напрягая сабж. Каждая страница покажется только один раз и перейдя с поисковика пользователь получит только тот контент, который его может потенциально заинтересовать.

Tooltip не мозолит глаза и не подрывает доверие к сайту за счет грамотной конфигурации зон срабатывания. В общем смотрите сами.

Дмитрий

Да, прикольная штука, давно на нее обратил внимание на вашем сайте. Nice

Shift-Web

да так себе, но, в целом, выполняет свои функции

Арти

ток я видел на сайте если вверх возвращаешься, пропадает, а у тебя глаза мусолит...

Shift-Web

у тебя 1024 чтоли?

Kervi
Михаил

Неплохая идея А как насчет того, что это может отвлекать от важных действий. Так, например, если человек направляется к соц. кнопкам, то может ему стоит дать возможность воспользоваться ими, а не сразу показывать всплывающее окно. Ведь отвлекает, ИМХО.

P.S. Расположение может стоит сделать по нижний части экрана во всю ширину? Там у вас что-то пытается показываться, но не вижу что. Просто полупрозрачная полоса.

Shift-Web

Kervi, спасибо, но это для Drupal 7. Не знаю почему, но мне всегда нравились компактные точечные решения, которые не слишком привязаны к какой-то архитектуре.

Неплохая идея А как насчет того, что это может отвлекать от важных действий. Так, например, если человек направляется к соц. кнопкам, то может ему стоит дать возможность воспользоваться ими, а не сразу показывать всплывающее окно. Ведь отвлекает, ИМХО.

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

P.S. Расположение может стоит сделать по нижний части экрана во всю ширину? Там у вас что-то пытается показываться, но не вижу что. Просто полупрозрачная полоса.

Если вы наведете и немного подержите на ней курсор, то увидите подвал Nice Чтобы не напрягало: время срабатывания выставлено с оттяжкой.

Михаил

Если вы наведете и немного подержите на ней курсор, то увидите подвал Nice Чтобы не напрягало: время срабатывания выставлено с оттяжкой.

Вот тут-то как раз оттяжка может и не нужна? Или подсказка нужна, иначе вообще не понятно что-там и так. Вы попробуйте отследить, кто-то вообще из новых посетителей замечает эту фичу? а из старых? если нет - то она либо не нужна, либо надо менять. ИМХО

Shift-Web

Вот тут-то как раз оттяжка может и не нужна?

Однозначно нужна, иначе выбесит в корень. Вообще она и не должна напрягать, по идее. При случайном на ведении срабатывает "щелчек", думаю замечают достаточно. Я, например, почти никогда не разворачиваю браузер на весь монитор, мне удобнее, когда он в полу свернутом положении.

Юзабилити дело такое, здесь не только браузер свои привычки прививает, но операционная система. По умолчанию предполагаю, что то, что удобно мне, вполне должно быть комфортно остальным(это, конечно, не так, но чего-то однозначно идеального просто не бывает).

Панелька нужна и планировалась в несколько ином виде(есть что туда вывести). Но я над этим еще не думал.

userator

Интересно! По моему действительно не отвлекает!

Арти

не, у меня 1680*1050

Shift-Web

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

Арти

да я имел в виду что когда вертаешься вверх, то на др сайтах окошко исчезает, а у тебя нет. И все...

Отправить комментарий