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

Monday, 30 Nov 09 в 17:46

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

Понравился пост? Подпишись на обновления блога по RSS для блоггеров и вебмастеровRSS, RSS для блоггеров и вебмастеровEmail или twitter для блоггеров и вебмастеровtwitter!
Добавить комментарий

Комментариев - 16 для данного поста

  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. Бедный Студент Пишет:

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

  7. @ Kama Пишет:

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

  8. Артем Бочаров Пишет:

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

  9. Tod Пишет:

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

  10. @ Kama Пишет:

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

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

  11. Оксана Пишет:

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

  12. Tod Пишет:

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

  13. @ Kama Пишет:

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

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

  14. @ Allpa Пишет:

    <>

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

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

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

  15. @ Allpa Пишет:

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

  16. Tod Пишет:

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

Оставить комментарий (правила комментирования)