Это продолжение поста о перелинковке статей.
В этой статье я хочу поделиться очередной функцией для WordPress, в задачи, которой входить вывод предыдущих записей из категории (рубрики), текущей статьи. Функция, так же, создает кольцевую перелинковку (см. первую статью).
Принципиальное отличие этой функции в том, что она выводит предыдущие записи из категории, тогда как, прошлая подобная функция выводит просто предыдущие записи.
Почти, такую же функцию я публиковал в комментариях на сайте Dimox.name здесь. Почему "почти"? Потому что, эта функция обладает рядом преимуществ над той, что была опубликована на Dimox.name, а именно:
- Можно задавать формат вывода, благодаря чему её очень просто внедрить в любой шаблон;
- Для этой функции не нужно заранее определять текущую категорию (функция сама определит её), т.е. меньше лишнего кода в шаблоне и проще новичкам.
- Функция не использует, немного грузовую, функцию самого WordPress get_posts()
- К каждому тегу ссылки добавляется классы li1 и li2, чтобы легко можно было раскрасить список в зебру.
- Можно включить кеширование. Подробнее об этом ниже.
- Список сортируется по дате, а не по ID, т.е. если запись была опубликована задним числом она будет выводится как нужно.
Использование функции
А вот, собственно, и код, который нужно поместить в ваш файл шаблона functions.php.
/** Предыдущие записи из рубрики (относительно текущей записи) + кольцевая перелинковка
----------------------------------------------------------------------------------------
Параметры передаваемые функции. В скобках указано дефолтное значение.
post_num (5) = количество ссылок
format ('') = {date:j.M.Y} - {a}{title}{/a} ({comments})
cache ('') = включить кеш (по умолчанию выключен). Пишем 1, чтобы включить
list_tag (li) = Тег списка.
echo (true) = Выводить на экран или возвращать для обработки (false)
*/
function kama_previous_posts_from_cat ($post_num=5, $format = '', $cache = '', $list_tag='li', $echo=true){
global $post, $wpdb;
$cache_key = (string) md5( __FUNCTION__ . $post->ID );
$cache_flag = __FUNCTION__;
if ( $cache && $cache_out = wp_cache_get($cache_key, $cache_flag) ){
if ($echo) return print($cache_out);
else return $cache_out;
}
$cat = get_the_category($post->ID);
$cat_id = (int) $cat[0]->term_id;
$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 = '$cat_id'
AND tax.taxonomy = 'category'
AND p.post_status = 'publish'
AND p.post_type = 'post'";
// пробуем получить предыдущие записи
$sql = "$same_join
WHERE p.ID < {$post->ID}
$same_and
ORDER BY p.post_date DESC
LIMIT $post_num";
$res = $wpdb->get_results($sql);
$count_res = count($res);
// если количество меньше нужного, делаем 2-й запрос
if ( !$res || $count_res<$post_num ){
$exclude = $post->ID;
if ($res) foreach ($res as $id) $exclude .= ','.$id->ID;
$post_num = (int) $post_num-$count_res;
$sql = "$same_join
WHERE p.ID NOT IN ($exclude)
AND p.ID != {$post->ID}
$same_and
ORDER BY p.post_date DESC
LIMIT $post_num";
$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 = $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==0)?'':$pst->comment_count), $Sformat);
}
else $Sformat = $a1.$Title.$a2;
$out .= "\n<$list_tag class='$x'>{$Sformat}</$list_tag>";
}
if ($cache) wp_cache_add($cache_key, $out, $cache_flag);
if ($echo) echo $out;
else return $out;
}
После того, как код, успешно, скопирован в файл темы functions.php, в том месте где мы хотим вывести предыдущие записи из текущей категории вызываем функцию так:
<ul> <?php kama_previous_posts_from_cat (5); ?> </ul> // 5 это количество выводимых ссылок
Вот, собственно, и все, что нужно сделать для простого использования функции.
Важно! Вызов будет работать корректно только в файле темы, отвечающем за вывод постов (обычно это single.php).
Расширенное использование
Для настройки формата вывода исползуйте:
- {comments} - покажет колличество комментариев у статьи;
- {title} - заголовок статьи;
- {date:j.M.Y} - дата в формате j.M.Y (11.Апр.2010);
- {a} и {/a} - тег ссылки. Открывается и закрывается.
Вызов будет таким:
<ul>
<?php kama_previous_posts_from_cat (5, '{a}{title}{/a} ← {date:j.M.Y} // {comments}'); ?>
</ul>
// выведет список в формате - <li class='li1'><a href='http://ссылка' title='Заголовок статьи'>Заголовок статьи</a> ← дата // колличество комментариев</li>
Использование кеша
Так как, в WordPress кеш, начиная с 2.х версии (не помню точно), выключен, то кеширование будет работает только в связке с плагинами кеширования, которые совместимы с классом WP_Object_Cache. В частности, я говорю про плагины Владимира: WP File Cache и SJ Object Cache.
Если вы используете плагины постраничного кеширования или вообще не используете плагины кеширования, то включать кеш у этой функции смысла нет.
Вызов функции с использованием кеша
<ul> <?php kama_previous_posts_from_cat (5, '', 1); ?> </ul> // выведет 5 ссылок и закеширует результат в файл, с последующим извлечением информации из этого файла. Файл будет создавать отдельный для каждого поста.
Тег списка
Можно изменить тег списка li на любой другой, например div
<?php kama_previous_posts_from_cat (5, '', 0, 'div'); ?> // выведет 5 ссылок в формате - <div class='li1'><a href='http://ссылка' title='Заголовок статьи'>Заголовок статьи</a></div> .
И последнее
Если передать последний (5-й) параметр, как false, то результат будет возвращен для обработки (return), а не выведен на экран.
- Предыдущие по меткам
- Предыдущие записи
- 12 приемов с админкой WordPress (сайт для клиента) ← 1.Сен.2011 // 39
- Динамический архив блога с использованием jQuery (Ajax) ← 12.Май.2011 // 21
- Самые Хлебные крошки (breabcrumbs для WordPress) ← 19.Апр.2011 // 79
- Кнопка "Наверх" с плавным прокручиванием ← 3.Мар.2011 // 90
- Плагин опроса для WordPress - Democracy Poll ← 12 Июнь 2010 // 110
- Плагин для легкого управления сайтом на WordPress ← 23 Апрель 2010 // 33
- Считаем количество посещений страниц на WordPress без плагинов ← 21 Апрель 2010 // 135
Вы меня неправильно поняли.
Я хочу, чтобы если запись в категории только одна и ссылаться ей не на кого, то вместо пустого окна выводилось бы сообщение, что записей в данной категории нет.
Вы это реализовали вот этим кодом:
$res = $wpdb->get_results($sql); if( !$res ) return print "Нет похожих записей.";Но с этим кодом происходит небольшая ошибка - у самой ПЕРВОЙ записи в какой-либо категории выводится это сообщение, даже если в этой категории есть и другие записи, на которые можно ссылаться. Т.е. получается, что все первые записи каких-либо категорий остаются без ссылок на другие записи этих категорий. Вот как это исправить?
Это видимо глюк шаблона. Попробуйте шаблон сменить на дефолтный.
У меня на этом блоге используется эта функця, вот первая запись. Как видите, все работает нормально. Где может быть ошибка — идей нет.
Выражаю огромную благодарность за данную функцию - очень помогла в перелинковке. Поставил себе и крайне доволен тем, что ссылки статические.
Что-то весь сайт падает... На wp 3.2.1 - работает? воть...
Так вы этот мой код в конструкцию вида:
суньте, а то он у вас как обычный текст работает
Parse error: syntax error, unexpected T_VARIABLE in /var/www/bot-in9803/data/www/furgeschaft.net/wp-content/themes/coralis/functions.php on line 135
" $Sformat = str_replace('{comments}', (($pst->comment_count==0)?'':$pst->comment_count), $Sformat)"
Пробовал сразу так..)))
Может из-за того что коменты вырезаны?
Не знаю в чем проблема может быть. Надо конкретный случай смотреть.
и самое интересное что на др. сайте работает...
Здравствуйте.
Установил эту функцию. Почти идеально работает.
На моем сайте есть подрубрики, то есть: рубрика -> в ней подрубрика -> пост. В таких постах отображаются не 5 последних записей, а только те, которые есть в этой подрубрике. Если в подрубрике только 2 статьи, то и покажет 2 ссылки. Это возможно исправить?
Теоретически конечно можно, а так - нет - долго, сложно.
Здравствуйте. У меня такой вопрос, код конечно работает идеально, но если к примеру у меня к посту указывается две рубрики, одна основная а другая дочерняя, этот код выводит только ссылки по первой рубрике, в моем случае она дочерняя идет. Как сделать так чтоб выводились ссылки из всех (двух) указанных рубрик к посту, а не только к дочерней? Спасибо!
Не могу помочь, это связано с изменением кода и с рядом сложностей. ищите альтернативу этой функции, если не подходит.
Здравствуйте. Скажите как убрать точки перед сылками?
добрый день. Отличный вариант для перелинковки. Ставлю его на всех своих сайтах. недавно столкнулся с проблемой - необходимо было выводить предыдущие записи категории с миниатюрами. Прикрутил Ваш код, но учитывая, что я от слова "программист" очень далек, пришлось методом научного тыка дорабатывать Ваш код (надеюсь Вы не против). В общем с горем пополам получилось. Возможно еще кому-то будет интересен такой вариант вывода:
После строки:
Добавляем:
А вместо следующей:
$a1 = $imth . "<a href='". get_permalink($pst->ID) ."' title='{$Title}'>";Ставим:
$a1 = $imth . "<a href='". get_permalink($pst->ID) ."' title='{$Title}'>";Возможно такой вариант нелогичен, или присутствуют лишние строки - я без понятия, собирал функции из WP-кодекса как Lego в детстве, в итоге добился результата