WordPress как на ладони

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

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

Этот код больше не поддерживается!

Рекомендую свой плагин. В нём:

  • Более стабильный принцип подсчета.
  • Подсчет визитов для таксономий, главной, архивов.
  • График посещений (в том числе уникальных).
  • Минимум данных в БД (БД не будет расти как на дрожжах, как в других плагинах).
  • Подсчет работает на аяксе и очень быстро - WP среда не подгружается.
  • Рассчитан на работу с плагинами объектного кэширования.
Смотреть плагин

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

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

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

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

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

А вот и функция, которая у меня получилась - функция для подсчета посещений страниц на 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 ); ?>
315 комментариев
Полезные 10Вопросы 2 Все
    Войти