Самые комментируемые и случайные посты в 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.

Александр, спасибо за код. А Вы не знаете, как вывести случайный пост, чтобы показывался не только заголовок, но и краткое описание статьи (до тега more)? С добавлением the_excerpt(); в Ваш код ничего не меняется, к сожалению – просто появляется пустое белое поле.
Константин, с этим нужно будет немного повозиться – во-первых, можно попробовать считывать содержимое таблицы БД, где хранится текст записи по аналогии с $title = $postid->post_title, ну только использовать нужную таблицу, а потом отсекать, например, первых 100 символов. Во-вторых, есть вариант через функцию wordpress query_posts, что-то вроде:
Но тут придется тебе самому более подробно изучить этот вариант) Можешь поиска в гугле – random post wordpress without plugin – есть парочка подсказок.
Подскажите, а чем отличается, нет, в чем преимущество предложенного вами кода, от уже имеющегося, а именно: плагины или виджеты?
Я на самом деле не разбираюсь в технических вопросах. Я просто пишу рассказы :)
Ура, наконец-то получилось, перелопатила весь инет! :) Спасибо!
Спасибо. Именно такой код и искал.
Спасибо за пост. сейчас будем разбираться.. но когда первый вариант пишу, то какую-то ошибку выдает( хз что за ошибка
Не лишним будет упомянуть, что “Случайный посты в блоге” – это очень грузовой запрос к БД, если постов на блоге много и посещаемость тоже большая, то нагрузка на сервер станет критически высокой.
Ваш код для случайных записей в некоторых темах закрывает комментирование.
Kama, я так понимаю из-за обращения к базе, в этом посте все “коды” достаточно “грузящие базу”, но как тогда работают плагины – они ведь используют те же запросы?
Ну да, палагины те же запросы используют.
Я имел ввиду этот момент ORDER BY RAND() – в данном примере, при тысячах постов, запрос будет стремится к убийственному :)
А как вывести случайные посты из конкретной рубрики?
Kama, хм… выбирать рандомно из тысяч записей, действительно, накладно:) а после фразы установлен Лимит=5 – разве он не будет выбирать 5 записей, а потом останавливаться? или он сначала все выбирает, а потом отсекает 5 первых?
Оксана, добавить в $wpdb->get_results SQL запрос еще условие для рубрики.
>>> или он сначала все выбирает, а потом отсекает 5 первых?
Ага, так и делается. Сначала собирается вся таблица, с установленными условиями, потом если есть сортировка таблица сортируется (в данном случае перемешивается, для компа перемешать это жесть, как не крути он это делает по какому-то алгоритму) и потом, тупо отсекается лимит.
Собственно, как можно сначала отсечь, а потом перемешать? Это уже рандом из лимита получится :)
<>
Этот вариант хорош, но при его использовании на моём wordpress-блоге происходит очень неприятный глюк: при добавлении комментария (а также при всяких изменениях файлов в Редакторе) юзера (или админа) перекидывает на пустую страницу. Фишка в том, что и комментарий добавляется, и изменения в файлах сохраняются. Минус в том, что комментаторы впадают в панику, не увидев своего камента, а увидев девственно чистую страницу :(
Пришлось отказаться, к сожалению.
А первый код из твоей серии, он вообще не пашет на моём блоге, увы.
Фу.. а где же то, что я поместила между скобками ?.. o.O
Там, Тод, была типа цитата, отвечая я на раздел “Самые комментируемые посты”: “Для ищущих гибкость настройки советую обратить внимание на следующий код. Он состоит из двух частей – находите в списке файлов шаблона «функции темы» functions.php и в нем добавляете следующие строки”.
Allpa, все могло измениться, увы, и код мог потерять актуальность. Поэтому тут 2 варианта – поискать простенький плагин для этого, посмотреть англоязычные блоги на предмет данной темы.