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); ?>

Продвижение по низкочастотным запросам

Продвижение по низкочастотным запросам в СПб.

www.kreazone.ru

295 комментов
Полезные 8 Вопросы 3 Все
  • Данил

    Как такое сделать не для записей, а для своего типа записей?

    3
    Ответить9 мес назад #
  • @ Артем

    Добрый день, Тимур. Огромное спасибо за вашу работу) Подскажите, можно ли с помощью этого плагина выводить кол-во посещений за сутки и месяц дополнительно к общему количеству?

    Ответить7 мес назад #
    • в этом плагине нет, но у него есть платный плагин, смотрите выше, там есть это

      1
      Ответить5 мес назад #
  • Devvver cайт: devvver.ru

    Запросы в плагине обрабатываются через admin-ajax.php ?

    Ответить5 мес назад #
    • Kama7482

      Нет, там в обход ВП все делается, для минимальной нагрузки.

      Ответить4 мес назад #
  • @ Владислав

    Добрый день!
    Подскажите, пожалуйста, как я могу посчитать количество посещений страницы категорий?
    Большое спасибо, всем не равнодушным! thank_you

    1
    Ответить4 мес назад #
    • Kama7482

      Платную версию плагина приобритай, там это есть.

      Ответить4 мес назад #
  • triumfator1987

    можно же просто update_post_meta, если поля нет то оно создастся так ведь? А... уже понял. апдейт ссылается на эдд

    Ответить4 мес назад #
  • Мика

    У меня плагин был yuzo - его взломали и внедрили вирус через него. Снес... Но он просмотры в базе хранил.
    Можно ли как-то восстановить былое кол-во просмотров, связав с этим кодом данные из его базы?

    Ответить2 мес назад #
    • @ campusboy3345 cайт: www.youtube.com/c/wpplus

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

      1
      Ответить2 мес назад #
  • Игорь

    Добрый день.
    Использую ваш бесплатный счетчик и при сортировке

    WP_Query ('post_type' => 'post', 'orderby' => 'meta_value', 'meta_key' => 'views', 'order' => 'ASC') 

    сортирует так:
    1
    11
    13
    35
    5

    Можно ли это как-то изменить, чтоб сортировал по порядку?

    Ответитьмесяц назад #
    • @ campusboy3345 cайт: www.youtube.com/c/wpplus

      Привет. Попробуйте вместо 'orderby' => 'meta_value' написать 'orderby' => 'meta_value_num'

      2
      Ответитьмесяц назад #
      • Игорь

        Спасибо, работает!

        Ответитьмесяц назад #
        • @ Андрей

          Добрый день !

          а у меня не работает

          Тема Twenty Seventeen
          в functions.php дописал код указанной функции
          на page.php или single.php
          поставил вызов echo get_post_meta ($post->ID,'views',true);

          .. и ничего не вижу sad

          1
          Ответитьмесяц назад #
          • @ Андрей

            работает smile
            кэш видимо ... йети его ..

            1
            Ответитьмесяц назад #
  • День добрый, использовал ваш код для подсчёт просмотров постов, есть секция, где посты необходимо выводить по кол-ву просмотров. Игнорирует заданные параметры. Может кто подскажет? Буду очень признателен.

    $args = array(
    				'meta_key'=>'views',
    				'orderby'=>'meta_value_num',
    				'order' => 'DESC',
    				'posts_per_page' => 7,
    				'post_type' => 'post');
    			$wp_query = new WP_Query($args);
    			while ($wp_query->have_posts()) :
    					$wp_query->the_post();
    
    			 echo get_post_meta ($post->ID,'views',true); 
    			 endwhile; 
    			 wp_reset_postdata(); 
    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться