WordPress как на ладони
Черная пятница на хостинге fornex.com! Новые WordPress шаблоны

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

Просмотров: <?php echo get_post_meta ($post->ID,'post_meta_name',true); ?>

Если есть необходимость вывести список самых просматриваемых статей, то решение здесь.

Обновления

13 марта 2011
В некоторых случаях (по вине шаблонов или плагинов), за раз, вместо 1 просмотра, прибавлялось 2. Исправил, теперь такого быть не должно.

Плагин

Плагин предназначен для работы совместно с плагинами кэширования, типа Wp Super Cache. Все подсчеты работают через AJAX с константой SHORTINIT. А это значит, что при включенном кэше, будут отправляться запросы, но не такие тяжелые и нагрузка будет низкая.

Для WordPress 4.4 и выше посещения элементов таксономии также считаются.

kama-postviews-v2.0
Скачано: 2174, размер: 20.6 KB

Другие плагины

Pageviews - еще один неплохой плагин для подсчета визитов. Коротко о принципе работы: все подсчеты ведутся на удаленном сервере (сервисе) https://pv.pjtsu.com/, и благодаря этому на ваш сайт нет никакой нагрузки. Плагин работает со страничными плагинами кэширования.

283 коммента
Полезные 6 Вопросы 3 Все
  • s18 cайт: s18.informatz.ru

    Идея по поводу перечисления типов браузеров улыбнула, но на мой взгляд лучше:
    либо следовать традиционной логике перечисления ботов (поисковых не так много, но, согласен, есть и рукописные),
    либо расширить список браузеров (что за неуважение к пользователям Linux, MacOS, Solaris и т.д.? А ослик где? браузеров десятки...),
    либо скомбинировать эти подходы (это не так сложно...).

    Лично я юзаю гугл аналитикс и мне более чем достаточно инфы о посещениях.

    Ответить8.5 лет назад #
    • Kama7021

      За коммент спс! Ща разберемся smile

      Вы действительно думаете, что я так халатно отнесся к этому моменту, как вы это представили? Даже обидно! sad

      Следовать логике перечисления ботов - это хуже, чем логике перечисления браузеров, а точнее даже не самих браузеров а, то как они представляются в переменной HTTP_USER_AGENT. Во-первых браузеров собрать легче (там как выяснелось всего 2 представления), во-вторых всяких нестандартных ботов, тоже хотелось бы исключить, а их учесть точно не получится. Именно поэтому я решил браузеры учитывать.

      либо расширить список браузеров

      Он уже расширен, как бы это странно не показалось. Сейчас специально проверил браузеры, на то, как они представляются, в список вошли:

      1. Firefox

      2. Opera

      3. Chrome

      4. MSIE (Осел)

      5. Safari

      6. Avant

      7. Epiphany

      8. Flock

      9. Galeon

      10. Iceape

      11. Iceweasel

      12. K-Meleon

      13. Kazehakase

      14. Konqueror

      15. Minefield

      16. Navigator

      17. Netscape

      18. SeaMonkey

      19. Shiretoko

      20. Dillo

      Т.е. весь этот список учитывается в подсчете. Знаете еще браузеры? Думаю, они тоже представляются, как Mozzila. Можно легко проверить.

      Из всего этого списка текущий код не учитывал только Dillo - он посчитал себя круче остальных laugh и представляется, как "Dillo" smile Его добавил в код, только, что это за браузер понятия не имею, подозреваю, что не я один такой... smile

      А теперь, что вы думаете, по какому принципу лучше считать?

      либо скомбинировать эти подходы (это не так сложно...).
      Это уже совсем лишнее...
      Лично я юзаю гугл аналитикс
      Внешних сервисов по статистике хватает, поэтому я и предлагаю не использовать навороченные плагины для подсчета посещений, поэтому я и решил разобраться с этим вопросом - мне кажется, очень удобно видеть прям на сайте, сколько раз был просмотрен пост (как у меня под постом). К тому же, если что, можно будет сделать колонку "самое просматриваемое". А еще, на сервисах статистики (не знаю, как в гугл аналитикс), как-то не очень удобно просматривать посещение отдельно взятой страницы. И опять же, для этого надо пробивать каждую страницу отдельно - неудобно вообще! Во как smile
      Ответить8.5 лет назад #
      • s18 cайт: s18.informatz.ru

        Я не хочу лично проверять, как кто себя прописывает в этой переменной... Сталкивался когда-то с этим, знаю, что нетскейп не называет себя по имени)

        Меня вот удивляет, что гугл аналитикс почему-то знает 10 типов браузеров, а тут все свелось к двум. Меня именно это насторожило, а не халатность или там личная неприязньsmile Он же их тоже различает, извлекая некоторые хедеры. Как?

        Знаю ли я браузеры еще? да)) lynx, например)

        Список поисковых ботов можно найти в инете, здесь, согласен, не больно-то нужен (при условии корректности всего написанного о браузерах) Есть немало способов на 99.99% выявить бота, что тоже с успехом делает гугл, но это не тема для обсуждения здесь.

        Проверьте еще раз, потестите сами, мои сомнения вполне ясны.

        Ответить8.5 лет назад #
        • Kama7021

          Сорри, чет я в ответе как-то погорячился smile

          Я уже все потестил, поэтому так смело утверждаю. К тому же, здесь такая сверх точность не нужна, как не крути у 90+% юзеров браузеры: Лиса, Опера, Хром или Осел.

          Пройдя по этой ссылке выйдет информация USER_AGENT, т.е. инфа о вашем браузере и ОС. Так вот, первое слово всегда Mozilla у всех браузеров кроме оперы. Список, который я привел выше, проверен таким способом (через сервис есно) - все Мозилы smile Кроме выскочки, который расположился в конце списка №20 laugh.

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

          Также, я через логи смотрел, как выглядит такая строка у ботов - "Мозиллы" там нет...

          Ответить8.5 лет назад #
          • s18 cайт: s18.informatz.ru

            Ок, согласен. В рамках того, что Вы делаете, все корректно.

            Ответить8.5 лет назад #
  • Ruslan

    Сделал все по статье, встроил код в function шаблона, вставил код вывода в нужное место, но он так и не хочет выводить количество просмотров.
    В чем может быть причина?

    Ответить8.4 лет назад #
    • Kama7021

      Даже не знаю, в принципе все очень топорно сделано, поэтому должно все работать. Вероятнее всего вы где-то допустили ошибку.

      Обратите внимание на следующие моменты:

      1. После установки кода в файл functions.php и просмотре страницы (незалогиненым юзером), у статьи должно появится произвольное поле "Просмотров"

      2. Строка вывода количества просмотров страницы:

        Просмотров: <?php echo get_post_meta ($post->ID,'Просмотров',true); ?>

        желательно должна находиться внутри Loop цыкла (для нормально свёрстанных шаблонов это не обязательно). Если код для вывода поставлен за пределами цикла loop, и ничего не выводится, то можно попробовать добавить global $post;

        global $post;
        Просмотров: <?php echo get_post_meta ($post->ID,'Просмотров',true); ?>
      3. Если ничего не работает, возможно проблема в Ключе произвольного поля - "Просмотров". Как видите он написан в кириллице, возможно какие-то проблемы с этим. Попробуйте заменить этот ключь на латиницу - "views". Заменять нужно в самой функции (вначале где настройки) и в выводе, в шаблоне.

      П.С. Все это только мои предположения, почему может не работать. На практике у меня все работает без проблем.

      Ответить8.4 лет назад #
      • Роман

        У меня не работает. Возможно необходимо добавить global $post;, но только куда?

        Ответить7.8 лет назад #
  • Дмитрий

    Здравствуйте! Большое спасибо за фичу "счетчика просмотров" в таком легком с т.з кода исполнении. Возник вопрос, а с точки зрения нагрузки на сайт (сервер) такой вариант "счетчика просмотров" сильно влияет? Спасибо.

    Ответить8.4 лет назад #
    • Kama7021

      Нагрузка минимальная - один мини-запрос к БД на перезапись произвольного поля, если вообще не запрос к кешу (точно не знаю). Что касается PHP операций, они также очень просты.

      Не думаю, что даже при большой посещаемости, этот хак как-то может сказаться на нагрузке.

      Ответить8.4 лет назад #
      • Дмитрий

        Спасибо за ответ! А можно ли в рамках подсчета выполнять с этими полями какие-либо операции, например, выводить список самых просматриваемых постов? За период, за всё время?

        Ответить8.3 лет назад #
  • findxlove cайт: fxl.ru

    А в какую таблицу пишет данные скрипт? и поле? просто я все установил как писали Вы, но как и при модуле WP-PostViews показывал 0, то ваш мод просто показывает пустоту.

    Ответить8.4 лет назад #
    • Kama7021

      Данные записываются в произвольные поля, название поля можно менять.

      то ваш мод просто показывает пустоту

      При первой установке так и будет, потому что вы авторизированы и по умолчанию вас скрипт не считает. Но стоит только зайти посетителю хотя бы один раз и счетчик начнет считать (у поста появится произвольное поле, со значением 1, потом 2 и т.д.).

      Т.е. скрипт 0 показывать не будет никогда: либо больше нуля, либо пусто. Но посетитель пустоту тоже никогда не увидит smile

      Ответить8.4 лет назад #
      • findxlove cайт: fxl.ru

        Зашел с другого браузера, все равно пустота.

        WP-PostViews не работает тоже почему-то

        А где посмотреть эти произвольные поля? smile

        Ответить8.4 лет назад #
      • Kama7021

        Даже не знаю в чем может быть проблема. Может у вас плагин страничного кеширования установлен?

        Ответить8.4 лет назад #
        • findxlove cайт: fxl.ru

          Только два: WP-PostViews, Hide Dashboard

          Ответить8.4 лет назад #
        • findxlove cайт: fxl.ru

          Нашел проблему, переключаю скин все работает, включаю другой и как раз который редактировал под себя, не пашет (

          Ответить8.4 лет назад #
          • Kama7021

            Случаем у вас в header.php вызов функции wp_head() не удален?

            Т.е. если ли подобная строка в header.php:

            <?php wp_head() ?>

            Если её нет, мой скрипт работать не будет, wp-postviews кажется тоже (не помню как там сделано). Да и вообще много еще разных проблем встретите smile

            Если такой строки нет вставьте перед </head>.

            Ответить8.4 лет назад #
            • findxlove cайт: fxl.ru

              Спасибо помогло! smile Я ее да же помню как удалил. smile

              Ответить8.4 лет назад #
  • Allpa cайт: allpa.ru

    Так, это у меня получилось, слава богу (немного помучилась с functions.php, пока сообразила, что не нужно править его в браузере, иначе блог начинает чутка глючить, а надо формировать на компе и загружать потом в блог).

    Теперь надо освоить вторую часть инструкции - вывод постов по количеству просмотров smile
    Этим заняться не могу, пока не сооружу табы в сайдбаре (помогают, сама не в силах), чтобы туда сразу и запихивать нужный код smile

    Огромное Вам спасибо за подробнейший мануал! Собираюсь писать обо всех полезностях, используемых блогом, - Вы там будете обязательно smile

    Ответить8.3 лет назад #
    • ADv cайт: lastfmtools.ru

      а мне с табами в сайдбаре помочь не сможете?..

      Ответить8.2 лет назад #
  • Ksana cайт: prodengiblog.ru

    Кама, спасибо за код - как раз искала что то подобное.
    Только он у меня немного странно считает - при каждой перезагрузке страницы, добавляется сразу 2 просмотра, а не 1, как должно быть.

    Как это исправить?

    Ответить8.2 лет назад #
    • Kama7021

      Никаких идей, почему так может быть. Этот код прибавляет единицу.
      Скорее всего, накладка где-то, может до этого плагин подобный ставили и забыли выключить или что-то в этом роде (код подобный), это максимум, что пришло в голову. Но определенно, кто-то где-то добавляет еще +1 в значение произвольного поля, потому что сам по себе этот код на такое не способен.

      Попробуйте на дефолтный шаблон поставить, выключить плагины и т.п. Если не решится проблема дайте домен в личку или сюда. Коль смогу помогу smile

      Ответить8.2 лет назад #
  • Lovedancer cайт: www.alliance.zp.ua

    Добрый вечер. Подскажите пожалуйста, в чём может быть причина, что куда бы я не вставил это код в functions.php, у меня тут же перестаёт открываться сайт.

    Ответить8.1 лет назад #
    • Kama7021

      Причина скорее всего в PHP тегах <?php и ?> - Уберите их из этой функции.

      Ответить8.1 лет назад #
      • Lovedancer cайт: www.alliance.zp.ua

        Спасибо вам огромное. Помогло. Но вот только сайт стал дольше грузиться из-за этой функции, так что пришлось от него отказаться sad ...а жаль sad

        Ответить8.1 лет назад #
        • Kama7021

          Очень странно. А как вы поняли, что функция тормоза вызывает? Как и чем проверяли?

          Ответить8.1 лет назад #
          • Lovedancer cайт: www.alliance.zp.ua

            Извините за долгий ответ. Никак не мог времени выделить.
            ...что касается тормозов, то я просто заметил, что сайт стал намного дольше грузиться... а подтвердил я свои опасения с помощью вот этого сервиса: http://tools.pingdom.com/fpt

            Ответить8 лет назад #
  • Скляревский cайт: mytashkent.uz

    Кама, а нельзя ли доработать этот плагин, чтобы он выводил рейтинг постов по просмотрам за неделю, за месяц и за все время? Актуально! Было бы полезно для всех.

    Спасибо за блог, сижу читаю.

    Ответить8 лет назад #
    • Kama7021

      На днях возьмусь за доработку, вы не первый кто о подобном говорит. Логика очевидна, действительно нужно доработать.

      Ответить8 лет назад #
  • Игорь cайт: iramara.com

    Очень полезный блог, подсел на него. smile Вот понадобилось вести подсчет количества посещений, все сделал как написано, но на сайте перед хидером выдает вот такую фигню и съезжают стили. Может есть мысли какие? Спасибо!
    P.S. На всякий случай вот содержимое моего файла functions.php с Вашей функцией.

    /* Подсчет количества посещений страниц
    ---------------------------------------------------------- */
    function kama_postviews() {
    
    /* ------------ Настройки -------------- */
    $meta_key       = 'Просмотров'; // Ключ мета поля, куда будет записываться количество просмотров.
    $who_count      = 1;            // Чьи посещения считать? 0 - Всех. 1 - Только гостей. 2 - Только зарегистрированных пользователей.
    $exclude_bots   = 1;            // Исключить ботов, роботов, пауков, тараканов и прочую нечисть =)? 0 - нет, пусть тоже считаются. 1 - да, исключить из подсчета.
    /* СТОП настройкам */
    
    global $user_ID, $post;
    	if(is_single() || is_page()) {
    		$id = intval($post->ID);
    		$post_views = intval(get_post_meta($id,$meta_key, true));
    		$should_count = false;
    		switch(intval($who_count)) {
    			case 0: $should_count = true;
    				break;
    			case 1:
    				if(intval($user_ID) == 0)
    					$should_count = true;
    				break;
    			case 2:
    				if(intval($user_ID) > 0)
    					$should_count = true;
    				break;
    		}
    		if(intval($exclude_bots) == 1 && $should_count) {
    			$useragent = $_SERVER['HTTP_USER_AGENT'];
    			$notbot = "Mozilla|Opera|Dillo"; // 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);
    	}
    }
    add_action('wp_head', 'kama_postviews');
    
    <?php
    
    // Widget Settings
    
    if ( function_exists('register_sidebar') )
    	register_sidebar(array(
    		'name' => 'Sidebar_top',
    		'before_widget' => '',
    		'after_widget' => '', 
    		'before_title' => '<h2>',
    		'after_title' => '</h2>',
    	));
    
    if ( function_exists('register_sidebar') )
    	register_sidebar(array(
    		'name' => 'Sidebar_left',
    		'before_widget' => '', 
    		'after_widget' => '', 
    		'before_title' => '<h2>',
    		'after_title' => '</h2>',
    	));
    
    if ( function_exists('register_sidebar') )
    	register_sidebar(array(
    		'name' => 'Sidebar_right',
    		'before_widget' => '',
    		'after_widget' => '', 
    		'before_title' => '<h2>',
    		'after_title' => '</h2>',
    	));
    
    add_theme_support( 'post-thumbnails', array( 'post' ) );
    set_post_thumbnail_size( 100, 100 );
    
    ?>
    Ответить8 лет назад #
  • Игорь cайт: iramara.com

    А как можно обнулить, а лучше принудительно установить произвольную цифру количества просмотров (начальную, например)?

    Ответить8 лет назад #
    • Kama7021

      Добавить или обнулить произвольное поле у каждой записи.

      Ответить8 лет назад #
      • Игорь cайт: iramara.com

        Сорри, не заметил в админке это поле поначалу. Спасибо!

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