Существует много плагинов для внутренней перелинковки, но иногда использовать их нецелесообразно т.к. они потребляют много ресурсов и не всегда гибко настраиваются, к счастью существует способ создать внутреннюю перелинковку без использования плагинов! Благодаря этому способу Вы можете вывести предыдущие x-записей из рубрики где опубликован пост.
Чтобы сделать такую перелинковку Вам нужно добавить следующий код в файл single.php (в папке Вашей темы) в то место где Вы хотите вывести "Предыдущие записи":
<?php function show_previous_posts_from_category ($the_post_id, $the_category_id = 0, $post_num) { $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 < '$the_post_id' ORDER BY wposts.ID DESC LIMIT $post_num"; $result = $wpdb->get_results($sql, OBJECT); global $post; ?> <ul> <?php foreach ($result as $post) { setup_postdata($post); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li> <?php $num++; $save_ids[] = $post->ID; } if ( $num < $post_num || !$result ) { $need_more = $post_num-$num; $save_ids[] = $the_post_id; $save_ids = join (',', $save_ids); $more_posts = get_posts("numberposts=$need_more&category=$the_category_id&exclude=$save_ids"); foreach ($more_posts as $post){ setup_postdata($post); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></li> <?php } } ?> </ul> <?php } ?> <?php $the_cat = get_the_category(); $the_cat_id = $the_cat[0]->cat_ID; show_previous_posts_from_category($post->ID, $the_cat_id, 5); wp_reset_query(); ?>
В 51 строке изменяется количество выводимых постов, по умолчанию выводится 5 предыдущих постов.
По мимо того что этот способ использует намного меньше ресурсов чем аналогичные плагины, он также более логично перелинковывает все страницы. У Вас не получится такая ситуация что на некоторые страницы будут 1-2 ссылки, а на другие по 10 ссылок, при использовании этого способа на каждую запись у Вас всегда будет по 5 ссылающихся страниц! Также плюсом можно назвать и постоянность ссылок, т.е. они не буду изменяться при появлении новых записей.
Пример такой перелинковки Вы можете наблюдать на этом блоге 😉
За данный способ огромное спасибо блогу Dimox'a и пользователю Kama (который оптимизировал код).
Существует еще один способ создать внутреннюю перелинковку без использования плагинов, но у него другой принцип работы. Перелинковка создается при помощи вывода похожих записей, похожие записи находятся благодаря одинаковым тегам (если Вы не используете теги, то данный способ не для Вас!).
<?php $tags = wp_get_post_tags($post->ID); if ($tags) { $tag_ids = array(); foreach($tags as $individual_tag) $tag_ids[] = $individual_tag->term_id; $args=array( 'tag__in' => $tag_ids, 'post__not_in' => array($post->ID), 'showposts'=>5, // Количество записей для вывода. 'caller_get_posts'=>1 ); $my_query = new wp_query($args); if( $my_query->have_posts() ) { echo '<h3>Похожие записи</h3><ul>'; while ($my_query->have_posts()) { $my_query->the_post(); ?> <li><a href="<?php the_permalink() ?>" rel="bookmark" title="Постоянная ссылка на <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } echo '</ul>'; } } ?>
Минусом такого способа является то что некоторые записи могут остаться вообще без ссылающихся на них страниц, ведь иногда теги уникальны и находятся только у одной или нескольких записей, по этому эти страницы останутся без внимания 🙁
В общем могу сказать одно - ИМХО 1 способ это самый лучший вариант внутренней перелинковке блогов на WordPress т.к. он потребляет очень мало ресурсов, все записи получают по 5 ссылок (не одна запись не останется без внимания), СДЛ'ьность - благодаря этому способу пользователь может найти другие интересующие его записи (т.к. записи выводятся из той же рубрики что и сам пост), в общем хорош он на все 100% 😉 РЕКОМЕНДУЮ!
Спасибо большое за способы, до этого юзал Related Posts (modified), но из-за того что там нельзя чтобы записи выводились из одной рубрики перешел на Similar Posts, но у него есть недостатки про которые вы писали - "нет похожих записей :-(" т.е. иногда после поста он такое пишит и ничего не выводит из-за этого есть записи на которые вообще нет ссылок!
Сейчас попробывал первый способ, все сразу заработало как надо и вроде действительно быстрее, но точные показатели я не замерял 🙁
Кстати может подскажете как с этими записями выводить превьюшки, т.е. картинку поста справа от ссылки?
Спасибо, полезный способ. Раньше пользовался Simple Tags и линковал по меткам, как я понял второй способ точно так же работает как и плагин Simple Tags?
У меня выводит в некоторых постах по одной ссылке!! Из-за чего это может быть??
Разобрался..... мало постов по теме.....
Спасибо! Наверное воспользуюсь именно этим способом. ..Но всё равно интересно было бы услышать мнение о плагине "Related Posts", который работает на AJAX.
Спасибо за способы - в свете прожорливости WordPress очень полезно. Но все же сравнивать их с плагинами считаю не совсем корректным, т.к. в каждом из способов используется только один алгоритм выбора - или категория или теги, а плагины умеют использовать оба варианта сортировки и выводить ссылки на записи из разных категорий и с разными тегами.
Странновато, но у меня к сожалению такой способ не работает. После таких ссылок комментарии выводятся вообще от совсем другого поста. То есть пост нормальный а вот комменты не от него подключаются. В чем может быть причина?
Deimos, не соглашусь 🙂 Дело в том, что мы с Вами по-разному рассматриваем идею "что еще почитать" - для Вас это просто вывод того, что еще есть в рубрике, а для меня - статей схожей тематики, но не обязательно из этой рубрики. То есть, для меня важно - показать читателю материал, который может его заинтересовать после прочтения текущей статьи. И не суть важно из какой он рубрики или с каким тегом. Собственно, это и есть логика СДЛ.
Кроме того, рубрики почти всегда не настолько однозначны и однонаправлены как в Вашем примере, а именно потому кроме них используются также и теги. Но при этом только на тегах зацикливаться тоже не верно - по тем же причинам.
И более того, правильная перелинковка - это не вывод статей одной рубрики на каждой странице, а перекрестное линкование с разными категориями сайта.
В общем - оптимальным вариантом было бы объединение этих двух способов в один, но тогда мы получим уже существующий в плагинах функционал.
Вывести посты из рубрики можно и так:
ID;
$mycat=get_the_category();
$mycat=$mycat[0];
$posts = get_posts('numberposts=10&category='.$mycat->cat_ID);
foreach($posts as $post) :
?>
Cпасибо за свежую инфу, а то в основном вылазят статьи с 2008года, которые более чем не актуальны.
Первый спсоб пришелся по душе больше чем второй.
Превосходно, опробую сейчас же оба способа, включая короткий!
у меня превью картинок не показует 🙁
Привет, а как сделать, чтобы писало "Похожие статьи"? Перед этим кодом что нужно вставить? пробовала разное - выводит знаки вопроса в ромбиках))
Оля, сохранить редактируемый файл в UTF-8. Для этого необходимо использовать НЕ Блокнот, а AkelPad или Notepad++.
В самом начале статьи изображена картинка результата работы плагина Ralated Posts.
Там помимо ссылки на похожие статьи есть и мини изображение.
Как реализовать показ таких изображений?
Ovsyannikov, ну почти да, вроде только в Simple Tags если нет похожих записей (нет таких же меток) можно настроить вывод случайных записей, а тут нет, хотя в принципе доработать этот код для вывода случайных записей в случаи если нет похожих записей не проблема!
Артем, да, если в рубрике только три записи он будет выводить две предыдущие.... по мере того как будут появляться новые записи он дополнит.
CPU, что за Related Posts на AJAX'e? Не встречал такого, да и не вижу особого смысла использовать ajax при выводе похожих записей.... ну страница быстрее загрузится, но ресурсов то он сожрет еще и больше) Да и смысла то нет, когда есть такой замечательный способ 😉