Считаем количество посещений страниц на WordPress без плагинов
Помню в детстве луноходы разбирал, теперь разбираю плагины для WordPress
На этот раз разбирался с WP-PostViews — плагином плагин для подсчета посещений постов/страниц в WordPress. Разбор удался на славу: выкинул около 90% кода, так как все это оказалось лишним для моей задачи.
Смотрите также: Функция вывода записей по количеству просмотров
Этот код больше не поддерживается!
Рекомендую свой плагин. В нём:
- Более стабильный принцип подсчета.
- Подсчет визитов для таксономий, главной, архивов.
- График посещений (в том числе уникальных).
- Минимум данных в БД (БД не будет расти как на дрожжах, как в других плагинах).
- Подсчет работает на аяксе и очень быстро - WP среда не подгружается.
- Рассчитан на работу с плагинами объектного кэширования.
Единственное, что мне всегда надо было от этого плагина — только число посещений страниц и записей. Имею ввиду, выводить записи по наибольшему посещению не приходилось. К тому же, счетчик, который реализован в плагине слабоват для объективного подсчета визитов и предлагаемые плагином функции вывода: самые посещаемые статьи и т.п. превращаются в какой-то бред. Число визитов, которые считает этот плагин — это лишь общее представление о посещении страницы.
Что касается упомянутого выше вывода постов по наибольшему посещению, то это можно сделать используя функцию WordPress get_posts().
Почему, как эталон я взял wp-postviews? Потому что, он один из самых простых в своем роде - для сравнения, альтернатива wp-postviews - плагин для WordPress WP-PostViews Plus - он более наворочен - создает свою таблицу в БД, более мощное вычисление о посетителе (IP, Браузер и т.п.). По-моему такой функционал это уже лишнее... Мы же не статистику собираем все-таки, для этого есть аналитика от Google или Яндекс.
Если выбирать плагины для подсчета посещений, по наибольшей простоте, то wp-postviews пожалуй самое оно... Однако он не без недостатков — минус он рассчитан на мировой трафик и не учитывает ботов Яндекса.
В плагине есть настройки, где можно указать чьи визиты считать, логика мне всегда подсказывала, что надо считать визиты только гостей (не залогиненных пользователей) и исключить поисковых роботов/ботов. Принцип отсева поисковых ботов и роботов в плагине реализован немного не правильно, потому что он исключает визиты указанных ботов, а если бот не указан в списке, то он будет считаться посетителем, что создает необъективность подсчета. Я решил подойти с другой стороны - не исключать, кого не надо считать, а включить, кого надо считать, для этого просто указал идентификаторы браузеров. По-моему лучше пусть счетчик будет считать строго, но точно будет известно, что цифры "оставлены" реальными людьми, а не всякой нечистью вроде поисковых ботов. 
А вот и функция, которая у меня получилась - функция для подсчета посещений страниц на WordPress.
// Подсчет количества посещений страниц
add_action( 'wp_head', 'kama_postviews' );
/**
* @param array $args
*
* @return null
*/
function kama_postviews( $args = [] ){
global $user_ID, $post, $wpdb;
if( ! $post || ! is_singular() )
return;
$rg = (object) wp_parse_args( $args, [
// Ключ мета поля поста, куда будет записываться количество просмотров.
'meta_key' => 'views',
// Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированных пользователей.
'who_count' => 1,
// Исключить ботов, роботов? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
'exclude_bots' => true,
] );
$do_count = false;
switch( $rg->who_count ){
case 0:
$do_count = true;
break;
case 1:
if( ! $user_ID )
$do_count = true;
break;
case 2:
if( $user_ID )
$do_count = true;
break;
}
if( $do_count && $rg->exclude_bots ){
$notbot = 'Mozilla|Opera'; // Chrome|Safari|Firefox|Netscape - все равны Mozilla
$bot = 'Bot/|robot|Slurp/|yahoo';
if(
! preg_match( "/$notbot/i", $_SERVER['HTTP_USER_AGENT'] ) ||
preg_match( "~$bot~i", $_SERVER['HTTP_USER_AGENT'] )
){
$do_count = false;
}
}
if( $do_count ){
$up = $wpdb->query( $wpdb->prepare(
"UPDATE $wpdb->postmeta SET meta_value = (meta_value+1) WHERE post_id = %d AND meta_key = %s",
$post->ID, $rg->meta_key
) );
if( ! $up ){
add_post_meta( $post->ID, $rg->meta_key, 1, true );
}
wp_cache_delete( $post->ID, 'post_meta' );
}
}
Как обычно, функцию вставляем в файл functions.php вашей темы (шаблона), а где нужно вывести число просмотров пишем так:
Просмотров: <?php echo get_post_meta( $post->ID, 'views', true ); ?>
Внутри функции есть её настройки: название ключа у произвольного поля, кого считать и исключить ботов или нет.
Название ключа нужно для того, чтобы можно было заменить, какой-нибудь другой плагин, который тоже использует произвольные поля для записи посещений. Например, если стоял плагин, который изменял произвольное поле с названием 'post_meta_name', то чтобы его заменить нужно изменить на 'post_meta_name' переменную $meta_key в функции и заменить 'views', при выводе числа посещений:
Просмотров: <?php echo get_post_meta( $post->ID, 'post_meta_name', true ); ?>