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

Kama Postviews

Считает количество просмотров страницы и делает это через AJAX, но без использования среды WordPress, за счет чего нагрузка снижается в десятки раз!

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

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

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

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

kpv_views()

Выводит кол-во просмотров поста или термина на экран.

<?php kpv_views( $id, $type ) ?>

Описание $id, $type — смотрите ниже.

get_kpv_views()

Тоже что и kpv_views(), только получает значение в переменную.

$views = get_kpv_views( $id, $type );

Описание $id, $type — смотрите ниже.

kpv_fresh_views()

Выводит количество просмотров и обновляет значение при просмотре (через AJAX). Это такая же функция что и: kpv_views(), get_kpv_views(), только предназначена для работы с плагинами страничного кэширования, например, «WP Super Cache». Оборачивает результат get_kpv_views() в тег <span class="ajax_views"> чтобы затем значение внутри этого тега обновлялось через AJAX.

<?php kpv_fresh_views( $id, $type ) ?>

Описание $id, $type — смотрите ниже.

get_kpv_fresh_views()

Тоже что и kpv_fresh_views(), только получает значение в переменную.

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

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

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

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

Четыре функции выше работают на основе метаполей views и views_prev_month.

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

// Записи
get_post_meta( $post_id, 'views', 1 );
get_post_meta( $post_id, 'views_prev_month', 1 );

// Элементы таксономий (термины)
get_term_meta( $term_id, 'views', 1 );
get_term_meta( $term_id, 'views_prev_month', 1 );
меню

kpv_get_popular_posts()

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

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

Возвращает

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

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

kpv_get_popular_terms()

Получает объекты терминов (объекты 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)
    Название типа записи, если $type = post.
    По умолчанию: post

  • taxonomy(string)
    Название таксономии, если $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

  • 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 зону из локальной.

Названия метаполей

Плагин записывает просмотры в свою таблицу, а также в мета-поля записей/терминов. По умолчанию название метаполей такие:

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

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

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

Примеры

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

	?>
	<h2>
		<a href="<?php the_permalink() ?>">
			<?php the_title() ?> ( <?php echo $post->views ?> )
		</a>
	</h2>
	<?php
}

wp_reset_postdata();
меню

#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:

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

$obj = array_shift( $objects );

echo $obj->views;

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

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

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

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

$obj = array_shift( $objects );

echo $obj->views;

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

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

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

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

echo $sum; // 505272

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

72 коммента
Полезные 2 Все
    Войти