Артём Мáлков

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

31 июл13 комм

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

Под популярностью может подразумеваться как активность ваших посетителей (комментирование той или иной записи), так и простые просмотры. О том, как вывести такие записи, сегодня и пойдет речь.

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

Для вывода популярных записей мы будем использовать функцию «query_posts». В качестве простого примера выводить мы будем заголовок и ссылку на запись. Реализация:

<ul>

	<?php
		
		$time = "&monthnum=".date("m"); // За месяц
		$sort = "DESC"; // Порядок сортировки
		$numb = "5"; // Количество записей для вывода
		
		query_posts("post_type=post&posts_per_page=".$numb."&orderby=comment_count&order=".$sort."&year=".date("Y").$time);
      
		while (have_posts()): the_post();
		
	?>
      
		<li>
			<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
		</li>

	<?php
		
		endwhile;
		wp_reset_query();
	
	?>

</ul>

Код вставляете в нужное место вашей темы. Что нас здесь интересует?

$numb – количество выводимых записей.

$sort – порядок сортировки, в нашем случае – от большего к меньшему. Если нужно наоборот, замените значение на «ASC».

$time – за какой период вывести данные, в нашем случае – за последний месяц. Если вам нужно осуществить вывод за неделю, то эту строчку замените на:

$time = "&w=".date("W"); // За неделю

А если за год, то замените на:

$time = ""; // За год

Здесь также доступен период день:

$time = "&monthnum=".date("m")."&day=".date("j"); // За день

И час:

$time = "&monthnum=".date("m")."&day=".date("j")."&hour=".date("H"); // За час

Меньшие периоды, думаю, рассматривать нет смысла. По комментариям, собственно, и все.

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

Что касается просмотров, для начала вам необходимо установить хак из этой статьи. А вот дальше все делается по аналогии:

<ul>

	<?php
		
		$time = "&monthnum=".date("m"); // За месяц
		$numb = "5"; // Количество записей для вывода
		
		query_posts("post_type=post&posts_per_page=".$numb."&meta_key=post_views_count&orderby=meta_value_num&year=".date("Y").$time);
      
		while (have_posts()): the_post();
		
	?>
      
		<li>
			<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
		</li>

	<?php
		
		endwhile;
		wp_reset_query();
	
	?>

</ul>

Настройки все те же самые, что и при выводе популярных записей по комментариям, единственное, что меняется – это убирается порядок сортировки.

Рекомендуем к просмотру
Как скопировать записи/страницы в WordPress?
Статьи и советы
Добавляем количество просмотров записи в WordPress
Хаки
Вывод записей из нужных рубрик в WordPress
Статьи и советы
13
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 0
    1066
      •  Команда Pandoge
    19 сен в 22:24

    Aleks Kac, если убрать временные рамки, то все старые материалы (по понятным причинам) будут иметь большее количество просмотров.

    • 0
    2
      •  Пользователь
    19 сен в 20:17

    Артем, почему вопрос сложный в реализации? Когда можно просто кусок кода убрать и будут все записи, а не только опубликованные за определенный период. Или я что-то не так понял?

    <ul>
    
    	<?php
    		
    		$numb = "5"; // Количество записей для вывода
    		
    		query_posts("post_type=post&posts_per_page=".$numb."&meta_key=post_views_count&orderby=meta_value_num");
          
    		while (have_posts()): the_post();
    		
    	?>
          
    		<li>
    			<a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a>
    		</li>
    
    	<?php
    		
    		endwhile;
    		wp_reset_query();
    	
    	?>
    
    </ul>
    • 1
    7
      •  Проверенный
    6 авг в 20:23

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

    • 0
    1066
      •  Команда Pandoge
    6 авг в 19:32

    Михаил, вопрос интересный но немного сложный в реализации, т.к много каких подсчетов нужно делать. Подумаю на досуге об этом.

    • 1
    7
      •  Проверенный
    6 авг в 18:06

    И еще, если позволите :) Например, опубликован вчера новый текст, а он никому не интересен. Но в выводе будет только он один за день. А в тот же день люди массово читали другой текст, опубликованный месяц назад. А в выводе его не будет. Смысла в таком рейтинге вообще нет.

    • 0
    7
      •  Проверенный
    6 авг в 17:58

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

    • 0
    7
      •  Проверенный
    6 авг в 17:56

    В общем, актуальный вопрос один на самом деле. Как вывести в рейтинге посты, опубликованные когда угодно, но просмотренные посетителями сайта за определенный период? Ведь какой смысл узнать популярность постов среди опубликованных за эту неделю, если, например, в то же время, посты, опубликованные месяц назад пользуются большей популярностью. Как реализовать такую схему?

    • 1
    1066
      •  Команда Pandoge
    6 авг в 17:22

    Михаил, по первому: дело не в корректности метода отбора материалов. И тот и тот вариант правильный, вопрос в том, какой метод отбора нужен Вам.

    date() - обычное использование этой функции возвращает вам текущую дату в секундах.

    По второму: date("W") выводит не номер недели месяца, а номер недели года и если Вы сейчас выведите это на экран, то получите значение 32 (если не ошибаюсь). Так что тут все верно.

    • 0
    7
      •  Проверенный
    6 авг в 17:11

    Мне кажется, корректней делать отбор среди всех записей, прочитанных за этот период времени, а не только среди опубликованных за этот период. А если новых записей не будет, то и вывод будет нулевым. Но при этом посетители же читают тексты. Пробовал удалить символы между скобками, то есть - date(). Вывод записей есть, правда, не знаю, насколько это корректно.

    По поводу недели:

    у вас сейчас так: $time = "&w=".date("W"); // За неделю

    а вроде должно быть так: $time = "&monthnum=".date("m")."&w=".date("W"); // За неделю

    • 0
    1066
      •  Команда Pandoge
    6 авг в 16:59

    Михаил, Все верно. Берутся записи за указанный период и от них отбираются нужные по количеству просмотров/комментариев.

    > И также, алгоритм вывода за неделю $time = "&w=".date("W"); // За неделю

    отличается от других почему-то.

    То есть?

    • 0
    7
      •  Проверенный
    6 авг в 16:45

    Спасибо за ответ!

    В этом варианте выводятся только тексты, опубликованные за этот период, а не все, которые посещались за этот период.

    И также, алгоритм вывода за неделю $time = "&w=".date("W"); // За неделю

    отличается от других почему-то.

    • 0
    1066
      •  Команда Pandoge
    6 авг в 14:40

    Михаил, Здравствуйте!

    Спасибо за Ваш вопрос. Во времени "день" и "час" и в правду была ошибка - исправил. Остальные временные метки работают без проблем. Проверил на WP 5.2.2.

    • 0
    7
      •  Проверенный
    6 авг в 11:34

    Добрый день!

    Артем, можете пояснить работу настроек временных интервалов

    $time = ""; // За год

    $time = "&monthnum=".date("m"); // За месяц

    $time = "&w=".date("W"); // За неделю

    $time = "&day=".date("j"); // За день

    $time = "&hour=".date("H"); // За час

    У меня на сайте выдача настолько произвольная, что никак не соотносится с задаваемыми интервалами. Причем, если удалить символы в скобках, то результат больше похож на верный по диапазону дат. В общем, сортировка по времени работает некорректно.

Подняться наверх
«Pandoge» - помощник вебмастера