Функция для вывода последних записей в WordPress
Замена виджету WordPress для вывода последних записей.
Код из этой статьи рабочий, но все же лучше используйте для этих целей стандартную функцию get_posts().
С помощью функции ниже можно быстро настроить вывод списка последних записей. Функцию можно использовать в любых местах шаблона. Например, когда нужно вывести список последних записей из какой-либо категории на главной странице или наоборот, вывести список последних записей из всех категорий, кроме указанных.
Если использовать get_posts(), или query_posts() для вывода записей, то нужно оформлять код через foreach. Для новичков это не всегда удобно. Функция ниже лишена этого недостатка.
Использование функции
Вставляем функцию в файл темы functions.php или в файл, где мы будем выводить последние записи (например, sidebar.php)
/** * Выводит на экрна список последних записей. * * @param integer [$post_num = 5] Количество ссылок * @param string [$format = ''] {avatar} {author}: {date:j.M.Y} - {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:j.M.Y} - дата в формате j.M.Y (11.Апр.2010);
- {a} и {/a} - тег ссылки. Открывается и закрывается.
Вызов будет таким:
<ul> <?php kama_recent_posts (5, '{a}{title}{/a} ? {date:j.M.Y} // {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.