Внутренняя перелинковка в WordPress без использования плагинов

Внутренняя перелинковка WordPress
Существует много плагинов для внутренней перелинковки, но иногда использовать их нецелесообразно т.к. они потребляют много ресурсов и не всегда гибко настраиваются, к счастью существует способ создать внутреннюю перелинковку без использования плагинов! Благодаря этому способу Вы можете вывести предыдущие 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% 😉 РЕКОМЕНДУЮ!

Предыдущие записи из рубрики `Настройка WordPress`

32 комментария

Денис, 02.01.2010 в 18:46

Спасибо большое за способы, до этого юзал Related Posts (modified), но из-за того что там нельзя чтобы записи выводились из одной рубрики перешел на Similar Posts, но у него есть недостатки про которые вы писали - "нет похожих записей :-(" т.е. иногда после поста он такое пишит и ничего не выводит из-за этого есть записи на которые вообще нет ссылок!
Сейчас попробывал первый способ, все сразу заработало как надо и вроде действительно быстрее, но точные показатели я не замерял 🙁
Кстати может подскажете как с этими записями выводить превьюшки, т.е. картинку поста справа от ссылки?

ОтветитьОтветить
Ovsyannikov, 02.01.2010 в 22:17

Спасибо, полезный способ. Раньше пользовался Simple Tags и линковал по меткам, как я понял второй способ точно так же работает как и плагин Simple Tags?

ОтветитьОтветить
Артем, 03.01.2010 в 01:22

У меня выводит в некоторых постах по одной ссылке!! Из-за чего это может быть??

ОтветитьОтветить
Артем, 03.01.2010 в 01:27

Разобрался..... мало постов по теме.....

ОтветитьОтветить
CPU, 03.01.2010 в 01:58

Спасибо! Наверное воспользуюсь именно этим способом. ..Но всё равно интересно было бы услышать мнение о плагине "Related Posts", который работает на AJAX.

ОтветитьОтветить
Deimos, 03.01.2010 в 12:05

Ovsyannikov, ну почти да, вроде только в Simple Tags если нет похожих записей (нет таких же меток) можно настроить вывод случайных записей, а тут нет, хотя в принципе доработать этот код для вывода случайных записей в случаи если нет похожих записей не проблема!

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

CPU, что за Related Posts на AJAX'e? Не встречал такого, да и не вижу особого смысла использовать ajax при выводе похожих записей.... ну страница быстрее загрузится, но ресурсов то он сожрет еще и больше) Да и смысла то нет, когда есть такой замечательный способ 😉

ОтветитьОтветить
Yaroslav.Ch, 03.01.2010 в 17:07

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

ОтветитьОтветить
Deimos, 03.01.2010 в 17:41

Yaroslav.Ch

плагины умеют использовать оба варианта сортировки и выводить ссылки на записи из разных категорий и с разными тегами.

С одной стороны Вы правы, но с другой нет - подумайте сами, зачем выводить посты из другой категории если человек ее не смотрит, вот пример: есть сайт у него три категории - wordpress, sape, дизайн... пользователь просматривает статью из категории дизайн (по умолчанию это означает что ему интересна эта тема), зачем ему тогда выводить записи из рубрик sape и wordpress?! Ведь ему интересен только дизайн, а если нет, то он перейдет в категорию sape и будет читать пост от туда и внизу поста сможет просматривать остальные записи из этой же категории (не выходя из записи).
ИМХО очень СДЛьно + очень хорошо с точки зрения SEO (не остануться без внимания некоторые записи).

ОтветитьОтветить
[email protected], 04.01.2010 в 09:12

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

ОтветитьОтветить
Deimos, 04.01.2010 в 11:09

[email protected], у меня тоже была такая проблема, только потом увидел что код поставил ПОСЛЕ
< ?php comments_template(); ?>
а надо ДО!
P.S. так у меня нормально проработало сутки, потом возник опять косяк не пойми от куда (я так и не разобрался), и я сделал костыль:
До вставки comments_template() надо написать:
< ?php wp_reset_query();?>
И сейчас все замечательно робит!

ОтветитьОтветить
Yaroslav.Ch, 04.01.2010 в 18:27

Deimos, не соглашусь 🙂 Дело в том, что мы с Вами по-разному рассматриваем идею "что еще почитать" - для Вас это просто вывод того, что еще есть в рубрике, а для меня - статей схожей тематики, но не обязательно из этой рубрики. То есть, для меня важно - показать читателю материал, который может его заинтересовать после прочтения текущей статьи. И не суть важно из какой он рубрики или с каким тегом. Собственно, это и есть логика СДЛ.

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

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

В общем - оптимальным вариантом было бы объединение этих двух способов в один, но тогда мы получим уже существующий в плагинах функционал.

ОтветитьОтветить
Pepsimist, 05.01.2010 в 01:05

Вывести посты из рубрики можно и так:

< ?php $mainId=$post->ID;
$mycat=get_the_category();
$mycat=$mycat[0];
$posts = get_posts('numberposts=10&category='.$mycat->cat_ID);
foreach($posts as $post) :
?>

  • < ?php the_title();?>
  • < ?php $post=get_post($mainId); endforeach; ?>

    ОтветитьОтветить
    Konstanty, 07.01.2010 в 02:16

    Cпасибо за свежую инфу, а то в основном вылазят статьи с 2008года, которые более чем не актуальны.
    Первый спсоб пришелся по душе больше чем второй.

    ОтветитьОтветить
    Ъ, 10.01.2010 в 21:50

    Превосходно, опробую сейчас же оба способа, включая короткий!

    ОтветитьОтветить
    Alegris, 17.01.2010 в 14:14

    у меня превью картинок не показует 🙁

    ОтветитьОтветить
    Оля, 17.01.2010 в 17:32

    Привет, а как сделать, чтобы писало "Похожие статьи"? Перед этим кодом что нужно вставить? пробовала разное - выводит знаки вопроса в ромбиках))

    ОтветитьОтветить
    Yaroslav.Ch, 18.01.2010 в 14:36

    Оля, сохранить редактируемый файл в UTF-8. Для этого необходимо использовать НЕ Блокнот, а AkelPad или Notepad++.

    ОтветитьОтветить
    Deimos, 18.01.2010 в 19:54

    Alegris, привет! Какое превью, каких картинок?)

    Оля, добрый вечер, Yaroslav.Ch правильно Вам подсказал (за это ему спасибо) надо сохранять файлы в кодировке UTF-8 без BOM - это может любой толковый блокнот, я от себя рекомендую Notepad++. Там все просто и понятно, при редактировании файла в меню будет пункт кодировка - в нем просто выберете перекодировать в UTF-8 без BOM и все будет ок!

    ОтветитьОтветить
    Алекс, 06.02.2010 в 16:50

    В самом начале статьи изображена картинка результата работы плагина Ralated Posts.
    Там помимо ссылки на похожие статьи есть и мини изображение.
    Как реализовать показ таких изображений?

    ОтветитьОтветить
    Deimos, 11.02.2010 в 12:57

    Алекс, у Вас картинки хранятся в произвольном поле (Custom Field)? Если да то в цикл надо просто включить вывод этого поля, примерно так:

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

    < ?php foreach ($result as $post) { setup_postdata($post); ?>

    //Вместо kartinka напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней.

    < ?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); ?>

    //Вместо kartinka напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней.

    < ?php } } ?>

    "> < ?php the_title(); ?> "> < ?php the_title(); ?>

    < ?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();
    ?>

    Код не проверял, но должно работать, вместо kartinka напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней. Ну и оформите уже под свой сайт, тут без особых стилей... Если возникнут вопросы, пишите.

    ОтветитьОтветить

    Комментировать