Мандруючи просторами web-у, зіштовхнувся з чудовою функцією, яка дозволяє виводити посилання у ваших статтях на Х попередніх записів, утворюючи тим самим внутрішню перелінковку між усіма записами на блозі. Автором цієї функції є Тимур Камаєв.

Які можливості перед Вами відкриваються при використанні даної функції:

  • Можна задавати формат виводу, що дозволить легко підлаштувати під Ваш шаблон
  • Не має потреби визначати категорію, функція сама її визначить
  • Функція не використовує функцію самого WordPress get_posts(), що зменшує навантаження у порівнянні з аналогами
  • До кожного тегу посилання додаються класи li1 та li2, аби легше було стилізувати список записів
  • Є можливість використовувати кешування
  • Список сортується по даті, а не по ID, тобто, якщо запис був опублікований заднім числом, він буде виводитись як потрібно 🙂

Використання

[php]
<?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_password = ”
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;
}
?>

[/php]

Цей код потрібно вставити у Ваш файл functions.php (що знаходиться у папці з шаблоном).
В самому шаблоні для відображення попердніх записів необхідно вставити слідуючий код:
[php]
<ul>
<?php kama_previous_posts_from_cat (5); ?>
</ul>
// 5 – це кількість посилань, що будуть виводитись
[/php]

Зверніть увагу! Виклик функції буде працювати лише у файлі шаблону, що відповідає за виведення запису (зазвичай, це single.php)

Розширене використання

Для налаштування формату виводу використовуйте наступні шаблони:

  • {comments} – покаже кількість коментарів у статті;
  • {title} – заголовок статті;
  • {date:j.M.Y} – дата у форматі j.M.Y;
  • {a} и {/a} – тег посилання. Відкривається та закривається.

Виклик буде наступним:
[php]
<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>
[/php]

Використання кешування

Кешування буде працювати лише із плагінами кешування, які сумісні з класом WP_Object_Cache. Як приклад, це – WP File Cache та SJ Object Cache.

Виклик функції з використанням кешу наступний:
[php]
<ul>
<?php kama_previous_posts_from_cat (5, ”, 1); ?>
</ul>
// виводить 5 посилань та кешує результат у файл, з наступним відображенням інформацїї з цього файлу. Файл буде створюватись для кожного запису окремий
[/php]

Тег списку

Є також можливість замінити тег списку li на будь-який інший, наприклад div:
[php]
<?php kama_previous_posts_from_cat (5, ”, 0, ‘div’); ?>

// виводить 5 посилань у форматі – <div class=’li1′><a href=’http://посилання’ title=’Заголовок статті’>Заголовок статті</a></div>
[/php]

І на закуску, якщо передати п’ятий параметр як false, то на екрані Ви нічого не побачите :). Функція лише поверне результат для обробки (return).

P.S. Дуже дякую Тимуру за чудову статтю і функцію!
До речі, нижче можна побачити роботу функції “вживу”.

Author

Дмитро Кондрюк в веб-індустрії з 2003 року. В 2009р. заснував проект Український WordPress (що у подальшому став офіційним сайтом команди локалізації WordPress в Україні). З 2010 року засновник і технічний директор проекту Український хостинг для WordPress (WPHost.me) - повноцінного хостинг-сервісу, максимально оптимізованого на використання CMS WordPress.

Коментувати

коментарі 2