Помнится мне, в детстве луноходы разбирать любил, сегодня все уже не так - повзрослел, а отголоски "вредных" привычек остались - теперь разбираю плагины для 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 // 123
- Пакетно перемещаем статьи в другую категорию ← 21 Апрель 2010 // 7
- Перелинковка статей (предыдущие записи) ← 19 Апрель 2010 // 60
- Подсветка результатов поиска, без использования плагинов ← 17 Апрель 2010 // 18
а как сделать чтоб была не одинокая цыфорка а было к примеру написано "15 просмотров"
Спасибо, работает! Плагин удалил, его стили добавил в основные.
Уважаемый Kama, а сложно доработать функцию, чтоб считались не просмотры поста, а ссылки на статичные HTML страницы с него? Причем, желательно чтоб просмотр самого поста вообще не считался.
Смысл в чем.
- блог с фотогалереями
- каждый пост - галерея
- на индексе, архивах, поиске и в категориях - превью, они же - анонсы постов
- в каждом посте тоже превью
- эти превью уже ведут на статичные HTML-ы (созданных не ВП) с большим фото
И если считать просмотры постов, то это означает просмотры более удачных превью, а мне нужно - более интересные галереи, т.е. как много просмотрели больших фото в конекретном посте (галерее).
Большинство конечно не использует HTML-ы, а делает просто ссылку на фото и ставит плагин NextGEN Gallery. Но их бы тоже заинтересовал такой код, но вместо HTML-ов подсчет JPG-ов с поста.
ПЫСЫ Могу немного заплатить
Доработать не получится, это немного по-другому поставленная задача. Возможно вас устроит подсчет количества кликов по ссылке, в вашем случае это картинка по ссылке. Вот мой плагин для этого, возможно он не подойдет, попробуйте поискать аналоги: http://wp-kama.ru/id_430/plagin-dlya-podscheta-kolichestva-zagruzok-fayla-kamas-click-counter.html
Спасибо, но это не то: плагин будет считать только с поста, а мои HTML залинкованы друг на друга, поэтому юзер, открыв одну фотку, дальше листает HTML-ы подряд. Т.е. подсчет будет занижен. Шорткод же будет только с поста работать, да и ему нужен 1 конкретный урл, а там их 15-20, только с разными окончаниями (...01.html, ...02.html).
Видимо логичней всего вставить в HTML-ы некий код, который будет указывать на ID поста и ключ views для подсчета. Соответственно он будет заносить просмотры в нужный пост.
Еще забыл спросить: как обнулить счет, где там в БД искать, подскажите, чтоб не рыться долго.
В редактирование поста заходите и в произвольных полях обнуляете поле views.
Спасибо, Otshelnik-Fm! Получилось!
Если их много - то каждый пост не варик открывать и править. вот sql запрос - он удалит нужное вам произвольное поле:
но перед этим, все-таки бекап базы данных сделайте. мало ли...
Попробовала эту функцию, но у меня упорно обновляет просмотры в двукратном размере. Причём так: в том шаблоне, где это применяется, количество просмотров выводится не на странице поста, а в анонсе на странице рубрики; так вот, если открыть пост в новой вкладке и обновить страницу рубрики, может или сразу добавиться ДВА просмотра, или сначала добавляется один, а через несколько секунд второй (при том, что страница поста повторно не обновлялась и второму просмотру взяться неоткуда). Честно сказать, я даже не знаю, чем такое объяснить.
Правильно ли я понимаю, что количество просмотров надо брать из таблицы wp_postmeta в views?
Мне надо плагине в рейтинга комментов подставить и кол-во просмотров статьи
Да, вы все верно понимаете.
Вот только данные в wp_postmeta в views и данные, выводимые плагином wp_views существенно разнятся - плагин меньше показывает.
Если на запись ни разу не заходили - ничего не отображается. Хотелось бы что-бы отображался 0 т.к. количество просмотров задействовано в категории. Каким образом 0 получить ? Спасибо.
p.s. очень ваш сайт понравился...
Вывел ноль так...
<?php $views = get_post_meta($post->ID, 'views', true); if($views == '') { echo '0';} else { echo $views;} ?>Плагин действительно считает по 2 раза. Я обновляю вашу страничку и постоянно +2
оО это от браузера зависит. В Internet Explorer считает +1. В Chrome +2 чудеса
У меня в "Хроме" по одному разу считает.
При обновлении поста счетчик сбрасывается и начинает снова с нуля считать посетителей. Можно как-то решить эту проблему?
Не знаю даже как помочь, никаких идей
У меня была подобная фигня со сбросом и при плагине из репозитория (приходилось перед редактированием обращать внимание на значение поля - а после обновления заново записывать). Это 2.9 вроде ВП стоял. Как обновил до 2.3.1 движек вордпресса - эти проблемы исчезли. Не знаю отчего так. Но браузер не менял. Всё в мозилле работал.