WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru WPmentor - Ищем топовых специалистов по WordPress, чтобы помочь вам заработать

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

Сегодня хочу поделится с вами очередной функцией вывода записей. Функция является прямым дополнением статьи "Считаем количество посещений страниц на 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 string     $key    (views)  Ключ произвольного поля, по значениям которого будет проходить выборка.
 *     @type int|string $num    (10)     Количество постов или offset для пагинации - 10 или 20,10.
 *     @type string     $order  (desc)   Порядок вывода записей. Может быть: asc|desc.
 *     @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).
 *     @type string     $return (string) Может быть: string|array. Позволяет вернуть массив объектов постов, а не готовый HTML.
 * }
 *
 * @return bool|int|mixed|string
 *
 * @ver 1.2
 */
function kama_get_most_viewed( $args = '' ){
	global $wpdb, $post;

	parse_str( $args, $i );

	$num    = isset( $i['num'] )    ? preg_replace( '/[^0-9,\s]/', '', $i['num'] ) : 10; // 20,10 | 10
	$key    = isset( $i['key'] )    ? sanitize_text_field($i['key']) : 'views';
	$order  = isset( $i['order'] ) && in_array( strtoupper($i['order']), [ 'ASC', 1 ] )  ? '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;
	$return = isset( $i['return'] ) ? $i['return'] : 'string';

	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";
	}

	$esc_key = esc_sql( $key );

	$sql = "SELECT *, (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 = '$esc_key' $AND_days
		AND p.post_type = 'post'
		AND p.post_status = 'publish'
	ORDER BY views $order LIMIT $num";

	$posts = $wpdb->get_results( $sql );
	if( ! $posts )
		return false;

	if( 'array' === $return )
		return $posts;

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

	foreach( $posts 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;
}
/**
 * 1.2 - параметр return + небольшой рефакторинг
 * 1.1 - в num можно указывать offset
 */

Как обычно, этот код нужно поместить в ваш файл шаблона 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. На страницах данного сайта Вы можете также получить различные услуги по развитию страниц в данной социальной сети. При желании, Вам помогут опытные и квалифицированные специалисты технической поддержки сайта.

214 комментов
Полезные 10 Вопросы 3 Все
  • Алексей

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

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

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

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

      В num укажи необходимый отступ, например: 10,10 - это вторая страница пагинации, при выводе 10 записей на страницу, 20,10 - это третья страница и т.д.

      Ответить29.Фев.2020 в 14:09 #
  • Добрый день . Подскажите пож. как вывести изображение поста в этой функции

    Ответить05.Апр.2020 в 18:21 #