Все о WordPress: плагины, шаблоны, темы и настройка

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

Внутренняя перелинковка WordPress
Существует много плагинов для внутренней перелинковки, но иногда использовать их нецелесообразно т.к. они потребляют много ресурсов и не всегда гибко настраиваются, к счастью существует способ создать внутреннюю перелинковку без использования плагинов! Благодаря этому способу Вы можете вывести предыдущие x-записей из рубрики где опубликован пост.

Чтобы сделать такую перелинковку Вам нужно добавить следующий код в файл single.php (в папке Вашей темы) в то место где Вы хотите вывести "Предыдущие записи":

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?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 (который оптимизировал код).

Существует еще один способ создать внутреннюю перелинковку без использования плагинов, но у него другой принцип работы. Перелинковка создается при помощи вывода похожих записей, похожие записи находятся благодаря одинаковым тегам (если Вы не используете теги, то данный способ не для Вас!).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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

20 комментариев

Денис, 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 (не остануться без внимания некоторые записи).

Y@runya, 04.01.2010 в 09:12Ответить

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

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

Y@runya, у меня тоже была такая проблема, только потом увидел что код поставил ПОСЛЕ

1
<?php comments_template(); ?>

а надо ДО!
P.S. так у меня нормально проработало сутки, потом возник опять косяк не пойми от куда (я так и не разобрался), и я сделал костыль:
До вставки comments_template() надо написать:

1
<?php wp_reset_query();?>

И сейчас все замечательно робит!

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$mainId=$post->ID;
$mycat=get_the_category();
$mycat=$mycat[0];
$posts = get_posts('numberposts=10&category='.$mycat->cat_ID);
foreach($posts as $post) :
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title();?></a></li>
<?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)? Если да то в цикл надо просто включить вывод этого поля, примерно так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?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;
?>
<table>
<tr>
<?php
foreach ($result as $post) {
setup_postdata($post);
?>
<td><img width="100" height="100" src="<?php echo get_post_meta($post->ID, "kartinka", true); ?>"></td> //Вместо kartinka напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней.
<td><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></td>
<?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);
?>
<td><img width="100" height="100" src="<?php echo get_post_meta($post->ID, "kartinka", true); ?>"></td> //Вместо kartinka напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней.
<td><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></td>
<?php
}
}
?>
</tr>
</table>
<?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 напишите то поле в котором хранится Ваша картинка, и если дополните путь к ней. Ну и оформите уже под свой сайт, тут без особых стилей... Если возникнут вопросы, пишите.

Оставить ответ

Топ комментаторов

Спасибо Вам за Ваши комментарии!