WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Считаем количество посещений страниц на WordPress без плагинов

Помню в детстве луноходы разбирал, теперь разбираю плагины для WordPress smile На этот раз разбирался с WP-PostViews — плагином плагин для подсчета посещений постов/страниц в WordPress. Разбор удался на славу: выкинул около 90% кода, так как все это оказалось лишним для моей задачи.

Смотрите платную версию плагина. В нем много новых фукнций и все работает быстро и рассчитано на работу с плагинами объектного кэширования.

Смотреть платную версию

Единственное, что мне всегда надо было от этого плагина — только число посещений страниц и записей. Имею ввиду, выводить записи по наибольшему посещению не приходилось. К тому же, счетчик, который реализован в плагине слабоват для объективного подсчета визитов и предлагаемые плагином функции вывода: самые посещаемые статьи и т.п. превращаются в какой-то бред. Число визитов, которые считает этот плагин — это лишь общее представление о посещении страницы.

Что касается упомянутого выше вывода постов по наибольшему посещению, то это можно сделать используя функцию WordPress get_posts().

Почему, как эталон я взял wp-postviews? Потому что, он один из самых простых в своем роде - для сравнения, альтернатива wp-postviews - плагин для WordPress WP-PostViews Plus - он более наворочен  - создает свою таблицу в БД, более мощное вычисление о посетителе (IP, Браузер и т.п.). По-моему такой функционал это уже лишнее... Мы же не статистику собираем все-таки, для этого есть аналитика от Google или Яндекс.

Если выбирать плагины для подсчета посещений, по наибольшей простоте, то wp-postviews пожалуй самое оно... Однако он не без недостатков — минус он рассчитан на мировой трафик и не учитывает ботов Яндекса.

В плагине есть настройки, где можно указать чьи визиты считать, логика мне всегда подсказывала, что надо считать визиты только гостей (не залогиненных пользователей) и исключить поисковых роботов/ботов. Принцип отсева поисковых ботов и роботов в плагине реализован немного не правильно, потому что он исключает визиты указанных ботов, а если бот не указан в списке, то он будет считаться посетителем, что создает необъективность подсчета. Я решил подойти с другой стороны - не исключать, кого не надо считать, а включить, кого надо считать, для этого просто указал идентификаторы браузеров. По-моему лучше пусть счетчик будет считать строго, но точно будет известно, что цифры "оставлены" реальными людьми, а не всякой нечистью вроде поисковых ботов. smile

А вот и функция, которая у меня получилась - функция для подсчета посещений страниц на 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' переменную $meta_key в функции и заменить  'views', при выводе числа посещений:

Просмотров: <?php echo get_post_meta ($post->ID,'post_meta_name',true); ?>
299 комментов
Полезные 8 Вопросы 3 Все
  • @ Олег obvm.ru

    Здравствуйте! Поставил ваш плагин, некоторое время прекрасно работал, но в один момент перестал считать. Установлены WP Super Cache, Autoptimize, All In One WP Security и JetPack. Самописная тема. Посоветуйте на что обратить внимание.

    Ответить2.5 года назад #
    • Kama7630

      Из за WP Super Cache... У меня есть платная версия, если интересно в личку напиши...

      Ответить2.4 года назад #
      • @ Олег obvm.ru

        Тоже грешил на него, но после отключения ничего не изменилось. Интересно вот что: на какую бы страницу не зашёл, посещение засчитывается для этой - http://obvm.ru/darksiders-3-anons/

        Ответить2.4 года назад #
        • Kama7630

          Переменная $post сбивается где-то... Решение я выше написал...

          1
          Ответить2.4 года назад #
          • @ Олег obvm.ru

            Мой косяк был, забыл про

             <?php wp_reset_postdata(); ?>

            Спасибо что подсказал куда смотреть)

            1
            Ответить2.4 года назад #
  • @ Денис

    Не могу понять. Скрипт работает вроде бы нормально. Но вот по поводу точности - вопрос. Если просто обновлять страницу и смотреть, то считает правильно. Но вот к примеру сегодня на одну страницу было 3000 переходов с поисковиков (о чем говорит гугл аналитикс), а скрипт показал всего 150. С чем может быть связано? Кеширование? Или может когда много людей заходит паралельно, то он не правильно считает?

    Ответить2.2 года назад #
    • Kama7630

      Если стоит плагин страничного кэширования, то скрипт считай что не работает, точнее работает, но совсем не так как надо.

      Ответить2.2 года назад #
      • @ Денис

        и как это можно исправить? только отключением кеширования?

        Ответить2.2 года назад #
        • Kama7630

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

          Ответить2.2 года назад #
  • На сайте включил memcached от хостинга Beget и счетчик посещаемости в кешированных страницах не работает. Можно сделать, чтобы функция подсчета обходила кеширование?

    Ответить2.1 года назад #
    • Решил проблему поставив плагин kama-postviews, которая считает через ajax smile

      Ответить2.1 года назад #
  • Денис v-thailand.com

    Подскажите, а как сделать, чтобы вместо нулей выводилась буква K. Например, вместо 9513 - 9.5K?

    Ответить2 года назад #
    • Kama7630
      $number = 9513;
      
      if( (int) $number > 1000 ){
      	$format = number_format( $number/1000, 1, '.', '' ) .'К';
      }
      
      echo $format; //> 9.5К
      1
      Ответить2 года назад #
      • Денис v-thailand.com

        Спасибо! Я использую плагин abc post vievs, который как сказал автор построен на Вашем коде. Там нашел функцию вывода просмотров:

        function abc_postvievs_out() {
        $pstviev=get_option('pstviev');
        global $post;
        $count=get_post_meta($post->ID,$pstviev['meta'],true);
        if(!$count) $count=0;
        	echo '<span id="pv_'.$post->ID.'" class="pstviev">'.$count.'</span>';
        	//echo '<span id="pv_'.$post->ID.'" class="pstviev">0</span>';
        }
        

        Заменил некоторые значения на:

        function abc_postvievs_out() {
        $pstviev=get_option('pstviev');
        global $post;
        $count=get_post_meta($post->ID,$pstviev['meta'],true);
        if( (int) $count > 1000 ){
        	$count = number_format( $count/1000, 1, '.', '' ) .'К';
        	echo '<span id="pv_'.$post->ID.'" class="pstviev">'.$format.'</span>';
        	//echo '<span id="pv_'.$post->ID.'" class="pstviev">0</span>';
        }

        Но ничего не работает. Подскажите пожалуйста, что я делаю не так smile

        Ответить2 года назад #
      • Денис v-thailand.com

        Ура! Дошло! Вот правильный код. Добавил условие - если число менее 1000, то выводить без формата, иначе ничего не отображалось.

        function abc_postvievs_out() {
        $pstviev=get_option('pstviev');
        global $post;
        $count=get_post_meta($post->ID,$pstviev['meta'],true);
        if( $count > 1000 ){
        	$format = number_format( $count/1000, 1, '.', '' ) .'К';
        	echo '<span id="pv_'.$post->ID.'" class="pstviev">'.$format.'</span>';
        } else {
        	echo '<span id="pv_'.$post->ID.'" class="pstviev">'.$count.'</span>';
        }   
        }
        Ответить2 года назад #
      • Пожалуйста! dash Я что-то совсем запутался scratch_one-s_head Куда именно надо вставить этот код, для сокращения больших чисел?

        Извиняюсь за странный вопрос, только учусь.

        Ответить1.9 года назад #
  • Код рабочий, спасибо)) прост в использовании и настройке)

    Ответить2 года назад #
  • 1RONMAN vapekupon.ru

    Огромное спасибо за отличное работающее решение! Пробовал два "самых популярных" что называется плагина - Page View Count и Post Views Counter, ни один не хотел нормально работать, шаблон у меня изначально кривовато сделанный, хотя и куплен на ThemeForest, поэтому первый считал на небе звёзды, а второй размещал свой код где ни попадя, а вот с вашим решением добавленным руками всё супер thank_you

    Добавил вместо подписи иконку fontawesome получилось вообще здорово.

    Ещё раз спасибо! Ваш сайт, пожалуй, лучший из всех, что я видел по WordPress. good

    Единственное, чего, возможно, ещё бы хотелось - возможность отображать по аналогии с Page View Count количество просмотров всего и за сегодня.) Но опять же это наверняка сделает код "тяжелее", а полезность чисто на уровне субъективности...кому-то надо, кому-то нет.)

    3
    Ответить1.8 года назад #
  • FreeMan

    Как-то спрашивал про способ сокращения "тысячных чисел". thank_you Так никто и не помог... Нашел этот способ на иностранном сайте. Вроде, все работает.

    <?php global $post;
    $visitor_count = get_post_meta( $post->ID, 'views', true);
    if( $visitor_count == '' ){ $visitor_count = 0; }
    if( $visitor_count >= 1000 ){
    	$visitor_count = round( ($visitor_count/1000), 2 );
    	$visitor_count = $visitor_count.'k';
    }
    echo esc_attr($visitor_count); 
    ?>
    3
    Ответить1.7 года назад #
  • Павел

    При включенном плагине выдает 503 ошибку в админке при работе с виджетами, в консоль падает:
    POST http://mydomain.ru/mysitefolder/wp-admin/admin-ajax.php 503 (Service Unavailable)

    Вот думаю, толи дело в том, что у меня WP в отдельной папке от домена, а не в корне. Толи в сбое между Jquery/Js на новых версиях WP (у меня 4.9.4). Толи в каких-нибудь настройках Nginx на сервере, но вряд ли, на остальных 20 сайтах все хорошо с аяксом.

    Подскажите, как лечить, куда копать?

    P.S. кэша нет, проблема только в админке возникает. В настройках плагина выставлены значения - Только для не авторезированных, 2 сек.

    UPD. Нашел проблему, это очень странно, но если убрать в самом верху файла kama-postviews.php

    __('Counts visits of post or tax term. Works fast with caching plugins like WP Super Cache. To print views count use one of function: <?php kap_views() ?>or <?php fresh_kap_views() ?>where you need fresh views (when page cache plugin enabled)','kap');

    То все становится ок. Как это? Почему так? В чем краш?

    Ответить1.6 года назад #
    • Kama7630

      Эту версию не поддерживаю уже давно. Есть платная (1000р), если интересно в личку пишите.

      -6
      Ответить1.6 года назад #
Здравствуйте, !     Войти . Зарегистрироваться