Как вывести список предыдущих постов из категории без плагинов

Как вывести список предыдущих постов из категории без плагинов | n-wp.ru
Функция, позволяющая выводить список последних постов из определенной категории без использования дополнительных плагинов.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

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

Как вывести список предыдущих постов из категории без плагинов

В файл functions.php вставьте такой код:

function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num = 5){
$num = 0;
global $wpdb;
$sql = "SELECT wposts.* 
FROM $wpdb->posts wposts
  LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
  LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.taxonomy = 'category'
  AND $wpdb->term_taxonomy.term_id = '$the_category_id'
    AND wposts.post_status = 'publish'
    AND wposts.post_type = 'post'
  AND wposts.ID get_results($sql, OBJECT);
//if (!$result){ echo "Записей не найдено"; return false; }
global $post;
echo '<ul>';
foreach ($result as $post){ setup_postdata($post);
//выводим информацию как обычно в ВП это бывает :)
echo '<li><span>',the_time('j/m'),' </span>'.get_the_title().'</li>';
$num++;
}
// если предыдущих постов меньше загаданного количества, выводим ниже последние из рубрики
if ( $num < $post_num || !$result ){ $need_more = $post_num-$num;
$more_posts = get_posts("numberposts=$need_more&category=$the_category_id");
foreach ($more_posts as $post){ setup_postdata($post);
//выводим информацию как обычно в ВП это бывает :)
echo '<li><span>',the_time('j/m'),' </span>'.get_the_title().'</li>';
}}
echo '</ul>';
}

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

cat_ID;
show_previous_posts_from_category( $post->ID, $the_cat_id, 5); wp_reset_query(); ?>

За количество выводимых постов отвечает $post_num = 5 и $the_cat_id, 5.

Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

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

  1. Yury

    очень полезная фишка, единственный вопрос. допустим у меня 5 записей. я использую этот код. к примеру, в 5-й записи покажет предыдущие 4. при этом больше не будут меняться эти ссылки при добавлении новых материалов?

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

    Ответить
    1. tiaurus

      Ссылки у каждой записи меняться не будут. Еще раз: это вывод предыдущих постов из той же категории, основанный на ID кадой записи. Например, в категории опубликованы посты с ID 100, 120, 125, 148, 182, 168, 172, 173. Для записи с ID=120 появится список постов с ID 125, 148, 182, 168,172. То есть это настоящая перелинковка с постоянными ссылками.

      Ответить
  2. Yury

    ооо….это очень круто, товарищ!

    Ответить
  3. Yury

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

    Warning: Cannot modify header information - headers already sent by (output started at /home/arnor/data/www/***ru/wp-content/themes/naturalpower/functions.php:142) in /home/arnor/data/www/***.ru/wp-includes/pluggable.php on line 850

    142 строка это как раз та , где начинается функция вставки

    Ответить
    1. tiaurus

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

      Ответить
  4. Сергей

    Здравствуйте!
    А можно ли подобным образом вывести записи с нужным тэгом из определённой рубрики с известным id?

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

    Спасибо!

    Ответить
    1. Этот код показывает только предыдущие посты из данной рубрики. Теги при этом не учитываются. Думаю, что то, что вы хотите получить, с помощью этого кода сделать нельзя.

      Ответить
      1. Сергей

        а нет на примете такого кода? ну или хотя бы каких-то намёток?

        спасибо! :)

        Ответить
  5. Tane4ka-ko

    Добрый день!
    У меня меняется кодировка на абракадабру при вставке этих кодов.
    В чем может быть причина?
    Есть ли разница в какое место в functions.php его вставлять.
    Спасибо!

    Ответить
    1. tiaurus

      Разница есть. Попробуйте вставить этот код в самом начале, во второй строчке, сразу после <?php
      Кстати, а как вы его копируете? Нужно подвести курсор к коду, и в появившейся панели выбрать view source — вот оттуда и копировать.

      Ответить
  6. Tane4ka-ko

    спасибо! попробую, отпишусь!

    Ответить
    1. Tane4ka-ko

      Да, так и правда получилось) спасибо!)
      только видимо мне надо немого другое…
      в сайдбаре список рубрик, заходишь в рубрику раскрывается сисок постов этой рубрики, заходишь в пост, этот список все также отрыт, заходишь в другую рубрику, для нее также раскрывается список постов, а старый список закрывается….
      можете что нить посоветовать?:)

      Ответить
      1. Ответить
        1. Tane4ka-ko

          я так понимаю это раскрывающийся список подрубрик, а мне нужен список постов.

          Ответить
          1. Ну хорошо, а если я вот так покажу работу плагина:

            Ответить
            1. Tane4ka-ko

              супер!!! спасибо тебе большое!!!!

              Ответить
              1. Tane4ka-ko

                tiaurus, привет!!!
                подскажи пожалуйста, можно ли разделить этот плагин на несколько виджетов. Т.е. чтобы н-р, часть выводилась в сайтбаре, часть на главной и т.п…. и у этих частей были разные настройки в админке…
                а?)

                Ответить
  7. carnage

    Фича работает, но не так как нужно. Выводит случайные посты каждый раз! Как это можно поправить?

    Ответить
    1. tiaurus

      Вы уверены, что случайные? Этот код выводит предыдущие посты из этой же категории, по сравнению с текущей записью. То есть если запись опубликована 1 января, то код выведет список постов из этой же категории, опубликованные до 1 января.

      Ответить
    2. Tane4ka-ko

      только получается, что два раза выводиться ‘,the_time(‘j/m’),’ ‘.get_the_title().’
      — пост, в котором находимся.
      правильно? у меня так…

      Ответить
    3. Tane4ka-ko

      вау!!! супер! т.е. так он тоже работает???
      отлично! спасибо) попробую — отпишусь))))

      Ответить
  8. kama

    Всем привет!

    Я автор этого, кода. Вот здесь улучшенный вариант: Перелинковка статей в WordPress (предыдущие записи из категории).

    Ответить
    1. Отличный вариант! Только несколько непонятный для новичков. Наверное пора его оформить в виде отдельного плагина с разделом настроек?

      Ответить
      1. kama

        Не стоит такая функция оформления как плагин. Хотя, можно, только у меня чет на это дело желания нет.

        Ответить
  9. Nike

    Всё отлично работает.
    Только вот хоть убей- не могу изменить количество постов.
    По умолчанию 5, а надо 3.Вроде всё сделал как написано выше.
    Пните плиз что не так, по возможности подробно.

    Ответить
    1. tiaurus

      Вместо

      $post_num = 5

      поставьте

      $post_num = 3

      Так же вместо

      show_previous_posts_from_category( $post->ID, $the_cat_id, 5)

      поставьте

      show_previous_posts_from_category( $post->ID, $the_cat_id, 3)
      Ответить
  10. Nike

    tiaurus
    Спасибо.
    Всё ОК.
    Я забыл просто про эту строку
    show_previous_posts_from_category( $post->ID, $the_cat_id, 3

    Ответить
  11. Егор

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

    Ответить
    1. tiaurus

      За количество выводимых постов отвечает $post_num = 5 и $the_cat_id, 5.

      Ответить
  12. Егор

    даже при вставке кода пиведенного выше,без изменений,отображаются ВСЕ посты из категории.Изменение строчек не помогает.

    Ответить
    1. tiaurus

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

      Ответить
  13. Егор

    kama :Всем привет!Я автор этого, кода. Вот здесь улучшенный вариант: Перелинковка статей в WordPress (предыдущие записи из категории).

    Большой спасибо Kama,ваш код помог!!

    Ответить
  14. marfix

    Огромное спасибо! Сразу стал использовать но вот беда, заметил что комментарии выводятся от поста последнего в списке! Первичная the_ID() меняется на ID последней выведенной. Отсюда комментарии выводятся не из того поста которого надо а из последнего поста в похожих записях. Как после использования кода, записать в the_ID() ID именно начального поста?

    Ответить
    1. Я немного изменил вторую часть кода — попробуйте, глюк должен исчезнуть.

      Ответить
  15. webazex

    AND wposts.ID get_results($sql, OBJECT);
    в этой строке, двойную скобку поставить надо, потому что у Вас в этой строке:
    $sql = «SELECT wposts.* — открывается скобка, соответсвенно, если я правильно понял Ваш код то надо, строку которую я привел в начале изменить на:
    AND wposts.ID get_results($sql, OBJECT)»;

    Ответить
  16. Григорий Светланин

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

    Ответить