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

Функция вывода записей по количеству просмотров

Сегодня хочу поделится с вами очередной функцией вывода записей. Функция является прямым дополнением статьи "Считаем количество посещений страниц на WordPress без плагинов". В задачу функции входит вывод записей отсортированных по произвольному полю, в котором собирается количество просмотров каждого поста. Проще говоря, функция выводит самые просматриваемые записи блога/сайта на WordPress.

Однако, чтобы применить эту функцию для начала необходимо использовать код из статьи, ссылку на которую я дал выше, именно тот код будет считать количество посещений страницы и записывать их в произвольное поле, а функция из этой статьи будет выводить записи по этому произвольному полю, т.е. по наибольшему количеству просмотров.

Итак, знакомьтесь.

Смотрите также платный плагин Kama Postviews.

Функция для вывода самых просматриваемых записей

/**
 * Функция для вывода записей по произвольному полю содержащему числовое значение.
 *
 * Пример вызова:
 *     kama_get_most_viewed( "num=5 &key=views &cache=1 &format={a}{title}{/a} - {date:j.M.Y} ({views}) ({comments})" );
 * 
 * @param string $args {
 *
 *     @type int     $num    (10)    Количество постов.
 *     @type string  $key    (views) Ключ произвольного поля, по значениям которого будет проходить выборка.
 *     @type string  $order  (DESC)  Порядок вывода записей. Чтобы вывести сначала менее просматириваемые устанавливаем order=1
 *     @type string  $format  ('')   Формат выводимых ссылок. По дефолту такой: ({a}{title}{/a}).
 *                                   Можно использовать, например, такой:
 *                                   {date:j.M.Y} - {a}{title}{/a} ({views}, {comments}).
 *     @type int     $days   (0)     Число последних дней, записи которых нужно вывести
 *                                   по количеству просмотров. Если указать год (2011,2010),
 *                                   то будут отбираться популярные записи за этот год.
 *     @type int     $cache  (0)     Использовать кэш или нет.  Варианты 1 - кэширование включено, 0 - выключено (по дефолту).
 *     @type string  $echo   (1)     Выводить на экран или нет. Варианты 1 - выводить (по дефолту), 0 - вернуть для обработки (return).
 * }
 *
 * @return bool|int|mixed|string
 *
 * @ver 1.0
 */
function kama_get_most_viewed( $args = '' ){
	global $wpdb, $post;

	parse_str( $args, $i );

	$num    = isset( $i['num'] )    ? (int) $i['num'] : 10;
	$key    = isset( $i['key'] )    ? sanitize_text_field($i['key']) : 'views';
	$order  = isset( $i['order'] )  ? 'ASC' : 'DESC';
	$days   = isset( $i['days'] )   ? (int) $i['days'] : 0;
	$format = isset( $i['format'] ) ? stripslashes( $i['format'] ) : '';
	$cache  = isset( $i['cache'] );
	$echo   = isset( $i['echo'] )   ? (int) $i['echo'] : 1;

	if( $cache ){
		$cache_key = (string) md5( __FUNCTION__ . serialize( $args ) );

		//получаем и отдаем кеш если он есть
		if( $cache_out = wp_cache_get( $cache_key ) ){ 
			if( $echo )
				return print( $cache_out );
			else
				return $cache_out;
		}
	}

	if( $days ){
		$AND_days = "AND post_date > CURDATE() - INTERVAL $days DAY";
		if( strlen( $days ) == 4 ){
			$AND_days = "AND YEAR(post_date)=" . $days;
		}
	}

	$sql = "SELECT p.ID, p.post_title, p.post_date, p.guid, p.comment_count, (pm.meta_value+0) AS views
	FROM $wpdb->posts p
		LEFT JOIN $wpdb->postmeta pm ON (pm.post_id = p.ID)
	WHERE pm.meta_key = '$key' $AND_days
		AND p.post_type = 'post'
		AND p.post_status = 'publish'
	ORDER BY views $order LIMIT $num";
	$results = $wpdb->get_results( $sql );
	if( ! $results ){
		return false;
	}

	$out = $x = '';
	preg_match( '!{date:(.*?)}!', $format, $date_m );

	foreach( $results as $pst ){

		$x = ( $x == 'li1' ) ? 'li2' : 'li1';

		if( $pst->ID == $post->ID )
			$x .= ' current-item';

		$Title    = $pst->post_title;
		$a1       = '<a href="' . get_permalink( $pst->ID ) . "\" title=\"{$pst->views} просмотров: $Title\">";
		$a2       = '</a>';
		$comments = $pst->comment_count;
		$views    = $pst->views;

		if( $format ){

			$date    = apply_filters( 'the_time', mysql2date( $date_m[ 1 ], $pst->post_date ) );
			$Sformat = str_replace( $date_m[ 0 ], $date, $format );
			$Sformat = str_replace( [ '{a}', '{title}', '{/a}', '{comments}', '{views}' ], [ $a1, $Title, $a2, $comments, $views, ], $Sformat );
		}
		else
			$Sformat = $a1 . $Title . $a2;

		$out .= "<li class=\"$x\">$Sformat</li>";
	}

	if( $cache )
		wp_cache_add( $cache_key, $out );

	if( $echo )
		echo $out;
	else
		return $out;
}

Как обычно, этот код нужно поместить в ваш файл шаблона functions.php или в то место где будет использована эта функция. Если такого файла у вас нет, то его можно и даже нужно создать!

После того, как функция скопирована в functions.php её можно использовать. Как? Очень просто: открываете файл шаблона (темы) и в то место где нужно вывести список самых просматриваемых записей вызываете функцию (вставляете следующий код):

<ul>
	 <?php kama_get_most_viewed("num=10"); ?>
</ul>

где,  num=10 — это указание сколько записей показывать в списке.

Это все, функция должна работать.

Расширенное использование

Те, кто заглянул в код функции, наверняка увидели вначале строчку "Параметры передаваемые функции" и догадались что функция то не простая, вывод можно немного настроить, а как это сделать я, конечно, сейчас расскажу.

Параметры, которые можно передать функции:
  • num - количество выводимых ссылок в списке (постов). по умолчанию выводится 10;

  • key - название ключа произвольного поля, по значениям которого будет проходить выборка. Так как в функции для подсчета просмотров используется ключ "Просмотров", то этот параметр по умолчанию равен "Просмотров".

  • format - Формат выводимых ссылок. По умолчанию формат такой: {a}{title}{/a}. При изменении формата можно использовать, следующие шоткоды:
  • {comments} - покажет колличество комментариев у статьи;
  • {title} - заголовок статьи;
  • {date:j.M.Y} - дата в формате j.M.Y (11.Апр.2010);
  • {a} и {/a} - тег ссылки. Открывается и закрывается.
  • {views} - число просмотров поста.

  • days - число последних дней, записи которых нужно вывести по количеству просмотров. Если указать год (2011,2010), то будут отбираться популярные записи за этот год.

  • cache - использовать кэш или нет. Варианты 1 - кэширование включено, 0 - выключено (по дефолту). Кэш будет работать только совместно с плагинами кэширования запросов. По умолчанию кэширование отключено.

  • echo - выводить на экран или возвращать для обработки. 1 - выводить на экран (по дефолту), 0 - вернуть для обработки (return).

Примеры использования

#1. Список из 15 самых просматриваемых записей

При этом в списке нужно указать дату записи и количество просмотров. Реализуется так:

<ul>
	 <?php kama_get_most_viewed("num=15 &format={a}{title}{/a} - {date:j.M.Y} ({views}, {comments})"); ?>
</ul>

выведет список в формате: Заголовок статьи - 11.Апр.2010 (2300, 25) где, 2300 - просмотры, 25 - комментарии.

#2. Изменим ключ произвольного поля

Для этого добавляем в параметры &key=<название нового ключа>

<ul>
	 <?php kama_get_most_viewed("num=15 &format={a}{title}{/a} - {date:j.M.Y} ({views}, {comments}) &key=views"); ?>
</ul>

выведет список в формате: Заголовок статьи - 11.Апр.2010 (2300, 25). Выборка постов будет проходить по произвольному полю со значением "views".

#3. Выведем 15 самых просматриваемых записей за последние 3 месяца (90 дней):

<ul>
	 <?php kama_get_most_viewed("num=15 &days=90"); ?>
</ul>

На этом все.

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

Быстро, а главное — недорого купить подписчиков в группу Телеграмм Вам поможет сервис Avi1.ru. На страницах данного сайта Вы можете также получить различные услуги по развитию страниц в данной социальной сети. При желании, Вам помогут опытные и квалифицированные специалисты технической поддержки сайта.

209 комментов
Полезные 9 Вопросы 1 Все
  • Алексей

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

    Ответить14.Ноя.2019 в 00:47 #
  • Петрович

    Добрый день.
    Подскажите, как пагинацию сделать к данной функции?
    Спасибо.

    Ответить19.Ноя.2019 в 02:38 #