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

Kama Postviews

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

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

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

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

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

Можно использовать базовые функций WP:

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

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

Или можно использовать функции плагина:

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

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

get_kpv_views()

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

Если вы используете плагин кэширования страниц, то вам нужно использовать функцию 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)

Примеры

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

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

$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' ) ?>

Получает объекты постов (объекты 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)
    Название типа записи, если $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' );

Если у вас уже был установлен плагин и название метаполя отличается, то можно переименовать метаполя 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 );

	?>
	<h2>
		<a href="<?php the_permalink() ?>">
			<?php the_title() ?> ( <?php echo $post->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 ) ?>
81 комментарий
Полезные 3 Все
    Войти