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

Kama Postviews

Считает количество просмотров страниц/терминов через AJAX. Отсекает подсчеты для роботов (считает только реальные визиты). Грамотно хранит данные в БД, так чтобы спустя время ваша БД не стала весить гигабайты.

В AJAX запросе не используется среда WordPress - это значительно снижает нагрузку на сервер!

Плагин рассчитан на работу совместно с плагинами страничного кэширования, например, WP Super Cache и ему подобные.

Позволяет получать записи/термины по количеству просмотров.

Считает просмотры не только для записей (постов), но и для всех сущностей WordPress:

  • Записи (любые типы постов)
  • Термины (рубрики, метки, произвольные таксономии)
  • Главная страница
  • 404 страница
  • Архивы авторов, по дате и т.д.

Что нужно и не нужно считать настраивается в админке.

Как вывести просмотры в шаблоне

Для этого есть фукнции:

Это обертки для функций ниже. Они объединяет вывод всех просмотров и просмотров за месяц (если в настройках указано, что нужно также показывать данные за месяц).

Функция get_kpv_fresh_views() точно такая же как get_kpv_views(), с той лиш разницей что она предназначена для использования, когда на сайте включен плагин страничного кэширования. Она выводит значение из БД и затем это значение обновляется через AJAX.

Или можно использовать функций kpv_get_post_meta_views() или kpv_get_term_meta_views():

// Записи
echo 'Просмотров: ' . kpv_get_post_meta_views( $post_id );

// Элементы таксономий (термины)
echo 'Просмотров: ' . kpv_get_term_meta_views( $term_id );

Эти функции - это оберки для функций WordPress get_post_meta() и get_term_meta().

Функции плагина

get_kpv_views()

Получает кол-во просмотров поста или термина. Можно указать чтобы выводились просто числа, без HTML.

Функция под капотом Автоматически определит ID поста/термина и тип текущей страницы. Рассчитана на использование на страницах постов is_singular() и терминов is_tax().

Если вы используете плагин кэширования страниц, то вам нужно использовать функцию get_kpv_fresh_views(), а не эту функцию.

Использование

$views = get_kpv_views( $id, $type, $use_html = true );
$id(число)
ID Записи (поста) или Термина (элемента таксономии).
По умолчанию: 0 (ID текущего поста или ID текущего термина)
$type(строка)

Тип переданного ID. Может быть:

  • term — для элементов таксономии
  • post — для записей

По умолчанию: '' (тип просматриваемой страницы)

$use_html(true|false)
Вернуть HTML или просто числа?
По умолчанию: true (Вернуть HTML)

Примеры

Что выводит функция.
$views = get_kpv_views();

Получим в $views:

<span class="fresh-views__all all-views">13097</span>
<small class="fresh-views__month prev-m-views">36</small>
Выведем результат на экран:
<?php echo get_kpv_views() ?>

Или можно записать короче:

<?= get_kpv_views() ?>
Укажем конкретный пост:
$views = get_kpv_views( 1, 'post' );

Отключим HTML:

$views = get_kpv_views( 1, 'post', false ); // 13097, 36
Укажем конкретный элемент таксономии:
$views = get_kpv_views( 1, 'term' );

get_kpv_fresh_views()

Получает количество просмотров. Значение обновляется при получении AJAX ответа после очередного подсчета визита.

Это такая же функция что и get_kpv_views(), только предназначена для работы с плагинами страничного кэширования, например, «WP Super Cache».

Использование

$views = get_kpv_fresh_views( $id, $type );
$id(число)
ID Записи (поста) или Термина (элемента таксономии).
По умолчанию: 0 (ID текущего поста или ID текущего термина)
$type(строка)

Тип переданного ID. Может быть:

  • term — для элементов таксономии
  • post — для записей

По умолчанию: '' (тип просматриваемой страницы)

Примеры

Автоматически определит ID поста/термина и тип текущей страницы.

Рассчитано на использование на страницах постов is_singular() и терминов is_tax().

$views = get_kpv_fresh_views();

Получим в $views:

<span class="fresh-views ajax_views_js">
	<span class="fresh-views__all all-views">13097</span>
	<small class="fresh-views__month prev-m-views">36</small>
</span>
Выведем результат на экран:
<?php echo get_kpv_fresh_views() ?>

Или можно записать короче:

<?= get_kpv_fresh_views() ?>
Укажем конкретный пост:
<?php kpv_fresh_views( $post_id, 'post' ) ?>
Укажем конкретный термин (элемент таксономии):
<?php kpv_fresh_views( $term_id, 'term' ) ?>

kpv_get_post_meta_views() и kpv_get_term_meta_views()

Получает кол-во просмотров сохраненное в метаполя записи.

Оригинальные данные просмотров хранятся в отдельных таблицах плагина. Чтобы получить данные от туда используйте функции get_kpv_views()
get_kpv_fresh_views().

Эти функции могут быть полезны, когда нужно в списке записей для каждой вывести кол-во просмотров.

Эти функции не умеют работать с плагинами страничного кэширования. Это всего лишь обертки для функций WorPress: get_post_meta() и get_term_meta().

Возвращает

int. Число просмотров записи или термина.

Использование
$post_views = kpv_get_post_meta_views( $post_id, $type );
$term_views = kpv_get_term_meta_views( $term_id, $type );
$post_id|$term_id(число) (обязательный)
ID Записи (поста) или Термина (элемента таксономии).
$period(строка)

За какой период нужны данные. Может быть:

  • all — (по умолчанию) за все вермя.
  • month — за предыдущий месяц (за целый месяц - текущий месяц скорее всего не закончился, поэтому за полный месяц данные берутся из прошлого месяца).

По умолчанию: 'all'

Примеры

Выведем кол-во просмотро записи в списке записей:
<?php
while ( have_posts() ){
	the_post();
	$post_id = get_the_ID();
	?>
	<!-- Вывод постов, функции цикла: the_title() и т.д. -->

	<?php echo kpv_get_post_meta_views( $post_id, 'all' ) ?>
	/
	<?php echo kpv_get_post_meta_views( $post_id, 'month' ) ?>
	<?php
	}
?>

Получает объекты постов (объекты WP_Post) отсортированные по просмотрам. Работает на основе первичных данных из таблицы плагина.

Обёртка для функции kpv_get_viewed_objects(). Устанавливает дефолтные параметры и обрабатывает результат через get_posts() чтобы вернуть объекты постов WordPress.

Возвращает

WP_Post[]. Массив объектов WP_Post.

Использование
$posts = kpv_get_popular_posts( $args );
$args
Возможные параметры смотрите в описании kpv_get_viewed_objects().

Получает объекты терминов (объекты WP_Term) отсортированные по просмотрам. Такая же как предыдущая, только работает с терминами.

Обёртка для функции kpv_get_viewed_objects().

Возвращает

WP_Term[]. Массив объектов WP_Term.

Использование
$terms = kpv_get_popular_terms( $args );
$args
Возможные параметры смотрите в описании kpv_get_viewed_objects().

kpv_get_viewed_objects()

Базовая функция для получения данных просмотров из таблицы плагина.

Возвращает

  • Массив. Массив объектов с id объекта (поста, термина и т.д.) и кол-во просмотров этого объекта за указанный период, день.
Array
	[37] => stdClass Object
			[obj_id] => 37
			[views] => 483

	[11] => stdClass Object
			[obj_id] => 11
			[views] => 465
  • Пустой массив - когда посты не найдены.
Использование
$objects = kpv_get_viewed_objects( $args );
$args(массив)

Получает самые просматриваемые записи (или другие типы) за указанный период времени и сортирует их по просмотрам. В датах нужно передавать время в UTC (GMT), а не локальное время сайта. Массив параметров:

  • type(string) (обязательный)
    Тип получаемых данных. Может быть: post, term, front_page, search, 404, post_type_archive, year, month, day.
    По умолчанию: 'post'

  • post_type(string|array)
    Название типа записи, если $type = post. Можно указать несколько в массиве.
    По умолчанию: post

  • taxonomy(string|array)
    Название таксономии, если $type = term. Можно указать несколько в массиве.
    По умолчанию: category

  • object_ids(array)
    ID объектов (постов, терминов, юзеров) из которых нужно делать выборку.

  • exclude(array)
    ID объектов (постов, терминов, юзеров) которые нужно исключить из выборки.

  • for_range(string)
    Период за который нужно получить популярные посты. Формат: 2017-08-01,2017-09-16.

    Если указать одну дату, то след. дата будет текущая.

    Вместо любой даты можно указать относительный формат. Примеры относительного формата: today, yesterday, -2 day или 2 days ago, -2 month или 2 months ago, first day of -2 month.
    По умолчанию: ''

  • for_day(string)
    День за который нужно получить популярные объекты (посты, термины). Формат: 2017-08-01. Можно указать относительный формат.
    По умолчанию: ''

  • for_month(string)
    Месяц за который нужно получить популярные объекты. Формат: 2017-08 или 2017-08-xx. Можно указать относительный формат.
    По умолчанию: ''

  • limit(int)
    Сколько объектов получать.
    По умолчанию: 20

  • offset(int) (с версии 3.6.4)
    Отступ перед limit для возможности создавать пагинацию.
    По умолчанию: 0 (не установлен)

  • paged(int) (с версии 3.6.4)
    Номер страницы пагинации (обертка, чтобы не нужно было высчитывать $offset на базе установленного $limit). Работает только если не установлен параметр $offset ($offset более приоритетный).
    По умолчанию: 1

  • order(string)
    Как сортировать.
    По умолчанию: DESC (популярные вверху)

  • meta_key(array) (с версии 3.4.0)
    Выборка по метаполям WP. См. параметр meta_query.

  • meta_compare(array) (с версии 3.4.0)
    Выборка по метаполям WP. См. параметр meta_query.

  • meta_value(array) (с версии 3.4.0)
    Выборка по метаполям WP. См. параметр meta_query.

  • meta_query(array) (с версии 3.4.0)
    Выборка по метаполям WP. Работает только при $type = post или $type = term. Полный список связанных параметров смотрите в описании WP_Query meta_query.

Заметки

Даты в плагине

Все даты в таблице плагина ориентируются на UTC (GMT, гринвич) зону. Поэтому если нужно получать точные данные преобразовывайте передаваемые данные в GTM зону из локальной и наоборот.

Мета-поля постов. Дублирование кол-ва просмотров в метаполя

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

По умолчанию название метаполей такие:

  • views — все просмотры записи/термина, за все время.
  • views_prev_month — всего просмотров записи/термина за предыдущий месяц.

Эти названия можно изменить: в файле wp-config.php определите константы:

define( 'KPV_META_KEY', 'my__views' );
define( 'KPV_PREV_MONTH_META_KEY', 'my__views_prev_month' );

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

Если у вас уже был установлен плагин и название метаполя отличается, то можно переименовать метаполя sql запросом, чтобы не добавлять константы выше в wp-config.php.

// замените post_views_count на ваш, ключ который нужно переименовать
$old_meta_key = 'post_views_count';

global $wpdb;
$up = $wpdb->query( $wpdb->prepare(
	"UPDATE $wpdb->postmeta SET meta_key = 'views' WHERE meta_key = %s",
	$old_meta_key
) );

die( "Обработано строк: $up" );

Примеры

#1 Записи Популярные вчера

Этот пример получает 10 самых популярных постов (записей типа post). 10 записей отсортированных по просмотрам за вчерашний день.

Чтобы получить популярные записи за период (например, за последнюю неделю), используйте параметр for_range вместо for_day.

<?php
global $post;

$posts = kpv_get_popular_posts( [
	'post_type' => 'post',      // тип записи
	'for_day'   => 'yesterday', // за позавчера, пишем '-2 days'
	//'for_range' => '-7 days',   // за последние 7 дней (неделю)
	//'for_month' => '2017-08',   // за прошлый месяц, пишем '-31 day'
	'limit'     => 10,
] );

foreach( $posts as $post ){
	setup_postdata( $post );

	$views = $post->views . '/' . get_post_meta( $post->ID, KPV_META_KEY, true );
	?>
	<h2>
		<a href="<?php the_permalink() ?>">
			<?php the_title() ?> ( <?= esc_html( views ) ?> )
		</a>
	</h2>
	<?php
}

wp_reset_postdata();

#1.1 Посты за неделю (самые популярные)

Обратите внимание! Может быть два варианта получения популярных постов, например:

  1. Посты популярные за неделю — это посты с максимальными просмотрами в течении недели (тут неважно когда опубликован пост, он может быть и прошлогодний, но самый просматриваемый).

  2. Посты за неделю (самые популярные) — это опубликованные за неделю посты отсортированные по просмотрам.

Для 1 и 2 код будет совершенно разный.

Любые популярные посты за неделю:
$posts = kpv_get_popular_posts( [
	'post_type' => 'post',
	'for_range' => '-7 days',
	'limit'     => 10,
] );

foreach( $posts as $post ){
   echo "$post->post_title ($post->views)\n";
}
Посты за неделю (по популярности):

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

Получим посты за последнюю неделю и отсортируем их по популярности:

$posts = get_posts( [

	'post_type' => 'post',

	'date_query' => [
		'after' => '7 days ago',
	],

	'meta_query' => [
		'meta_views' => [
			'key' => 'views',
			'type' => 'NUMERIC',
		],
	],

	'orderby' => [ 'meta_views' => 'desc' ],

	'limit' => 10,
] );

foreach( $posts as $post ){
   echo "$post->post_title ($post->views)\n";
}

Или можно получить, например посты за последний месяц и из них получить самые популярные за неделю:

// получим посты

$posts_ids = get_posts( [
	'post_type' => 'post',
	'date_query' => [
		'after' => '1 month ago',
	],
	'fields' => 'ids',
	'posts_per_page' => -1,
] );

// получим самые просматриваемые из них (за неделю)

$posts = kpv_get_popular_posts( [
	'post_type'  => 'post',
	'for_range'  => '-7 days',
	'object_ids' => $posts_ids,
	'limit'      => 5,
] );

foreach( $posts as $post ){
	echo "$post->post_title ($post->views)\n";
}

#2 Популярные термины за вчерашний день

Этот пример получает 10 самых популярных элементов таксономии my_tax. 10 терминов отсортированных по просмотрам за вчерашний день.

Чтобы данные за период (например, за последнюю неделю), используйте параметр for_range вместо for_day.

$terms = kpv_get_popular_terms( [
	'taxonomy'  => 'category',
	'for_range'   => '-30 day', // за позавчера, пишем '-2 days'
	//'for_range' => '-7 days',   // за последние 7 дней (неделю)
	'limit'     => 10,
] );

foreach( $terms as $term ){
	echo "<h2>$term->term_id - ". esc_html( $term->name ) ."( $term->views )</h2>";
}

#3 Популярные посты из двух рубрик

Создать такой запрос через функцию kpv_get_popular_posts() не получится. Потому что она выводит популярные посты или термины по типу и за период времени. Запрос делается в основную таблицу данных плагина, а в ней нет привязки к рубрикам. Теоретически можно объединить запросы с помощью JOIN и выйти на рубрики, но в этом случае SQL запрос получится довольно сложным.

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

  • views — хранится число всех просмотров.
  • views_prev_month — хранится число просмотров за предыдущий месяц (можно грубо считать что за месяц).
$posts = get_posts( [
	'post_type'      => 'post',
	'posts_per_page' => 10,
	'tax_query'      => [
		[
			'taxonomy' => 'category',
			'field'    => 'slug',
			'terms'    => [ 'codex', 'functions' ],
		],
	],
	'meta_query' => [
		'views_count' => [
			'key'  => 'views', // views, views_prev_month
			'type' => 'NUMERIC',
		],
	],
	'orderby'  => [ 'views_count'=>'DESC' ],
] );

global $post;
foreach( $posts as $post ){
	setup_postdata( $post );

	echo esc_html( get_the_title() ) .' - '. number_format( get_post_meta( $post->ID, 'views', 1 ) ) .'<br>';
}
wp_reset_postdata();

#4 Просмотры для отдельной записи за указанный период

Когда нужно получить количество просмотров отдельного поста за указанный период, можно использовать функцию kpv_get_viewed_objects:

$post_id = 1;
$objects = kpv_get_viewed_objects( [
	'post_type'  => 'post',
	'for_range'  => '2021-01-01,2021-12-31', // or '-1 year'
	'object_ids' => $post_id,
	'limit'      => 999,
] );

$obj = array_shift( $objects );

echo $obj->views;

По аналогии можно получить просмотры нескольких постов, терминов и т.д..

По аналогии можно получить просмотры термина, главной страницы или любой другой.

#6 Просмотры главной страницы

Получим просмотры главной страницы за 2021 год:

$objects = kpv_get_viewed_objects( [
	'type'      => 'front_page',
	'for_range' => '2021-01-01,2021-12-31', // or '-1 year'
	'limit'     => 99999,
] );

$obj = array_shift( $objects );

echo $obj->views;

#5 Суммарные просмотры для всего типа записи

Код ниже считает все просмотры всех записей типа post за 2021 год:

$objects = kpv_get_viewed_objects( [
	'post_type' => 'post',
	'for_range' => '2021-01-01,2021-12-31', // or '-1 year'
	'limit'     => 99999,
] );

$views = wp_list_pluck( $objects, 'views' );
$sum = array_sum( $views );

echo $sum; // 505272

Если записей у типа записи много, то лучше написать отдельный запрос в БД.

Устарелые функции

kpv_views()

Выводит на экран результат функции get_kpv_views().

Устарела с версии 3.5.5., используйте взамен:

<?php echo get_kpv_views( $id, $type ) ?>

kpv_fresh_views()

Выводит на экран результат функции get_kpv_fresh_views().

Устарела с версии 3.5.5., используйте взамен:

<?php echo get_kpv_fresh_views( $id, $type ) ?>
95 комментариев
Полезные 3 Все
    Войти