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
 */
function kama_get_most_viewed( $args = '' ){
	global $wpdb, $post;

	parse_str( $args, $i );

	$num    = isset( $i['num'] )    ?: 10;
	$key    = isset( $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'] );

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

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

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

    Ответить1.5 года назад #
    • 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
      Ответить4 дня назад #
  • Юрий

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

    Ответить1.5 года назад #
    • campusboy3315 cайт: www.youtube.com/c/wpplus

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

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

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

    Ответить11 мес назад #
    • Kama7453

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

      $Title = $pst->post_title;

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

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

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

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

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

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

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

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

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

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

    Ответить3 мес назад #
    • Kama7453

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

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

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

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

        Ответить3 мес назад #
  • @ otshelnik cайт: anturiumi.ru

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

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

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

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

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

          Ответить2 мес назад #
          • @ otshelnik cайт: anturiumi.ru

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

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

            Ответить2 мес назад #
            • @ otshelnik cайт: anturiumi.ru

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

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

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

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

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

                    Ответить2 мес назад #
                    • @ otshelnik cайт: anturiumi.ru

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

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

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

                    • @ otshelnik cайт: 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 cайт: anturiumi.ru

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

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

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

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

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