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

207 комментов
Полезные 9 Вопросы 1 Все
  • Дарья

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

    Ответить2 года назад #
    • Artyh

      Добрый день! У меня появилась подобная задача. Я смог реализовать следующим путем:
      В функции нужно дописать условия выборки по определенной категории.
      Возможно есть ещё какие-нибудь способы, но я додумался только до этого, поэтому не судите строго mosking

          $sql = "SELECT p.ID, p.post_title, p.post_content, 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)
      		LEFT JOIN $wpdb->term_relationships tr ON (tr.object_id = p.ID) /*Добавляем эту строку*/
      	WHERE pm.meta_key = '$key' $AND_days
      		AND p.post_type = 'post'
      		AND p.post_status = 'publish'
      		AND tr.term_taxonomy_id = '8' /*И добавляем эту строку, где 8 - ID категории*/
      	ORDER BY views $order LIMIT $num";
      	$results = $wpdb->get_results($sql);
      	if( !$results ) return false;

      Я проверил, у меня вроде работает.
      Может кому-нибудь пригодится smile

      1
      Ответить5 мес назад #
  • Юрий

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

    Ответить1.9 года назад #
    • campusboy3430 www.youtube.com/c/wpplus

      Привет. Удалить в базе все метаполя с ключом views.

      1
      Ответить1.9 года назад #
  • Alex

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

    Ответить1.4 года назад #
    • Kama7629

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

      $Title = $pst->post_title;

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

      $Title = qtranslate_function( $pst->post_title );
      1
      Ответить1.4 года назад #
      • Alex

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

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

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

        1
        Ответить1.4 года назад #
  • @ Erto

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

    Ответить1.1 года назад #
    • @ 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
      Ответить1.1 года назад #
  • Чего-то у меня не хочет показывать популярные посты за 1 и 2 дня только начинает показывать от 3, т.е.

    <?php kama_get_most_viewed("num=5&days=3"); ?>

    В чём может быть проблема, гайз? sorry

    Ответить9 мес назад #
    • Kama7629

      В этой функции выводятся посты опубликованные за последние 2 дня и отсортированные по просмотрам.

      С платным плагином проблем быть не должно, рекомендую его.

      Ответить9 мес назад #
      • Понял. Тогда всё сходится smile

        Платный плагин приобрёл, буду разбираться. Спасибо! good

        Ответить9 мес назад #
  • @ otshelnik anturiumi.ru

    Здравствуйте. Подскажите пожалуйста, как можно перед цифрой количество просмотров прикрутить шрифт fontawesome, в частности иконку глаз? Спасибо.

    Ответить8 мес назад #
    • Пробовали так?

      <i class="far fa-eye"></i><?php kpv_views( $id, $type ) ?>
      
      Ответить8 мес назад #
      • @ otshelnik anturiumi.ru

        Этот код вставить в место где будут выводиться записи? Или где-то в самом скрипте?

        Ответить8 мес назад #
        • Этот код вставить в то место где ты хочешь чтобы выводилось количество просмотров с глазом smile Или я что-то не так понял? scratch_one-s_head А как ты сейчас выводишь количество просмотров?

          Ответить8 мес назад #
          • @ otshelnik anturiumi.ru

            В блоке выводятся самые читаемые записи
            Для вывода записей использую код:

            Надо, что бы перед количеством просмотров, показывался глаз потом {views}
            Пишу с телефона, на работе, трудно ситуацию обрисовать

            Ответить8 мес назад #
            • @ otshelnik anturiumi.ru

              вот так записи выводятся

              <?php kama_get_most_viewed("num=4 &format={a}{title}{/a} {views}"); ?>
              Ответить8 мес назад #
              • Не могу гарантировать, но попробуй так:

                <?php kama_get_most_viewed("num=4&format={a}{title}{/a} <i class='far fa-eye'></i>{views}"); ?>
                1
                Ответить8 мес назад #
                • @ otshelnik anturiumi.ru

                  Так пробовал, результат ошибка, . почему и сюда написал. Спасибо.

                  Ответить8 мес назад #
                  • Исправил. Пробуй smile

                    Ответить8 мес назад #
                    • @ otshelnik anturiumi.ru

                      Наконец то добрался до компа.
                      Так уже лучше, ошибки нет, но и вместо глаза пустой квадрат.
                      Пробовал и так:

                      <?php kama_get_most_viewed("num=4&format={a}{title}{/a} <i class='far fa-eye' aria-hidden='true'></i> {views}"); ?>

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

                    • @ otshelnik anturiumi.ru

                      Все работает, спасибо огромное, была не точность здесь:

                      было так: 'far fa-eye'
                      надо так: 'fa fa-eye'

                      Вот такая конструкция рабочая, может кому пригодится

                      <?php kama_get_most_viewed("num=4&format={a}{title}{/a} <i class='fa fa-eye' aria-hidden='true'></i> {views}"); ?>
                    • У тебя скорее всего старая библеотека Font Awesome. Изображение в моём коде из новой → https://fontawesome.com/icons/eye?style=regular

                    • @ otshelnik anturiumi.ru

                      Да, у меня старая библиотека Font Awesome. Но самое главное теперь глаз на месте)mosking good2 Еще раз спасибо.

                    • Пожалуйста! Рад помочь wink

  • Андрей ПЕтрович

    А как быть с кэшированием?

    Ответить5 мес назад #
    • Kama7629

      Что с ним?

      Ответить5 мес назад #
      • Алексей

        Скорее всего речь идет о том, что базовое значение в функции по умолчанию не задано

        Ответить4 мес назад #
        • Алексей

          Не сразу заработал вывод результата. Думал что я сам что-то намудрил пришлось ковыряться. По итогу оказалось все очень просто. В функции не задано значение

          $echo   = isset( $i['echo'] )   ?: 1;

          там в принципе пусто и с кешем таже история. И еще момент, можно подробнее о кеше. О каком кешировании идет речь? Записи?

          Ответить4 мес назад #
          • Kama7629

            Как не задано, когда задано?

            $echo   = isset( $i['echo'] );

            Это значит, что переменная будет равна true если есть параметр echo. Очевидно если его нет функция вернет результат и выводить его нужно на приеме. Пример этого:

            kama_get_most_viewed([ 'echo'=>1 ]);
            
            // или так
            echo kama_get_most_viewed();
            
            Ответить4 мес назад #
            • Алексей

              Вот и получается что в строке вывода, которая указана вверху по умолчанию пусто

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

              То есть из-за отсутствия этого параметра лично у меня ничего не выводит. В моем случае работает два варианта

              // добавить в стандартную строку параметр &echo=1
              <?php kama_get_most_viewed("num=2 &echo=1"); ?>
              
              // добавить в функцию точное значение параметра echo
              $echo   = isset( $i['echo'] )   ?: 1;

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

              1
              Ответить4 мес назад #
  • @ Doyo

    Приветствую! Как прикрутить эти показы к виджету? У шаблона есть такой виджет:

    class Foo_Widget extends WP_Widget {
    
    	// Регистрация виджета используя основной класс
    	function __construct() {
    		// вызов конструктора выглядит так:
    		// __construct( $id_base, $name, $widget_options = array(), $control_options = array() )
    		parent::__construct(
    			'foo_widget', // ID виджета, если не указать (оставить ''), то ID будет равен названию класса в нижнем регистре: foo_widget
    			'Bukvaprava Последние статьи',
    			array( 'description' => 'Описание виджета', /*'classname' => 'my_widget',*/ )
    		);
    
    	}
    
    	/**
    	 * Вывод виджета во Фронт-энде
    	 *
    	 * @param array $args     аргументы виджета.
    	 * @param array $instance сохраненные данные из настроек
    	 */
    	function widget( $args, $instance ) {
    		global $post;
    		$title = apply_filters( 'widget_title', $instance['title'] );
    		$num = apply_filters( 'widget_title', $instance['num'] );
    
    		echo $args['before_widget'];
    
    		echo '<div class="widjet widjet--sm">';
    		if ( ! empty( $title ) ) {
    			echo '<div class="title">' . $title . '</div>';
    		}
    		$query = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => $num ) );
    		if ( $query->have_posts() ) :
    		while ( $query->have_posts() ) : $query->the_post();
    
    		echo '
    		<a href="'. get_the_permalink().'" class="art-item-small">
    			<div class="art-item-small__table-tc">
    				<div class="art-item-small__img-wrap"><!-- блок фиксированной высоты -->
    					'. get_the_post_thumbnail( $post->ID, 'bukvaprava-thumbnail').'
    				</div>
    				<div class="date art-item-small__date"><i class="ic ic--calendar-sm"></i>'. get_the_date('d.m.Y').'</div>
    			</div>
    			<div class="art-item-small__table-tc"><!-- ячейка таблицы с выравнивание по вертикали -->
    				<div class="art-item-small__text">
    					<p>'. esc_html( get_the_title() ).'</p>
    				</div>
    				<div class="watch art-item-small__watch" data-id="'.$post->ID.'"><i class="ic ic--watch-sm"></i><span id="'.$post->ID.'">'. get_post_meta ($post->ID,'views',true) .'</span></div>
    			</div>
    		</a><!-- /.art-item-small -->
    		 <script type="text/javascript" >
    		   /* jQuery(document).ready(function($) {
    			var dat = {action: "vnebraka_postviews",whatever: '.$post->ID.'};
    			$.ajax({
    				type: "POST",
    				url: frontendajax.ajaxurl,
    				data: dat,
    				success: function(data) {
    					$("#'.$post->ID.'").html(data);
    
    				}
    			});
    		}); */
    		</script>
    		';
    		endwhile;
    		wp_reset_query();
    		endif;
    		echo '</div>';
    		echo $args['after_widget'];
    	}
    
    	/**
    	 * Админ-часть виджета
    	 *
    	 * @param array $instance сохраненные данные из настроек
    	 */
    	function form( $instance ) {
    		$title = @ $instance['title'] ?: 'Последние статьи';
    		$num = @ $instance['num'] ?: 'Количество статей';
    
    		?>
    		<p>
    			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
    			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
    		</p>
    		<p>
    			<label for="<?php echo $this->get_field_id( 'num' ); ?>">Количество статей</label>
    			<input class="widefat" id="<?php echo $this->get_field_id( 'num' ); ?>" name="<?php echo $this->get_field_name( 'num' ); ?>" type="number" value="<?php echo esc_attr( $num ); ?>">
    		</p>
    		<?php
    	}
    
    	/**
    	 * Сохранение настроек виджета. Здесь данные должны быть очищены и возвращены для сохранения их в базу данных.
    	 *
    	 * @see WP_Widget::update()
    	 *
    	 * @param array $new_instance новые настройки
    	 * @param array $old_instance предыдущие настройки
    	 *
    	 * @return array данные которые будут сохранены
    	 */
    	function update( $new_instance, $old_instance ) {
    		$instance = array();
    		$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    		$instance['num'] = ( ! empty( $new_instance['num'] ) ) ? strip_tags( $new_instance['num'] ) : '';
    
    		return $instance;
    	}
    
    }
    

    Ваша функция подсчёта просмотров уже давно стоит на сайте, поэтому я просто решил во фронтенд части виджета добавить это:

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

    Но не выводит ничего, только <ul></ul>.
    Как исправить?

    P.S: как сделать такую же фичу "Уведомлять о новых комментах по email"? Есть туториал у вас?

    Ответить4 мес назад #
  • Немного изменил функцию для того, чтобы можно было получить список постов массивом или объектом WP_Query, может пригодится кому https://gist.github.com/rwsite/4325e811a87813cffb8aac0f25b0dceb smile

    Ответить27 дней назад #
Здравствуйте, !     Войти . Зарегистрироваться