Функція для виведення останніх записів у WordPress
Заміна віджету WordPress для виведення останніх записів.
Код із цієї статті робочий, але все ж таки краще використовуйте для цих цілей стандартну функцію get_posts() .
За допомогою функції нижче можна швидко налаштувати виведення списку останніх записів. Функцію можна використовувати у будь-яких місцях шаблону. Наприклад, коли потрібно вивести список останніх записів із будь-якої категорії на головній сторінці або навпаки, вивести список останніх записів із усіх категорій, крім зазначених.
Якщо використовувати query_posts() для виведення записів, потрібно оформляти код через foreach. Для новачків це завжди зручно. Функція нижче позбавлена цього недоліку.
Використання функції
Вставляємо функцію у файл теми functions.php або у файл, де ми виводитимемо останні записи (наприклад, sidebar.php )
/**
* Виводить на екран список останніх записів.
*
* @param integer [$post_num = 5] Кількість посилань
* @param string [$format = ''] {avatar} {author}: {date:jMY} - {a}{title}{/a} ({comments})
* @param string [$cat = ''] Категорії з яких потрібно виводити (5,15) або які потрібно виключити (-5,-15),
* через кому (одночасно включення та виняток не працює (не має сенсу))
* @param string [$list_tag = 'li'] Тег списку
* @param boolean [$echo = true] Виводити на екран або повертати
*
* @return string HTML.
* @version: 0.1.2
*/
function kama_recent_posts( $post_num = 5, $format = '', $cat = '', $list_tag = 'li', $echo = true ){
Global $post, $wpdb;
$cur_postID = $post->ID;
// виключимо посади головного запиту (wp_query)
$IDs = '';
foreach( $GLOBALS['wp_query']->posts as $post ) $IDs .= $post->ID .',';
$AND_NOT_IN = 'AND p.ID NOT IN('.rtrim($IDs, ',').')';
$DISTINCT = $SEL = $JOIN = $AND_category = $AND_taxonomy = '';
if($cat) {
$JOIN = "LEFT JOIN $wpdb->term_relationships rel ON ( p.ID = rel.object_id )
LEFT JOIN $wpdb->term_taxonomy tax ON ( tax.term_taxonomy_id = rel.term_taxonomy_id ) ";
$DISTINCT = "DISTINCT";
$AND_taxonomy = "AND tax.taxonomy = 'category'";
$AND_category = "AND tax.term_id IN ($cat)";
// Перевірка на виключення категорій
if( strpos($cat, '-')!==false )
$AND_category = 'AND tax.term_id NOT IN ('. str_replace('-','', $cat).')';
}
// якщо потрібно показати автора
if( false !== strpos($format, '{author}') ){
$JOIN .= " LEFT JOIN $wpdb->users u ON ( p.post_author = u.ID )";
$SEL = ", u.user_nicename AS author, u.user_email, u.user_url";
// Якщо потрібно показати аватар (gavatar)
if( strpos($format, '{avatar}')!==false )
$av = "<img src='http://www.gravatar.com/avatar/%1$s?s=25' alt='Заміна віджету WordPress для виведення останніх записів або заміна складного коду для вибірки останніх записів' />";
}
$sql = "SELECT $DISTINCT p.ID, post_title, post_date, comment_count, guid, post_author $SEL
FROM $wpdb->posts p $JOIN
WHERE post_type = 'post' AND post_status = 'publish' $AND_category $AND_taxonomy $AND_NOT_IN
ORDER BY post_date DESC LIMIT $post_num";
$results = $wpdb->get_results($sql);
if( ! $results )
return false;
$out = '';
$ x = '';
preg_match( '~{date:(.*?)}~', $format, $date_m );
foreach( $results as $pst ){
$x = ($ x == 'li1')? 'li2': 'li1';
if ( $pst->ID == $cur_postID ) $x .= " current-item ";
$a = '<a href="'. get_permalink($pst->ID) .'" title="'. esc_attr($pst->post_title) .'">';
if($format) {
$avatar = isset($av)? sprintf( $av, md5($pst->user_email) ) : '';
$date = apply_filters('the_time', mysql2date($date_m[1], $pst->post_date));
$Sformat = str_replace( $date_m[0], $date, $format);
$Sformat = str_replace(
array('{title}', '{a}', '{/a}', '{author}', '{comments}', '{avatar}'),
array( esc_html($pst->post_title), $a, '</a>', esc_html($pst->post_author), $pst->comment_count, $avatar ),
$Sformat
);
}
else
$Sformat = $a. esc_html($pst->post_title) .'</a>';
$out .= "n<$list_tag class='$x'>{$Sformat}</$list_tag>";
}
if($echo) echo $out;
return $out;
}
Там, де потрібно вивести останні записи, викликаємо функцію використовуючи наступний код:
<ul> <?php kama_recent_posts (5); ?> </ul> // де, 5 це кількість записів, що виводяться.
Додаткові можливості функції
- Можна налаштувати формат виводу (формат передається у другому параметрі $format = ”);
- Можна, виключити чи навпаки, включити будь-які категорії;
- Можна змінити тег списку (замість списку li використовувати, наприклад, div ).
Для налаштування формату виводу використовуйте:
- {comments} – покаже кількість коментарів у статті;
- {title} – заголовок статті;
- {date:jMY} – дата у форматі jMY (11.квіт.2010);
- {a} та {/a} – тег посилання. Відкривається та закривається.
Виклик буде таким:
<ul>
<?php kama_recent_posts (5, '{a}{title}{/a} ? {date:jMY} // {comments}'); ?>
</ul>
// виведе список у форматі - <li class='li1'><a href='http://посилання' title='Заголовок статті'>Заголовок статті</a> ? дата // кількість коментарів</li>Приклад виключення чи включення будь-яких категорій:
Для виключення категорій у третьому параметрі передаємо ID категорій через кому, зі знаком “мінус” (приклад: -5,-15,-20)
Для виведення записів тільки із зазначених категорій ( ввімкнення категорій ) передаємо в третьому параметрі ID категорій через кому (приклад: 5,15,20)
<ul> <?php kama_recent_posts (5, '', '5,15,20'); ?> </ul> // виведе список останніх записів тільки з категорій, ID яких дорівнюють 5, 15 або 20 <ul> <?php kama_recent_posts (5, '', '-5,-15,-20'); ?> </ul> // виведе список останніх записів з усіх категорій, крім 5, 15 або 20
Так само, як і зазвичай у функціях WordPress, до тегу li додається сласс current-item ( <li class=’li1 current-item’></li> ), якщо ID запису дорівнює ID запису зі списку, тобто. якщо ми переглядаємо один із записів, що знаходяться у списку. Використовуючи цей клас, можна візуально виділити запис у списку через css.