
Всем привет!
Сегодня хочу поделиться доработкой своей функции для кольцевой перелинковки статей в WordPress. Первый вариант функции в общем ни чем не уступает этому, разница лишь в том, что с помощью этого варианта функции, вы сможете указать с какой таксономией работать и какой тип записи вас интересует. Прошлая функция работает лишь со стандартными категориями WordPress и постами, т.е. с таксономией category и типом записей post.
Эта функция полностью заменяет прошлую. Толчком для её создания стала просьба одного из читателей этого блога, сделать функцию для кольцевой перелинковки, для кастомных (произвольных) страниц, которые были предусмотренны на сайте. Таксономия так же была созданна новая. Не долго думая я переделал прошлую функцию, изменив там принцип получения таксономии: если раньше категория(и), в которой находится запись, получалась стандартными функциями WordPress, то теперь таксономия к которой относится запись получается прям из Базы Данных, такой подход вроде более логичный и быстрый (не проверял).
Тот кто просил эту функцию даже отблагодарил меня 10-ю условными единицами на мой кошелек WebMoney, что конечно приятно, спс ему, надеюсь он не против, что я выкладываю эту функцию в паблик.
Устанавливается функция как обычно: копируем код в файл темы functions.php а затем в шаблоне, там где нужно вывести ссылки, вызываем функцию с указанием необходимых параметров.
/** Предыдущие записи из рубрики (относительно текущей записи) + кольцевая перелинковка
(можно указывать Таксономию и Тип записи)
----------------------------------------------------------------------------------------
Параметры передаваемые функции (в скобках указано дефолтное значение):
post_num (5) = количество ссылок
format ('') = {date:j.M.Y} - {a}{title}{/a} ({comments})
cache ('') = включить кеш (по умолчанию выключен). Пишем 1, чтобы включить
tax (category) = Таксономия Пример: photos
post_type (post) = Тип записи Пример: photo
Вызываем функцию примерно так (в зависимости от нужного результата):
<?php echo kama_previous_posts_from_tax(5, '{date:j.M.Y} - {a}{title}{/a}', 1); ?>
*/
function kama_previous_posts_from_tax($post_num=5, $format='', $cache='', $tax='category', $post_type='post'){
global $post, $wpdb;
$cache_key = (string) md5( __FUNCTION__ . $post->ID );
$cache_flag = __FUNCTION__;
if ( $cache && $cache_out = wp_cache_get($cache_key, $cache_flag) )
return $cache_out;
$tax_id = "SELECT term_id FROM $wpdb->term_relationships rl LEFT JOIN $wpdb->term_taxonomy tx ON (rl.term_taxonomy_id = tx.term_taxonomy_id) WHERE object_id = {$post->ID} AND tx.taxonomy = '$tax' LIMIT 1";
$same_join = "SELECT ID, post_title, post_date, comment_count, guid
FROM $wpdb->posts p
LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
$same_and = "AND tax.term_id = ($tax_id)
AND tax.taxonomy = '$tax'
AND p.post_status = 'publish'
AND p.post_type = '$post_type'
ORDER BY p.post_date DESC";
$sql = "$same_join
WHERE p.post_date < '{$post->post_date}'
$same_and
LIMIT $post_num";
$res = $wpdb->get_results($sql);
$count_res = count($res);
// если количество меньше нужного, делаем 2-й запрос (кольцевая перелинковка)
if ( !$res || $count_res<$post_num ){
foreach ($res as $id)
$exclude .= ','.$id->ID;
$sql = "$same_join
WHERE p.ID NOT IN ({$post->ID}{$exclude})
$same_and
LIMIT ".($post_num-$count_res);
$res2 = $wpdb->get_results($sql);
$res = array_merge($res,$res2);
}
if(!$res)
return false;
// Формировка вывода
if ($format)
preg_match ('!\{date:(.*?)\}!', $format, $date_m);
foreach ($res as $pst){
$x == 'li1' ? $x = 'li2' : $x = 'li1';
$Title = stripslashes($pst->post_title);
$a = "<a href='". get_permalink($pst->ID) ."' title='{$Title}'>"; //get_permalink($pst->ID) меняем на $pst->guid если настроено поле guid
if($format){
$Sformat = strtr($format, array(
'{title}' => $Title
,'{a}' => $a
,'{/a}' => '</a>'
,'{comments}' => ($pst->comment_count==0) ? '' : $pst->comment_count
));
if($date_m)
$Sformat = str_replace($date_m[0], apply_filters('the_time', mysql2date($date_m[1], $pst->post_date)), $Sformat);
}
else
$Sformat = "$a$Title</a>";
$out .= "\t<li class='$x'>$Sformat</li>\n";
}
if($cache) wp_cache_add($cache_key, $out, $cache_flag);
return $out;
}
Параметры, передаваемые функции
- post_num - количество ссылок, которые будут выведены. По умолчанию 5.
- format - формат выводимых ссылок. По умолчанию "{a}{title}{/a}".
- cache - включить кэш. Результат запроса будет кешироваться. Должен работать стандартный кэш WordPress (обычно кэш включается спец. плагинами), пишет true, чтобы включить. По умолчанию выключено.
- tax - таксономия к которой относится запись. По умолчанию category
- post_type - тип записией для который будет происходить перелинковка. По умолчанию post.
Несколько примеров использования
1. Выведем 5 предыдущих ссылок из категории, для обычных записей WordPress:
<?php echo kama_previous_posts_from_tax(); ?>
2. Выведем 6 предыдущих ссылок (1-й парам.), для записей из таксономии movies (4-й парам.), тип записи которых равен movie (5-й парам.). Так же в формате вывода добавим дату публикации записи (2-й парам.) и включим кэширование результатов (3-й парам.):
<?php echo kama_previous_posts_from_tax(6, '{a}{title}{/a} - {date:j.M.Y}', 1, 'movies', 'movie'); ?>
Удачных веб-проектов вам!
- Предыдущие по меткам
- Предыдущие записи
- Как лучше удалить слово category из постоянной ссылки (УРЛа) в WordPress ← 14.Ноя.2010 // 43
- Сравнение СЕО плагинов platinum SEO Pack и All in One SEO Pack и отказ от них ← 24.Май.2010 // 89
- Перелинковка статей в WordPress (предыдущие записи из категории) ← 4.Май.2010 // 91
- Перелинковка статей (предыдущие записи) ← 19.Апр.2010 // 60
- Рекламный блок в тексте статьи ← 17 Декабрь 2010 // 34
- Sypex Dumper 2 for WordPress ← 16 Декабрь 2010 // 6
- Заранее установленный текст для нового поста в WordPress (the_editor_content) ← 9 Декабрь 2010 // 4
Вопрос. Мне нужно разместить статьи для перелинковки в сайдбаре, а не после статьи. Т.е. вызов функции будет вне цикла вывода основного контента статьи. Я спрашиваю потому, что пользуюсь сейчас вариантом, который зависит от цикла контента (как оказалось). По-другому, он просто не может извлечь ID категории и вывести статьи (вариант от Dimox).
Ты написал, что можно разместить вызов "в любом месте шаблона". Это в прямом смысле "в любом" (хоть в футере или хедере)?
Ну да в прямом смысле - в любом месте шаблона. Главное, чтобы переменная $post не нарушалась. Т.е. в сайдбаре она должна относиться к текущему посту. Такой глюк встречается частенько в темах.
Подскажите, пожалуйста, есть ли возможность (плагин/функция) перелинковки статей с одинаковой иллюстрацией в двух категориях. Т.е. желательно вывести в категории1 под статьей с одним изображением и описанием к нему список статей из категории2, в которых вставлено тоже самое изображение (как единственная или одна из нескольких иллюстраций)
Прив.
Вопрос, как внедрить в этот код не только вывод заголовка, но и анонс небольшой:
(типа <?php the_content_rss('', TRUE, '', 20); ?>), да и с превьюшкой (тумбой) из поста?
Подкорректировать код в части // Формировка вывода. Для тумбов из поста можете попробовать мой плагин.
Расписывать все по полочкам, сорри, не буду!
Доброго времени! У вас в сайдбаре есть "рекомендую посетить". Как оно туда попало?
Я хочу вывести таким же образом список статей, которые могут быть наиболее полезными посетителю. Подскажите, как это сделать? Не список последних, популярных, или самых обсуждаемых, а именно тех, которые я хотела бы рекомендовать. новичок я, html не знаю... 
Огромное спасибо, помогло!
Очень полезная фишка, но могу вам дать еще пищи для модернизации и развития даной процедуры.
Для СЕО проектов бывает очень полезно делать
а) рандомный вывод ссылок
б) рандомный анкор (т.е. для одной оптимизированный статьи по НЧ запросы, может соответствовать несколько низкочастотников, было бы очень полезно задавать 1 - 3 анкора, и выводить их рандомно вашей функцией)
Здравствуйте
У меня на сайте перелинковка выполнена рандомным выбором постов из текущей категории
Это плохой способ?
Если да то чем именно?
Спасибо
Не знаю. Спросите у оптимизаторов.
А может Перелинковку делать сразу без каких либо плагинов
Кама, может пропишите как вывести анонсы с помощью content_rss ?
Честно говоря замучился методом тыка искать решение.
Большое спасибо.
Что именно вас интересует? Что-то я не совсем понял.
Еще раз добрый день.
Я имел ввиду чтоб под заголовком поста - выводился анонс текста (этого же поста), используя тег content_rss. Я денек помучился методом тыка, но ничего добиться не смог.