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 комментов
  • Dimox dimox.name

    В очередной раз спасибо за функцию smile В свободное время заменю старую на эту.

    Ответить29.Апр.2010 в 22:19 #
    • Kama7643

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

      Ответить30.Апр.2010 в 08:55 #
  • Dimox dimox.name

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

    Ответить03.Май.2010 в 13:37 #
    • Kama7643

      Да, так и есть. Просто предыдущие по блогу берутся. "Из рубрики" еще не готова. Ща в посте поясню, что по блогу берется.

      Сорри, что ввел в заблуждение.

      Ответить03.Май.2010 в 14:00 #
  • Cartel-X cartel-x.com

    Kama, у меня к тебе просьба. вот, эта функция перелинковки, не чувствительна к пермалинкам, всё =?553. Поправь пожалуйста код, если есть время. Спасибо.

    Ответить06.Июл.2010 в 13:06 #
    • Kama7643

      Пардон, поправил!

      Баг был потому что у себя на сайтах я не использую get_permalink(), ибо она постоянно генерирует ссылку на страницу - объемный процесс получается если ссылок много.

      Впрочем, об этом в ближайшем будущем статью хочу написать wink

      Ответить07.Июл.2010 в 10:57 #
  • Kalian

    Как помимо выборки записей из определенной рубрики дополнительно добавить к этому и выборку из определенного тэга?

    1
    Ответить01.Авг.2010 в 20:23 #
  • grom

    Простой вопрос.
    Подскажите, а куда правильно то вставлять данную функцию в файл functions.php?
    я в разные места пробовал, всегда fatal error выдаёт.

    Ответить16.Авг.2010 в 00:05 #
  • grom

    Решил проблему
    вставил сразу после строки

    <?php if ( function_exists('register_sidebar') ) {register_sidebar();register_sidebar();}

    Всё отлично.
    В нужное место вставил?

    Ответить16.Авг.2010 в 00:18 #
    • Kama7643

      В нужное место вставил?

      Да. Разницы нет в какой место файла function.php вставлять эту функцию.

      Ответить16.Авг.2010 в 12:09 #
  • Андрей

    Здравствуйте!
    Помогите решить проблему. Вставляю код в function.php и сразу на всем сайте слетает кодировка, включая админку. Вместо русских букв иероглифы. В чем может быть пролема?

    Ответить13.Сен.2010 в 01:01 #
    • Kama7643

      Точно не знаю. Возможно кодировка самого файла function.php отличается от кодировки сайта и она сказывается. Проверьте кодировку function.php

      Ответить13.Сен.2010 в 09:40 #
      • Андрей

        Спасибо, помогло. Кодировка была ANSI. Перекодировал в UTF-8 и все заработало. Еще раз спасибо за помощь

        Ответить13.Сен.2010 в 12:42 #
  • nike

    Подскажите пожалуйста дописать фразу к названию ссылки?
    У меня сейчас выводится так:
    название 1
    название 2
    а хочется чтоб было так:
    Скачать название 1
    Скачать название 2

    -1
    Ответить10.Янв.2011 в 17:29 #
    • Kama7643

      Все очень просто, в параметре format (второй параметр) пишите как-то так:

      <ul>  
      	 <?php kama_previous_posts (6, '{a}Скачать {title}{/a}'); ?>  
       </ul>
      Ответить12.Янв.2011 в 09:26 #
  • nike

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

    Ещё раз спасибо.

    Ответить12.Янв.2011 в 21:40 #
    • Kama7643

      Вставлять нужно туда, где должен выводится список предыдущих записей. Возможно в вашем случае (если интегрируется в php код) нужно вставить такой код:

      echo "<ul>";  
      	   kama_previous_posts (6, '{a}Скачать {title}{/a}');  
         echo "</ul>";
      Ответить12.Янв.2011 в 23:30 #
  • nike

    Видать не судьба........
    Пишет Fatal error: Call to undefined function kama_previous_posts() in .............single.php on line 126

    Это при вставке первого варианта, а во втором варианте ничего не выводится кроме echo "

      ";...........

    Ответить13.Янв.2011 в 00:07 #
    • Kama7643

      Что-то вы не то делаете, определенно! Первая ошибка должна быть и во втором случае! Вы код функции в файл темы functions.php вставили?

      Ответить13.Янв.2011 в 09:26 #