Вывод случайных записей с помощью функции query_posts

Вывод случайных записей с помощью функции query_posts

3.6/5 - (10 голосов)

Вывод случайных записей на сайте является очень полезным ходом, так как это позволяет не только создать внутреннюю перелинковку, что хорошо с точки зрения оптимизация для выдачи в поисковых системах, но и помогает показать пользователям записи, которые были опубликовано достаточно давно и возможно уже оказались незаслуженно забытыми. А именно как раз эти записи могут оказаться очень полезными для некоторых, поэтому периодически поднимать их из архива очень необходимо. Поскольку нам нужно вывести именно случайные записи в нужном месте, то как никак лучше подойдет такая функция WordPress, как query_posts. Она позволяет выводить записи согласно заданным критериям, например только из определенной категории или вообще только определенные записи. Теперь расскажу немножко подробнее об этой функции и приведу несколько примеров, чтобы вы имели о ней представление. Для вывода записей в WordPress используют цикл, так называемый “The Loop”. Обычно он выглядит вот так:

<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_posts(); ?>
//Ваш код
<?php endwile; ?>

Если перед этим циклом поставить функцию query_post с нужными нам параметрами, то можно добиться нужного нам результата. Приведу первый пример:

<?php query_posts('cat=-1,-2,-3'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_posts(); ?>
//Ваш код
<?php endwile; ?>

Такой код выведет записи из всех категорий, кроме категорий с ID 1, 2 и 3.

Теперь, когда вам понятно что делает эта функция и принцип задания параметров, приведу остальные виды параметров для query_posts:

  • query_posts(‘cat=-3′) – Не показывать категорию с id=3;
  • query_posts(‘cat=-1,-2,-3′) – Не показывать категории с id, равным 1, 2 и 3;
  • query_posts(‘cat=1,5,9′) – Вывести категории с id, равным 1, 5 и 9;
  • query_posts(‘category_name=Статьи’) – Вывести категорию с названием “Статьи”;
  • query_posts(‘name=Возможности WordPress’) – Вывести запись с названием “Возможности WordPress”;
  • query_posts(‘p=12′) – Вывести одну запись, id которой равно 12;
  • query_posts(‘pageid=8′) – Вывести одну страницу, id которой равно 8;
  • query_posts(‘pagename=Об авторе’) – Вывести страницу, название которой “Об авторе”;
  • query_posts(‘cat=3&showposts=5′) – Вывести 5 записей из категории, id которой равно 3;
  • query_posts(‘cat=3&orderby=date&order=ASC’) – Вывести записи из категории, id которой равен 3 по дате в хронологическом порядке, т.е выше будут распологаться записи, которые были созданы последними. Если вам надо вывести записи в обратном порядке, то нужно применить параметр DESC;
  • query_posts(‘posts_per_page=10′) – Вывести на страницу 10 записей. Если задать значение ‘-1′, то будут выводиться все записи;
  • query_posts(‘cat=3&year=2010′) – Вывести записи из категории, id которой равен 3, за 2010 год;
  • query_posts(‘orderby=rand&showposts=5&cat=3′) – Вывести случайно 5 записей из категории, id которой равен 3;
  • query_posts(‘orderby=rand&showposts=5′) — Вывести случайно 5 записей из всех категорий;
  • query_posts(‘meta_key=cars&meta_value=volvo’) – Вывести список записей с произвольным полем “cars” и значением этого поля “volvo”.

Ну что же, мы познакомились с примерами вывода записей согласно заданным параметрам, и теперь можно вывести случайно нужное нам количество записей из всех категорий:

<?php query_posts('orderby=rand&showposts=10'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
   <ul>
     <li><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
   </ul>
<?php endwhile; endif; ?>

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

Можете даже немного модифицировать этот код и добавить еще вывод в скобках количество комментариев к этой записи:

<?php query_posts('orderby=rand&showposts=10'); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
   <ul>
     <li><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <?php comments_number('(0)','(1)','(%)'); ?></li>
   </ul>
<?php endwhile; endif; ?>

Кстати, лично я предпочитаю не забивать кодом основные файлы шаблона, а выношу его в виде функции в файл functions.php, присваиваю ей имя, а затем в нужном мне месте прописываю только имя этой функции всего лишь одной строчкой. Приведу пример в нашем случае:

<?php
function randomPosts() {
query_posts('orderby=rand&showposts=10');
if (have_posts()) : while (have_posts()) : the_post(); ?>
   <ul>
     <li><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
   </ul>
<?php endwhile; endif;
}
?>

Всю нашу конструкцию мы вложили в функцию с именем randomPosts(), а это значит, что теперь нам достаточно всего лишь вывести имя этой функции в том месте, где это необходимо, т.е достаточно всего лишь написать:

<?php randomPosts(); ?>

Как видите, все получается чистенько и аккуратно, можете даже написать комментарий в этом месте, пояснив, вывод какой именно функции здесь осуществляется.

Вывод случайных записей с помощью функции query_posts: 63 комментария

  1. Спасибо! 😛
    Ваши примеры использования функции мне очень помогли)
    2 дня уже у вас тут тусуюсь) Сделала у себя на сайте анонсы) Правда код (предпоследний) у меня почему-то не заработал. Но у меня получился немного другой вариант.
    Жду интересных постов, добавила в закладки блог 🙄

    1. Vadimon, предпоследний. Но у меня очень старая тема, в которой очень много странностей, циклы, например, очень специфические. Плюс я постоянно в ней ковыряюсь весьма по ламерски и появляются дополнительные баги.

      Но ваше описание параметров мне очень помогло, спасибо еще раз.

  2. Здравствуйте!
    Помогите пожалуйста чайнику! Хочу сделать на главной странице (сразу под шапкой) случайный вывод трех анекдотов из рубрики «анекдоты», а ниже вывод случайной картинки из рубрики «картинки». Возможно ли такое осуществить, если да, то что и куда надо вставить или изменить?
    Заранее большущее спасибо!

    1. Алексей, вывести три анекдота из рубрики “Анекдоты” вам поможет код query_posts(‘cat=3&showposts=3′), где cat=3 номер id вашей рубрики “Анекдоты”, а случайные картинки можно вывести с помощью плагина, которых на офсайте вордпресс есть несколько. Можете выбрать, какой вам удобнее.

  3. Алексей, присылайте файл мне на почту с пометкой “Вывод случайных записей”

  4. Спасибо за статью… но у меня возник вопрос можно ли организовать вывод статей на главной так чтобы к примеру имея навигацию главной типа страница 1 ,2,3 статьи на них не повторялись? то есть чтоб то что вывелось на главной после переключения на другую статьи не повторились?
    такое возможно?
    заранее спасибо.

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

  5. Vadimon спасибо за интерес к моему комменту!
    все просто:
    все статьи у меня отображаются на главной в хронологическом порядке,
    установив на своем блоге плагин page-navi с параметром показов 5 на главной,и поставив данную функцию ,получилось так что при перещелкивание страниц периодически показываются те посты которые были на прошлых страницах(
    может необходимо сделать какую то связку с page navi?
    да и страницы фактически не переключаются,то есть отображается всегда первая!
    не подскажите что я сделал может не так?
    P.s пока данную функцию отключил…

  6. jmaster, возможно, у вас некорректно работает плагин page-navi. Попробуйте проверить его в WordPress-теме по-умолчанию Twenty Ten.

    1. Book, могу порекомендовать вам, как вариант, сделать два цикла. В первом с помощью query_posts будут выводиться нужные вам записи, а во втором обычном все остальные

  7. Подскажите пожалуйста, я вывела на страницу рубрику но они все целиком, без тега more. Это можно как то исправить?

  8. Спасибо за полезную информацию. Сам сейчас настраиваю свой блог, есть вывод видео от Youtube, так хочу еще сделать вывод случайных анекдотов.

  9. А подскажите пожалуйста, как исправить: когда я вставляю код query_posts(‘cat=10&showposts=1′); для вывода одной последний записи на главной странице из рубрики id которой 10, то у меня переходя в категории(архивы) выводится тоже эта рубрика и одна статья из нее, вообщем все остальные рубрики и архивы ведут себя по этой же схеме. Как это исправить? Что бы к меня эта функция работала только на главной странице а не во всех остальных рубриках?
    Заранее благодарю!

  10. пробовал сокращенный вариант – ругается на `<` в самом начале кода, перед php. Подскажите, пожалуйста, что не так делаю?

    1. Чтобы Вам не соврать, уже не помню 🙁 Не хватило терпения дождаться ответа и нашёл другой способ, как это реализовать :-[ А ту ошибку не зафиксировал. Делал всё по инструкции – основной блок вставлял в functions.php, второй кусочек в footer.php.

      1. Вячеслав тут не нужно быть geek’ом чтобы понять что вы в functions.php вставив код, надеюсь в конец страницы, совершили синтаксическую ошибку

        a title="" href="" rel="nofollow"

        поскольку файл functions.php уже в самом начале имел

        a title="" href="" rel="nofollow"

        В данной статье все коды указаны если при редактировании темы для WordPress файл functions.php не будет существовать или в нем будет отсутствовать какой либо код….

  11. Спасибо! Мучился долго с различными вставками в сайдбаре, а ваш код в functions – это идеальное решение, которое сразу сработало.

  12. Подскажи пожалуйста, когда использую “orderby=rand” упорно выводятся последние посты вместо случайных. Уже весь мозг сломал, куда копать?

    1. В шаблоне вот такой код:

      <?php $custom_query = new WP_Query("showposts=5&ignore_sticky_posts=1&orderby=rand");
      if ($custom_query->have_posts()) : while ($custom_query->have_posts()) : $custom_query->the_post(); ?>
      <?php include(TEMPLATEPATH . '/includes/fromblog_post.php'); ?>
      <?php endwhile; endif; wp_reset_postdata(); ?>
      <?php $post = $custom_query; ?>

      но он выводит последние посты
      нашел рабочий:

      <?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 } } ?>

      Подскажи пожалуйста как мне теперь объединить рабочий код со строкой


      <?php include(TEMPLATEPATH . '/includes/fromblog_post.php'); ?>

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

  13. Трейлер, именно за вывод ссылки на рандомную запись у вас отвечает строка:
    <li><a href="<?php echo get_permalink($postid); ?>" title="<?php echo $title ?>"><?php echo $title ?></a></li>
    поэтому подключить файл можно либо до этой строки, либо непосредственно после нее, в зависимости от того где именно вы хотите выводить этот файл.

  14. Спасибо за подсказку, выкладываю итоговый код который у меня заработал, может кому-нить поможет:

    <?php $randompost = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY RAND() LIMIT $randomNumber");
    if ($randompost) {
    foreach ($randompost as $post) {
    $postid = $post->ID;
    $custom_query = new WP_Query("p=$postid");
    if ($custom_query->have_posts()) : while ($custom_query->have_posts()) : $custom_query->the_post(); ?>
    <?php include(TEMPLATEPATH . '/includes/fromblog_post.php'); ?>
    <?php endwhile; endif; wp_reset_postdata(); ?>
    <?php } } ?>

  15. А как вывести посты ID которых находятся в переменной $posts в виде: “44, 52, 62, 72, 81″
    Запрос :
    query_posts(‘”p=’.$posts.’”‘); global $more; $more = 0;

    Выводит только один пост и тот в развернутом виде (игнорируя MORE).

  16. справка для водительского удостоверения 2018 купить

    Изготовление удостоверений. Удостоверения на заказ. Изготовление удостоверений и пропусков на собственном оборудовании от 1 шт. Корочки удостоверений – из любых материалов, в том числе и
    купить удостоверение электрика
    Заказать удостоверение частного охранника в Москве с доставкой. Получение удостоверения частного охранника нового образца быстро? и недорого?
    купить корочку удостоверение
    Удостоверение сварщика в Москве. Уточняйте актуальные цены и наличие у поставщика. Магазин Охраны труда Доставка в Оренбург http://ohranatruda21.ru. от 12 до 45 руб /шт. Полиграфический салон Графика Доставка в Оренбург vrnprint.ru. Магазин Охраны труда Доставка в Оренбург http://ohranatruda21.ru. Сравнить прайс-листы и Купить удостоверение сварщика в Москве по лучшей цене. 4 товара и услуги от 1 продавца в Москве на Propartner.ru. Зарегистрироваться очень просто, это займет всего 15 секунд.
    пенсионное удостоверение купить

  17. А как мне сделать запрос, который бы отдал мне несколько Страниц а не записей?
    например хочу получить несколько записей по их id

  18. Добрый день! Как задать условие? К примеру, есть 3-ри страницы, я хочу чтобы на 1-ой странице выводились записи с категории “А”, на 2-ой странице с категории “B” и дальше в том же духе.

  19. Добрый день. Спасибо за статью, очень нужная! Подскажите, пожалуйста, а если мне нужно вывести только одну страницу развернуто, как это можно сделать? т.е. к примеру в меню пользователь щелкает ссылку “статьи” и ему открывается одна случайная статья из определенной категории?

  20. После вставления кода исчезает форма для комментария и выводится статья целиком. Между названиями случайно выведенных статей расстояние такое будто это отдельные абзацы. 😉

  21. Первый подробный перечень атрибутов который я нашел, браво)
    Подскажите, как вывести список записей по конкретной Метке?
    Безразлично циклом или функцией, главное чтоб работало)))
    Спасибо!

  22. Для вывода записей по метке, используйте атрибут tag, например:

    <?php query_posts('tag=auto'); ?>
    <?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_posts(); ?>
    <?php endwile; ?>

  23. Вадим, не подскажете, как добавить в Ваш код показ первой картинки из поста?

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

  24. Здравствуйте!
    Вставляю код, который дан Вами для примера и получаю вывод 10 записей, но только заголовки, не вывод краткой новости. Это так и задумано или я где-то ошиблась?

  25. Если вы имеете ввиду последний код, то да, так и должно быть.
    Здесь в цикле выводится список только заголовков статей:

    <ul>
    <li><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
    </ul>

  26. Да, я уже поняла. Смогла поправить как надо, но есть еще вопрос? Случайным образом выводится теперь всё – и на главной, в и категориях. Можно ли поставить ограничения рандомного выбора только на главной, а в категории чтобы статьи шли по дате?
    Спасибо

    1. Да. Можно воспользоваться для этого, например, условным тегом is_home. Пример:
      <?php if(is_home()) {
      randomPosts(); } ?>

  27. Подскажите, а как сделать так чтоб код цеплял кроме названия статьи ещё и фото с этой статьи?

  28. Это уже совсем другая история. Есть разные способы и этому нужно посвящать отдельную статью.

  29. Спасибо за пост, но есть одна проблема, решение которой пока я так и не смог найти.

    Например, у нас есть лента постов, которая разбивается на страницы по 10 записей. При использовании orderby=rand на каждой странице подгружается произвольный набор записей. Из-за этого записи, выводимые на разных страницах, могут дублироваться.

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

  30. Здравствуйте, задача такая:
    У меня на сайте my-mood_ru/comics/ есть раздел комиксы, нужно на отдельной странице выводить комиксы случайным образом, можно миниатюрами, так как на записях названий нету, но лучше всего весь комикс (хоть по одной без разницы)

  31. Добрый день. Подскажите, пожалуйста, как можно вывести в конце поста все статьи из этой категории (естественно, только заголовки). Обычно выводятся только похожие посты, но мне это не подходит. Буду очень признательна за помощь.

  32. У меня что-то ничего не получается на сайте sputres_ru, ставлю код в index.php, что бы не отображал новости, все равно отображает, пока просто статичный текст на главную бросил

  33. Здравствуйте, за блогом еще следят? Дело в том, что возникла проблема, когда я попытался использовать вывод случайных записей в свою шапку…
    Смысл этой функции заключается в том, чтобы по щелчку выводились рандомные серии сериала, так вот…
    Установив код в нужном месте (способ брал, который реализуется через function.php, ставил в header), у меня на главной странице пропадает вывод всех записей и остается только одна запись, которая собственно и является “рандомной”, а остальные исчезают… Мало того, когда я перехожу по этой записи, то в “single” у меня исчезает форма комментариев…
    Могли бы вы помочь с данной проблемой?

  34. Здравствуйте, подскажите мне, а почему когда я вставляю этот код в index.php (чтобы выводилось на главной странице сверху), то обновляя сайт у меня обновляется не просто ссылка на рандомную запись, но и еще я сразу попадаю на страницу этой случайной записи. Как решить эту проблему, чтобы ссылка обновлялась и при этом выводились последние записи. Заранее спасибо !!!

  35. Из-за вашего долбаного скрипта, который при копировании добавляет ссылку на материал, код копируется неправильно — обрезается! Зря такой херней занимаетесь, столько посетителей отпугиваете. Ни одной обратной ссылки вашему сайту это не принесло, все напрасно.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *