Функція для виведення останніх записів у 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='' />"; } $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.