Онлайн заработок, создание и монетизация сайтов, веб-разработка, SEO и SMO продвижение, фриланс, партнерки, полезные сервисы вебмастерам, блоггинг.

Wordpress шаблоны
Главная » WordPress » Самые комментируемые и случайные посты в Wordpress блоге

Самые комментируемые и случайные посты в WordPress блоге

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

Самые комментируемые посты

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

<?php $result = $wpdb->get_results("SELECT comment_count,ID,post_title FROM $wpdb->posts ORDER BY comment_count DESC LIMIT 0 , 10");
foreach ($result as $topten) {
$postid = $topten->ID;
$title = $topten->post_title;
$commentcount = $topten->comment_count;
if ($commentcount != 0) { ?>
<li><a href="<?php echo get_permalink($postid); ?>" title="<?php echo $title ?>"><?php echo $title ?></a></li>
<?php } } ?>

Максимум, что можно здесь подправить – количество постов, для этого обратите внимание на строку с текстом  LIMIT 0 , 10 и, собственно, последнюю цифру. Список выводится с помощью тега LI – тут все вроде как стандартно.

Если вам достаточно простого списка самых комментируемых постов, то первый вариант – то, что нужно. Для ищущих гибкость настройки советую обратить внимание на следующий код. Он состоит из двух частей – находите в списке файлов шаблона «функции темы» functions.php и в нем добавляете следующие строки:

<?php function most_popular_posts($no_posts = 5, $before = '<li>', $after = '</li>', $show_pass_post = false, $duration='') {
global $wpdb;
$request = "SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS 'comment_count' FROM $wpdb->posts, $wpdb->comments";
$request .= " WHERE comment_approved = '1' AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status = 'publish'";
if(!$show_pass_post) $request .= " AND post_password =''";
if($duration !="") { $request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";
}
$request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";
$posts = $wpdb->get_results($request);
$output = '';
if ($posts) {
foreach ($posts as $post) {
$post_title = stripslashes($post->post_title);
$comment_count = $post->comment_count;
$permalink = get_permalink($post->ID);
$output .= $before . '<a href="' . $permalink . '" title="' . $post_title.'">' . $post_title . '</a> (' . $comment_count.')' . $after;
}
} else {
$output .= $before . "None found" . $after;
}
echo $output;
} ?>

Если functions.php у вас нет, то можно добавить этот код в самый конец файла header.php. Как мы видим в описании функции most_popular_posts есть 5 переменных – no_posts задает количество выводимых постов, before и after определяет окружающие теги для каждой записи (не удивительно, что там задан тег LI), а также show_pass_post, отвечающая, как я понял, за отображение запароленых потов и duration, где вы можете задать количество дней за которые хотите отбирать эти самые комментируемые посты (например, за последний месяц – 31 или любое другое значение).

Чтобы отобразить список самых комментируемый статей вашего блога нужно добавить в требуемое место шаблона вызов функции:

<?php most_popular_posts(); ?>

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

Случайный (рандомные) посты в блоге

В принципе, для перелинковки в блогах (да и просто сайтах на wordpress) хороши любые методы. Я как-то рассматривал плагин Simple Tags и вывод связных постов по теме для конкретной статьи. Кроме этого можно также выводить и случайные посты для пользователей чтобы они смогли почитать еще некоторые материалы вашего блога. Выборка при этом производится случайным образом (рандомно):

<div id="random">
 <?php $randompost = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY RAND() LIMIT 5"); 
 if ($randompost) {
 foreach ($randompost as $post) { 	
  $ID = $post->ID;
  $postid = get_post($post->ID); 
  $title = $postid->post_title; ?>
 <li><a href="<?php echo get_permalink($postid); ?>" title="<?php echo $title ?>"><?php echo $title ?></a></li>
 <?php } } ?>
<div class="more"><a href="javascript:location.reload()" target="_self">(показать другие)</a></div>
</div>

За код просьба сильно не ругать, в интернете более-менее адекватного примера я не нашел, пришлось сочинять самому:) В общем, вкратце что сказать по коду — здесь цифра в запросе LIMIT 5 означает количество постов, ее соответственно можно менять. В конце есть блок с ссылкой показать другие, которая перегружает страницы и в блоке рандомных постов пользователь увидит новые случайные ссылки на статьи. В принципе, это не обязательная часть кода, поэтому, если вам не нужна, ее можно убрать.

Вообще, как я уже говорил в прошлой статье по функциям wordpress – для решения тех или иных задач есть разные варианты. Так, например, случайные посты можно выводить с помощью плагина или функции query_posts – тут уж как кому больше нравится. Если внимательно изучить код и структуру (характер) запросов $wpdb->get_results, то можно выводить практически любую информацию из базы данных:)

P.S. Постовой. Купите своей девушке духи от ведущих европейских брендов.
Элитная парфюмерия и духи в Киеве.
Sea container shipment and shipping agency — uni-orient shipping agency ltd.

30.11.09

Категории: WordPress, Блоггинг.

Теги: , , , , ,

52 Comments
  1. Константин

    Александр, спасибо за код. А Вы не знаете, как вывести случайный пост, чтобы показывался не только заголовок, но и краткое описание статьи (до тега more)? С добавлением the_excerpt(); в Ваш код ничего не меняется, к сожалению — просто появляется пустое белое поле.

  2. Tod

    Константин, с этим нужно будет немного повозиться — во-первых, можно попробовать считывать содержимое таблицы БД, где хранится текст записи по аналогии с $title = $postid->post_title, ну только использовать нужную таблицу, а потом отсекать, например, первых 100 символов. Во-вторых, есть вариант через функцию wordpress query_posts, что-то вроде:

    < ?php query_posts(array('orderby' => 'rand', 'category_name' => SomeCategoryName, 'showposts' => 1)); if (have_posts()) : while (have_posts()) : the_post(); ?>

    Но тут придется тебе самому более подробно изучить этот вариант) Можешь поиска в гугле — random post wordpress without plugin — есть парочка подсказок.

  3. Guard

    Подскажите, а чем отличается, нет, в чем преимущество предложенного вами кода, от уже имеющегося, а именно: плагины или виджеты?
    Я на самом деле не разбираюсь в технических вопросах. Я просто пишу рассказы :)

  4. Iren

    Ура, наконец-то получилось, перелопатила весь инет! :) Спасибо!

  5. Бедный Студент

    Спасибо за пост. сейчас будем разбираться.. но когда первый вариант пишу, то какую-то ошибку выдает( хз что за ошибка

  6. Kama

    Не лишним будет упомянуть, что «Случайный посты в блоге» — это очень грузовой запрос к БД, если постов на блоге много и посещаемость тоже большая, то нагрузка на сервер станет критически высокой.

  7. Артем Бочаров

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

  8. Tod

    Kama, я так понимаю из-за обращения к базе, в этом посте все «коды» достаточно «грузящие базу», но как тогда работают плагины — они ведь используют те же запросы?

  9. Kama

    Ну да, палагины те же запросы используют.

    Я имел ввиду этот момент ORDER BY RAND() — в данном примере, при тысячах постов, запрос будет стремится к убийственному :)

  10. Оксана

    А как вывести случайные посты из конкретной рубрики?

  11. Tod

    Kama, хм… выбирать рандомно из тысяч записей, действительно, накладно:) а после фразы установлен Лимит=5 — разве он не будет выбирать 5 записей, а потом останавливаться? или он сначала все выбирает, а потом отсекает 5 первых?
    Оксана, добавить в $wpdb->get_results SQL запрос еще условие для рубрики.

  12. Kama

    >>> или он сначала все выбирает, а потом отсекает 5 первых?
    Ага, так и делается. Сначала собирается вся таблица, с установленными условиями, потом если есть сортировка таблица сортируется (в данном случае перемешивается, для компа перемешать это жесть, как не крути он это делает по какому-то алгоритму) и потом, тупо отсекается лимит.

    Собственно, как можно сначала отсечь, а потом перемешать? Это уже рандом из лимита получится :)

  13. Allpa

    <>

    Этот вариант хорош, но при его использовании на моём wordpress-блоге происходит очень неприятный глюк: при добавлении комментария (а также при всяких изменениях файлов в Редакторе) юзера (или админа) перекидывает на пустую страницу. Фишка в том, что и комментарий добавляется, и изменения в файлах сохраняются. Минус в том, что комментаторы впадают в панику, не увидев своего камента, а увидев девственно чистую страницу :(

    Пришлось отказаться, к сожалению.

    А первый код из твоей серии, он вообще не пашет на моём блоге, увы.

  14. Allpa

    Фу.. а где же то, что я поместила между скобками ?.. o.O
    Там, Тод, была типа цитата, отвечая я на раздел «Самые комментируемые посты»: «Для ищущих гибкость настройки советую обратить внимание на следующий код. Он состоит из двух частей – находите в списке файлов шаблона «функции темы» functions.php и в нем добавляете следующие строки».

  15. Tod

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

  16. МиниКин

    Здравствуйте, Александр.
    Этот код мне не особенно подходит. Есть другая задачка, все никак не могу найти решение. Код немножко читаю, но написать сам — увы :(

    Нужно вывести списком заголовки записей ОПРЕДЕЛЕННОГО пользователя в следующем виде:

    ПЕРВАЯ Категория (название категории есть ссылка на категорию)
    Первая Запись (заголовок записи есть ссылка на запись)
    Вторая Запись (заголовок записи есть ссылка на запись)
    ВТОРАЯ Категория (название категории есть ссылка на категорию)
    Первая Запись (заголовок записи есть ссылка на запись)
    Вторая Запись (заголовок записи есть ссылка на запись)
    Третья Запись (заголовок записи есть ссылка на запись)

    разумеется, должны отображаться только те категории, записи в которых есть у этого пользователя…
    вот такая простая задачка :(
    Перекопал все что можно, попытался в кодексе найти и собрать решение… Ни фига. Может сможете помочь?

  17. Tod

    МиниКин, тут проще обратиться на какой-то форум по wordpress, я так сходу даже не подскажу что и как сделать.

  18. МиниКин

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

  19. Ex_Animal

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

  20. Tod

    Ex_Animal, можно вывести все, что угодно) В посте внимательно посмотри второй пример кода, там есть переменная duration, которая отвечает за вывод по времени.

  21. Ex_Animal

    Туда число дней вписать нужно или как ? )

  22. Tod

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

  23. fet

    а реально ли прицепить к выводу первую картинку из поста?
    Спасибо.

  24. Kama

    fet, вот этот плагин можете заюзать: http://wp-kama.ru/id_142/kama-thumbnail.html

    Ставите плагин и где нужно выводить картинку пишете такой код:

    Работать будет все на автомате: картинка будет парситься из контента, создаваться её уменьшенная копия по указанным размерам (w=150&h=100)

  25. Илья

    помогите совместить плиз
    (Случайный (рандомные) посты в блоге последний код с моим)

    вот мой
    Интересное

    <a href="» rel=»bookmark» title=»Постоянная ссылка: «>

    <a href="»>Читать полностью…

    чтобы просто картинки рандомело ато рандом есть тока писанина еше сверху и картинки повторяются ну это ладно)

  26. Илья

    а как код добавить чет я не вехал)

  27. Tod

    Илья, что-то я не совсем понял вопрос) Для начала наверное действительно лучше разобраться как добавить приведенный в посте код, а потом уже решать более сложные задачи.

  28. ATT.Yoshio

    Добрый день. А подскажите. Мне нужно, что бы при просмотре полной записи, в сайдбаре выводились анонсы всех записей категории к которой относится пост.
    Допустим при просмотре новости из рубрики «Манга» , в сайдбаре выводится список всех новостей этой категории.
    Заранее благодарен.

  29. Tod

    ATT.Yoshio, готовый код, увы, не подскажу, нужно будет самому додумать, но принцип такой, что мы используем условие in_category() и для определенных категорий указываем соответствующий код.

  30. ATT.Yoshio

    хм. спасибо, попробую порыть в этом направлении.
    Спасибо за внимание )

  31. Вадим

    Для вывода случайных постов можно было код попроще написать:

    Случайные записи

    <a href="» title=»»>

  32. Tod

    Вадим, что-то текст не отобразился, редактор заменяет код, нужно вводить по типу &lt;a href=&quot;&quot; title=&quot;&quot;&gt;

  33. Вадим

    Ясно. Смысл был в том, что можно код гораздо меньшего объема написать для вывода случайных постов+здесь в этом варианте нельзя, например, вывести количество комментарив к постам, так как нет вывода основного цикла, а это еще пара лишних строчек кода, хотя и этот вариант неплох, но не очень гибок для различных вариаций.

  34. Ирина

    А как вывести список случайных постов в сайдбар?

  35. Tod

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

  36. Вадим

    Ирина, о том, как разместить случайные записи, можно прочитать здесь: http://wordpressadmin.ru/tips/random-with-query-posts/

  37. Ирина

    Вадим, Tod спасибо!

  38. Десятин

    Спасибо, но сложновато. А плагина наподобие нету?

  39. Tod

    Десятин, плагины есть, я бы как раз их и поискал для работы, если сложно. Точные называния не подскажу, разве что плагин WP-PostViews с которым сам сталкивался. Но при больших нагрузках и посещаемости он мешает кэшированию, что не есть хорошо.

  40. karpovi4

    Плагин бы!

  41. Tod

    karpovi4, подобные плагины и даже виджеты существуют — нужно погуглить)

  42. Евгений

    Очень интересует, что нужно добавить в код, чтобы исключить вывод целых категорий? Спасибо.

  43. Tod

    Евгений, в SQL запрос get_results нужно добавить условие WHERE по типу «выбирать пост, если категория НЕ равна такому-то значению». К сожалению, могу подсказать только логику, запрос вам нужно будет самому сформировать. Или погуглить.

  44. alex

    Подскажите, пожалуйста, как реализовать это:
    «Оксана, добавить в $wpdb->get_results SQL запрос еще условие для рубрики.»

    Надо вывести в singe.php рэндомные посты из категории под айди=5

  45. Tod

    alex, по идее как-то так:

     <?php $randompost = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' AND category_id = '5' ORDER BY RAND() LIMIT 5");

    Я добавил еще одно условие: AND category_id = ‘5’

  46. Diana

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

  47. Диана

    В последнем примере не закрыт тег
    Добавьте . После установки вашего кода, сразу «поплыл дизайн».

  48. Tod

    Диана, какой именно тег там не закрыт? Вроде бы все нормально, плюс сам его использовал на одном-двух сайтах. По поводу схожих постов рекомендую Yet Another Related Posts Plugin, он получше будет.

Добавить комментарий

Ваш e-mail не публикуется. Обязательные поля помечены *
Если вы комментируете впервые, то текст будет отправлен на модерацию.