WordPress как на ладони
wordpress jino

Перелинковка статей (предыдущие записи)

По мотивам одной из статей на сайте dimox.name «Отличный способ внутренней перелинковки статей (для WordPress)». Где я собственно уже писал в комментариях. Теперь решил написать у себя на блоге.

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

Однако, понятно, что если текущая статья, к примеру, самая первая на сайте, то у нее нет предыдущих статей и соответственно никаких ссылок выводится не будет, для решения этой проблемки идея была дополнена понятием "кольцевая перелинковка", т.е. статья, которая не имеет предыдущих записей будет ссылаться на последние записи.

Для наглядности, предположим, что у нас на сайте 10 статей и мы выводим по 4 предыдущие ссылки. Теперь, когда мы зайдем на 10-ю статью, то на этой странице будут показаны ссылки на: 9,8,7,6 статьи. Если зайдем на 6-ю, то будут показаны ссылки на: 5,4,3,2 статьи. Теперь, "кольцевая перелинковка", когда зайдем на 3-ю статью будут показаны ссылки на: 2,1,10,9 статьи.

С таким подходом, из сайта / блога мы делаем нечто цельное, где уже нет забытых (одиноких, осиротевших), с точки зрения СЕО страниц.

Ближе к делу

Предыдущие статьи для WordPress (в целом по сайту):

/** Предыдущие записи
------------------------------------------------------
$format ('') = {date:j.M.Y} - {a}{title}{/a} ({comments})
$post_num (5) = количество ссылок
$list_tag (li) = Тег списка
*/
function kama_previous_posts ($post_num=5, $format = '', $list_tag='li', $echo=true){
	global $post, $wpdb;
	$sql ="SELECT ID, post_title, post_date, comment_count, guid
	FROM $wpdb->posts p
	WHERE post_date < '$post->post_date'
		AND post_type = 'post' AND post_status = 'publish'
	ORDER BY post_date DESC LIMIT $post_num";
	$res = $wpdb->get_results($sql);
		$exclude = $post->ID;
		foreach ($res as $id) $exclude .= ','.$id->ID;
		$count_res = count($res);

	if ( !$res || $count_res<$post_num ){
		$post_num = $post_num-$count_res;
		$sql2 ="SELECT ID, post_title, post_date, comment_count, guid
		FROM $wpdb->posts p
		WHERE ID NOT IN ($exclude)
			AND post_type = 'post' AND post_status = 'publish'
		ORDER BY post_date DESC LIMIT $post_num";
		$res2 = $wpdb->get_results($sql2);
		$res = array_merge($res,$res2);
	}
	if (!$res) return false;
	preg_match ('!\{date:(.*?)\}!',$format,$date_m);
	foreach ($res as $pst){
		$x == 'li1' ? $x = 'li2' : $x = 'li1';
		$Title = $pst->post_title;
		$a1 = "<a href='". get_permalink($pst->ID) ."' title='{$Title}'>";
		$a2 = "</a>";

		if ($format){
			$date = apply_filters('the_time', mysql2date($date_m[1],$pst->post_date));
			$Sformat = str_replace ($date_m[0], $date, $format);
			$Sformat = str_replace('{title}', $Title, $Sformat);
			$Sformat = str_replace('{a}', $a1, $Sformat);
			$Sformat = str_replace('{/a}', $a2, $Sformat);
			$Sformat = str_replace('{comments}', $pst->comment_count, $Sformat);
		}
		else $Sformat = $a1.$Title.$a2;
		$out .= "\n<$list_tag class='$x'>{$Sformat}</$list_tag>";
	}
	if ($echo) echo $out;
	else return $out;
}

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

<ul>
	<?php kama_previous_posts (5); ?>
</ul>
//выведет 5 предыдущих ссылок.

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

  • {comments} - покажет колличество комментариев у статьи;

  • {title} - заголовок статьи;

  • {date:j.M.Y} - дата в формате j.M.Y (11.Апр.2010). Формат даты есно можно поменять smile

Так же, здесь я добавил классы li1 и li2 к тегу <li>, чтобы легко можно было раскрасить список в зебру. Еще, если указать третий параметр $list_tag, то можно изменить тег списка. К примеру:

<?php kama_previous_posts (6, '', 'div') ?>
// выведет не в li списке, а в div: <div class='li1'>Здесь ссылка</div>
Пример использования функции с указанием формата вывода:
<ul>
	<?php kama_previous_posts (6, '{date:j.M.Y} - {a}{title}{/a} (Комментариев: {comments})'); ?>
</ul>
//выведет в формате: <li class='li1'>17.Апр.2010 - <a href='http://ссылка на статью' title='заголовок статьи'>заголовок статьи</a> (Комментариев: 10)</li>

Обратите внимание

Эта функция выводит просто предыдущие статьи, а не предыдущие из категории в которой находится текущая статья. Чтобы выводить предыдущие из категории используйте эту функцию.

Перелинковка статей (предыдущие записи) 72 комментария
Вопросы 1 Все
  • Дмитрий cайт: ktonanovenkogo.ru @

    Здравствуйте!

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

    Ответить4.9 года назад #
  • Василий @

    Мне кажется вы не правы и буду рад, если вы докажете мне обратное. Я также написал Димоксу, интересно и его мнение.

    Известно, что вес по ссылкам начинает полноценно передаваться лишь через несколько месяцев после простановки. Это было сделано для борьбы с продажными ссылками аля Sape, которые выставляются на несколько дней, а потом удаляются.

    Итак, вы говорите о том, что "когда зайдем на 3-ю статью будут показаны ссылки на: 2,1,10,9 статьи". Соответственно, на 1-ой статье будут показаны 10,9,8,7 статьи. Для необновляющегося сайта это великолепное кольцо.

    Но! Допустим, прошло пару месяцев и у вас появилось 5 новых статей. Теперь первая статья ссылается на 15,14,13,12 статьи. Получается, что все ссылки поменялись и теперь вес передается им. Поисковики-то еще не успели учесть те ссылки, а тут уже новые... Таким образом, кольцо разывается и формируется новое, для полноценной работы которого нужно несколько месяцев.

    Но у вашего кольца соответственно нет нескольких месяцев - схема не работает. Где я не прав?

    Ответить4.5 года назад #
    • Алексей @

      Везде прав. Но это относится только к последним 5 статьям. Которые получат постоянные ссылки на себя сразу после появления более поздних статей, что вполне справедливо (последние статьи всё равно не получили бы никакого веса в течение первых месяцев), и, для обновляющегося блога, займёт немного времени (период_обновления*5). А для необновляющегося блога ситуация описана вами выше.

      Вообще, идеальных решений не бывает. Перелинковка, в первую очередь, даёт удобство пользователю, плюс небольшое SEO.

      Ответить4.5 года назад #
  • Konstantin

    Благодарю kama за полезную статью. Один из самых хороших блогов ever!

    Ответить4.4 года назад #
  • Михаил cайт: artstorm.su

    День добрый. или вечер, или что там у Вас сейчас )
    А можно ли такой функцией вывести все материалы, на дату отображаемого?
    Заранее спасибо

    Ответить3.9 года назад #
  • Velimudr-1 cайт: freelance.ru/tim4ik

    ВО! То, что нужно было, а я поленился почитать пред идущие темы твои и написал в другой, где функция вывода относительно категории текущего поста... )))
    Тимур, ты как Джин, в самом деле. Благодарю за статьи thank_you

    Ответить2.4 года назад #
  • Кирилл @

    Добрый вечер!
    Работает ли эта схема для информационника?
    и есть ли разница какое количество перелинковок ставить со статьи в 2000-3000 символов, или с 6000 символов или с 60 000 статьи?

    Ответить1.1 года назад #
    • Андрей cайт: beguza.ru @

      Разница есть. Как правило, чем больше статья, тем больше она "весит". А надобность сего деяния зависит от частоты запроса.

  • Андрей cайт: beguza.ru @

    Подскажите, как исключить одну рубрику из перелинковки?

Здравствуйте, !

Ваш комментарий