WordPress как на ладони
Дешевый WordPress пакет для разработки Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

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

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

/** Функция для вывода записей по произвольному полю содержащему числовое значение.
-------------------------------------
Параметры передаваемые функции (в скобках дефолтное значение):
num (10) - количество постов.
key (views) - ключ произвольного поля, по значениям которого будет проходить выборка.
order (DESC) - порядок вывода записей. Чтобы вывести сначала менее просматириваемые устанавливаем order=1
format(0) - Формат выводимых ссылок. По дефолту такой: ({a}{title}{/a}). Можно использовать, например, такой: {date:j.M.Y} - {a}{title}{/a} ({views}, {comments}).
days(0) - число последних дней, записи которых нужно вывести по количеству просмотров. Если указать год (2011,2010), то будут отбираться популярные записи за этот год.
cache (0) - использовать кэш или нет. Варианты 1 - кэширование включено, 0 - выключено (по дефолту).
echo (1) - выводить на экран или нет. Варианты 1 - выводить (по дефолту), 0 - вернуть для обработки (return).
Пример вызова: kama_get_most_viewed("num=5 &key=views &cache=1 &format={a}{title}{/a} - {date:j.M.Y} ({views}) ({comments})");
*/
function kama_get_most_viewed($args=''){
	parse_str($args, $i);
	$num    = isset($i['num']) ? $i['num']:10;
	$key    = isset($i['key']) ? $i['key']:'views';
	$order  = isset($i['order']) ? 'ASC':'DESC';
	$cache  = isset($i['cache']) ? 1:0;
	$days   = isset($i['days']) ? (int)$i['days']:0;
	$echo   = isset($i['echo']) ? 0:1;
	$format = isset($i['format']) ? stripslashes($i['format']):0;
	global $wpdb,$post;
	$cur_postID = $post->ID;

	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= '';
	preg_match( '!{date:(.*?)}!', $format, $date_m );
	foreach( $results as $pst ){
		$x == 'li1' ? $x = 'li2' : $x = 'li1';
		if ( (int)$pst->ID == (int)$cur_postID ) $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(array('{a}','{title}','{/a}','{comments}','{views}'), array($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 )
		return print $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>

На этом все.

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

А пока, вопрос со своей стороны, - думаю собрать обе эти функции и сделать плагин, нечто подобное wp-postviews. Только гораздо проще. Стоит ли стараться?

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

183 коммента
Полезные 6 Вопросы 4 Все
  • Михаил cайт: beautifuhouse.com

    Приветствую,
    использую с плагином Kama Thumbnail и иконками Font Awesome через допполе Advanced Custom Fields, примерно так

    <div class="cb-mask" style="background-color:;">
    	  <a href="" rel="bookmark" title="">
    <?php if( get_field('icfa') )
    { echo '';}
    ?>
    

    Можно ли иконки прикрутить и сюда тоже

    $out .= "\nID) ."'>". kama_thumb_img("post_id=$pst->ID &w=360 &h=240 &class=image_frame effect-blur &q=85") ."$Sformat";

    Мои эксперименты приводят к белому экрану. dash

    Ответить1.2 год назад #
  • Привет) А как сделать выборку через WP_Query ?
    Чтоб была миниатюра, цитата и название записи.
    Очень нужно, помогите.

    1
    Ответитьгод назад #
  • popay7 cайт: clubwp.ru

    Подскажите а как вывести записи только из пользовательского типа поста?

    Ответитьгод назад #
  • Дарья

    Подскажите пожалуйста как сделать так - чтобы отображались самые просматриваемые статьи из той же рубрики, а не со всех рубрик? Например есть категория "Прически", заходим на статью "Стрижка каскад", в сайдбаре отображается блок с самыми популярными записями категории "Прически".

  • Юрий

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

  • Alex

    Здравствуйте! Не знаю, у кого больше спросить, кроме создателя этой функции) Всё отлично работает, спасибо вам большое! Но проблема вот в чем: я использую плагин qTranslate-X и он в текстовые поля вставляет свои теги [:en] и [:ru], например в заголовок статьи: [:en]Title english[:ru]Заголовок русский[:], которые автоматически как-то обрабатывает и показывает пользователю ту версию языка, которая совпадает с его локальным языком, а остальное скрывает. Но в вашей функции параметр {title} выводит сырой заголовок, необработанный плагином qTranslate-X и он и выглядит как [:en]Title english[:ru]Заголовок русский[:]. Как-то можно это исправить?

    Ответить4 месяца назад #
    • Kama6984

      Обработай заголовок функцией плагина qTranslate-X в строке

      $Title = $pst->post_title;

      Как-то так, только название функции подходящее укажи:

      $Title = qtranslate_function( $pst->post_title );
      1
      Ответить4 месяца назад #
      • Alex

        Спасибо! Всё супер! Так просто оказалось)) Век живи - век учись)

        $Title = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage($pst->post_title);

        вот так всё заработало! А возможно ли простым способом прикрепить туда же миниатюру поста?

        Ответить4 месяца назад #
  • @ Erto

    Такой вопрос - когда указывают срок, за который показать популярные записи, то ничего не отображает. Если не указывать временной промежуток, то отображает список популярных, но за все время.
    Как решить сию проблему?

    Ответитьмесяц назад #
    • @ Erto

      Сам нашел решение.
      Так как код подсчета просмотров у меня другой, то нужно в строке

      $key    = isset($i['key']) ? $i['key']:'views';

      views изменить на значение, которое используется у вас.
      Я заменил на post_views_count, так как используется такой код для подсчета просмотров:

      function getPostViews($postID){
      	$count_key = 'post_views_count';
      	$count = get_post_meta($postID, $count_key, true);
      	if($count==''){
      		delete_post_meta($postID, $count_key);
      		add_post_meta($postID, $count_key, '0');
      		return "0";
      	}
      	return $count.' ';
      }
      function setPostViews($postID) {
      	$count_key = 'post_views_count';
      	$count = get_post_meta($postID, $count_key, true);
      	if($count==''){
      		$count = 0;
      		delete_post_meta($postID, $count_key);
      		add_post_meta($postID, $count_key, '0');
      	}else{
      		$count++;
      		update_post_meta($postID, $count_key, $count);
      	}
      }
      
      1
      Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться