Помнится мне, в детстве луноходы разбирать любил, сегодня все уже не так - повзрослел, а отголоски "вредных" привычек остались - теперь разбираю плагины для WordPress
.
На этот раз разбирался с wp-postviews (плагин для подсчета посещений постов/страниц в WordPress) и вырвал ему сердце
. Разбор получился мощный - я выкинул практически все, так как, для меня в этом плагине лишним оказалось около 90%.
Единственное, что мне всегда надо было от этого плагина - это только число посещений страниц и записей. Имею ввиду, выводить записи по наибольшему посещению не приходилось. К тому же, счетчик, который реализован в плагине слабоват для объективного подсчета визитов и предлагаемые плагином функции вывода: самые посещаемые статьи и т.п. превращаются, грубо говоря, в бред. Для меня число визитов, которые считает этот плагин - это лишь общее представление о посещении той или иной страницы.
Что касается упомянутого выше вывода постов по наибольшему посещению, то это можно сделать используя функцию WordPress get_posts().
Почему, как эталон я взял wp-postviews? Потому что, он один из самых простых в своем роде - для сравнения, альтернатива wp-postviews - плагин для WordPress WP-PostViews Plus - он более наворочен - создает свою таблицу в БД, более мощное вычисление о посетителе (IP, Браузер и т.п.). По-моему такой функционал это уже лишнее... Мы же не статистику собираем все-таки.
Если выбирать плагины для подсчета посещений, по наибольшей простоте, то wp-postviews пожалуй самое то, однако он не без недостатков - минусом wp-postviews является то, что этот буржуйский плагин не учитывает ботов Яндекса.
В плагине есть настройки, где можно указать чьи визиты считать, логика мне всегда подсказывала, что надо считать визиты только гостей (не залогиненных пользователей) и исключить поисковых роботов/ботов. Принцип отсева поисковых ботов и роботов в плагине реализован немного не правильно, потому что он исключает визиты указанных ботов, а если бот не указан в списке, то он будет считаться посетителем, что создает необъективность подсчета. Я решил подойти с другой стороны - не исключать, кого не надо считать, а включить, кого надо считать, для этого просто указал идентификаторы браузеров. По-моему лучше пусть счетчик будет считать строго, но точно будет известно, что цифры "оставлены" реальными людьми, а не всякой нечистью вроде поисковых ботов. 
А вот и функция, которая у меня получилась - функция для подсчета посещений страниц на WordPress.
/* Подсчет количества посещений страниц
---------------------------------------------------------- */
add_action('wp_head', 'kama_postviews');
function kama_postviews() {
/* ------------ Настройки -------------- */
$meta_key = 'views'; // Ключ мета поля, куда будет записываться количество просмотров.
$who_count = 1; // Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированых пользователей.
$exclude_bots = 1; // Исключить ботов, роботов, пауков и прочую нечесть :)? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
/* СТОП настройкам */
global $user_ID, $post;
if(is_singular()) {
$id = (int)$post->ID;
static $post_views = false;
if($post_views) return true; // чтобы 1 раз за поток
$post_views = (int)get_post_meta($id,$meta_key, true);
$should_count = false;
switch( (int)$who_count ) {
case 0: $should_count = true;
break;
case 1:
if( (int)$user_ID == 0 )
$should_count = true;
break;
case 2:
if( (int)$user_ID > 0 )
$should_count = true;
break;
}
if( (int)$exclude_bots==1 && $should_count ){
$useragent = $_SERVER['HTTP_USER_AGENT'];
$notbot = "Mozilla|Opera"; //Chrome|Safari|Firefox|Netscape - все равны Mozilla
$bot = "Bot/|robot|Slurp/|yahoo"; //Яндекс иногда как Mozilla представляется
if ( !preg_match("/$notbot/i", $useragent) || preg_match("!$bot!i", $useragent) )
$should_count = false;
}
if($should_count)
if( !update_post_meta($id, $meta_key, ($post_views+1)) ) add_post_meta($id, $meta_key, 1, true);
}
return true;
}
Как обычно, функцию вставляем в файл functions.php вашей темы (шаблона), а где нужно вывести число просмотров пишем так:
Просмотров: <?php echo get_post_meta ($post->ID,'views',true); ?>
Внутри функции есть её настройки: название ключа у произвольного поля, кого считать и исключить ботов или нет.
Название ключа нужно для того, чтобы можно было заменить, какой-нибудь другой плагин, который тоже использует произвольные поля для записи посещений. Например, если стоял плагин, который изменял произвольное поле с названием 'post_meta_name', то чтобы его заменить нужно изменить на 'post_meta_name' переменную $mata_key в функциии и зменить 'views', при выводе числа посещений:
Просмотров: <?php echo get_post_meta ($post->ID,'post_meta_name',true); ?>
Если есть необходимость вывести список самых просматриваемых статей, то решение здесь.
Обновления
13 марта 2011
В некоторых случаях (по вине шаблонов или плагинов), за раз, вместо 1 просмотра, прибавлялось 2. Исправил, теперь такого быть не должно.
- Предыдущие по меткам
- Предыдущие записи
- Плагин опроса для WordPress - Democracy Poll ← 12.Июн.2010 // 110
- Пакетно перемещаем статьи в другую категорию ← 21 Апрель 2010 // 3
- Перелинковка статей (предыдущие записи) ← 19 Апрель 2010 // 51
- Подсветка результатов поиска, без использования плагинов ← 17 Апрель 2010 // 18

а почему мне не кто не ответил,прошу помощи,я писал - подсчёт просмотров работает а вывод самых просматриваемых почему то не работает всё делаю по вашей инструкции прошу помощи!!
Вы как бы требуете помощи?
Не знаю почему не работает. Мало данных, чтобы хотя бы предположить почему может не работать. вы не находите?
А как запустить все тоже самое без использования wp_head();?
В header.php сделайте вызов этой функции.
Помогло, респект!
Спасибо! Буду пробовать.
Отличная вещь! очень мне лень было нечто подобное делать, я подумал, что не зачем изобретать велосипед и сразу наткнулся на этот пост. А плагин и правда нагружен лишней фигней!
Здравствуйте! Поставил плагин, все работает. Но! Заметил такую особенность: при просмотре поста добавляется +1 к общему счетчику. Но когда обновляю страницу, то опять же добавляется +1 просмотр. Таким образом, любой может клацать сколько угодно, тем самым увеличивать кол-во просмотров. можно ли сделать, чтобы просмотры учитывались по IP, а лучше всего по кукис?
Такое сделать можно, но это уже совсем другая история... По факту я не замечал ни разу, чтобы кто-то так накручивал этот счетчик, смысла в этом нет... +/- даже 50 просмотров таким образом ничего не решат в общей картине.
Если вы делаете проект где есть смысл накручивать просмотры определенного поста, то используйте специализированные плагины, которые учитывают IP и куки одновременно.
Благодарю.
И отдельно благодарю за подсказку насчёт хитрого файрфокса, который автоматом следующую страничку грузит. У меня за лёгкой главной страницей следующая - самая тяжёлая, и этот гад её каждый раз впустую дёргал. Ненавижу!
полезная вещица. спасибо. поставил. удобно и просто устанавливается.
Доброе время суток!Установил данный скрипт все работает ну есть один прикол суть которого я сам понять не могу
, а именно когда кликаеш по посту и просматриваеш его то просмотры увеличиваються как надо но количество просмотров поста который на 1 выше тоже почему то увеличиваеться на +1. Вот в чом суть понять никак не могу!может Вы сможете подсказать что не так?Кстати когда все ставил на локалхосте то скрипт правильно работает,а на хостинге как я выше написал, все модули в php.ini пробовал расскаоментировать но результат тот же...
За ответ заранее благодарен!
Гдет выше была подобная тема в комментариях. Вроде это из-за метаданных next/previous и барузеров которые подгружают страницы по ним...
Скажите, плиз, а будет ли работать подсчет количества посещений при установленном плагине Hyper Cache? Спасибо!
ДА будет, но не в реальном времени!
А подробнее, если можно. С какой периодичностью будет обновление?
Насколько я понимаю - с тем периодом с которым у вас стоят в настройках сброс кэша страницы
Но в админке, у записи к этому посту, вы будете видеть реальное положение дел. Всё зависит от сброса кэша. Я сбрасываю раз в сутки(правда это не Hyper Cache - но не так важно)
Спасибо большое! Теперь у меня все стало на свои места.
Классная функция, не нашел в вашем активе такую же для рейтинга!
Не хотите забацать на базе этой функции kama_postviews() ?
function kama_post_rating($Up = true) {
/* ------------ Настройки -------------- */
$meta_key = 'rating';
....... итд
соответственно если $Up = true то пишем +1, если Lowто = false -1.
P.S.есть плагин WP-PostRatings, говорят он не тормозит систему, но мне кажется что оптимальнее будет функция Kama