WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

По мотивам одной из статей на сайте 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>

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

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

65 комментов
  • Александр roscredit.msk.su

    Доброго вечера.

    Подскажите, пожалуйста, как сделать так, чтобы ссылки были в конце поста один раз: когда я добавил код в single.php темы, у меня вообще посты перестали открываться. smile И куда бы я не добавлял, ничего хорошего не происходит.
    Код этого файла single.php выглядит так:

    <?php 
    get_header();  
    if (have_posts()) 
    {
      while (have_posts())  
      {
    	art_page_navi();
    	art_post();
    	comments_template();
      }
      art_page_navi();
    } else {    
      art_not_found_msg();
    }
    get_footer();

    А потом я решил добавить этот код в файл post.php. И в этом случае у меня выводятся ссылки и выводятся корректно, но в нескольких местах (как минимум в двух) - в зависимости от того, после какой строки я его вставляю.
    Данный файл post.php выглядит таким образом:

    <div class="art-post<?php echo $post_class; ?>" <?php echo $post_id; ?>>
    						  <div class="art-post-body">
    								  <div class="art-post-inner art-article">
    									  <?php echo $post_thumbnail; ?>
    													  <?php echo $post_title; ?>
    									  <?php echo $post_metadataheader; ?>
    									  <div class="art-postcontent">
    										  <?php echo $post_content; ?>
    									  </div>
    									  <div class="cleared"></div>
    									  <?php echo $post_metadatafooter; ?>
    								  </div>
    							<div class="cleared"></div>
    						  </div>
    					  </div>

    Подскажите, пожалуйста, куда копать?

    Ответить28.Сен.2011 в 21:33 #
    • Александр roscredit.msk.su

      В общем, всё заработало smile Я, короче, сам дятел (что и так понятно :)) Что было не так: в теме выводится постраничная навигация и комментарии. По большому счёту ни то, ни другое мне на почти статичном сайте не нужно.
      А когда закомментировал это - выводиться предыдущие посты стали там, где надо, и в нужных количествах.
      Спасибо за полезную функцию. И удачи.

      Ответить10.Окт.2011 в 12:05 #
  • sanyapro

    Реализовать такую перелинковку на DLE кто-то пробовал

    Ответить06.Фев.2012 в 15:45 #
  • @ Максим feniks5.ru

    Приветствую. Функция перелинковки по категориям имеет кэширование. А у этой можно такое реализовать?

    Ответить19.Фев.2012 в 15:21 #
  • @ Максим feniks5.ru

    Эх... Если б я ещё в PHP разбирался... sad

    Ответить14.Мар.2012 в 18:07 #
  • Елена bowl-pro.ru

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

    Ответить05.Апр.2012 в 23:53 #
  • Михаил Перевощиков perevochikov.ru

    Скажите код в function куда именно вставлять?

    И куда вставлять

    в какой файл на WP ?

    Ответить11.Апр.2012 в 12:31 #
    • Kama7643

      В functions все равно куда ставить. В шаблон, там где нужен список записей.

      Ответить17.Апр.2012 в 02:35 #
  • Алексей 7age.ru

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

    Ответить14.Апр.2012 в 20:12 #
  • Homa

    Какой смысл ставить большие веса на страницы товаров, объясните мне?
    Гораздо выгодней, по-моему, усиливать категории (к примеру, Трансформаторы, Станции) - они и вылезут как быстроссылки в выдаче яндекса под названием сайта.

    Ответить23.Июн.2012 в 09:17 #