Я делал через куки на 1 час, чтобы не считать несколько раз.
Далее к каждой статье создается поле количества просмотров.
Если куки есть - пропускам, если нет - прибавляем 1.
Функция подсчета:
# Подсчет количества посещений страницы
function set_postviews() {
$count_key = 'post_views_count'; // Имя поля для записи количества просмотров
$who_count = 1; // 0 - считать всех, 1 - только гостей, 2 - только зарегистрированных пользователей
$exclude_bots = 1; // 0 - считать всех, 1 - исключить из подсчета ботов
global $user_ID, $post, $cookie_test;
# Проверка, что не было просмотра страницы в течение часа
if( is_singular() && $cookie_test) {
$id = (int)$post->ID;
static $post_views = false;
if( $post_views ) return true; // чтобы 1 раз за поток
$post_views = (int)get_post_meta( $id, $count_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;
}
# Проверка на браузер или не бот, иначе false
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;
}
# Обновляем счетик, если поля нет, то создаем со значением 1
if( $should_count )
if( !update_post_meta( $id, $count_key, ($post_views+1)) ) add_post_meta( $id, $count_key, 1, true );
}
return true;
}
add_action('wp_head', 'set_postviews');
Куки так:
/*
* Создаем куки, чтобы дважды не считать один и тот же пост в течение 1 часа
*
* в самое начало single.php пропишем:
* <?php
* global $cookie_test;
* $cookie_test = false;
*
* # Определяем имя файла (поста)
* $url = parse_url($_SERVER['REQUEST_URI']);
* $path = pathinfo($url['path']);
* $basename = $path['basename'];
*
* if( $basename && !isset($_COOKIE[$basename]) ) {
* $cookie_test = true;
* setcookie( $basename, '1', time()+3600 );
* }
* ?>
**/