WordPress как на ладони
wordpress jino

Функция для вывода последних записей в WordPress

Замена виджету WordPress для вывода последних записей или замена сложного кода для выборки последних записей.

Выборка последних записей в WordPress производится не лучшим образом, а именно выбираются все значения строки в таблице wp_posts для каждой записи, хотя необходимо взять всего несколько значений. Так же, если выводить последние записи через виджет, то их практически невозможно настроить, а иногда это нужно.

Я к виджетам отношусь очень негативно - они ограничены, поэтому, по возможности вообще не использую виджеты, даже когда делаю что-нибудь на заказ.

На основе вышеизложенного предлагаю вашему вниманию, еще одну функцию - Вывод последних записей в WordPress. С её помощью можно более гибко настроить вывод, если вы хоть немного разбираетесь в хтмл и css. Так же, можно использовать эту функцию в любых местах шаблона. Например, предположим, нам нужно вывести список последних записей из какой-либо категории на главной странице или наоборот, вывести список последних записей из всех категорий, кроме некоторых.

Для этих целей эта функция подойдет как-нельзя лучше, потому что обычно, для этого используется функция WordPress get_posts(), или вывод оформляется через query_posts(), с последующим оформлением формата вывода, через foreach. Для новичков это не всегда удобно.

Использование функции - последние записи в WordPress

Вставляем нижеследующую функцию в файл темы 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 $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 = '';
	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 = $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->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 это количество выводимых записей.

Дополнительные возможности функции

  1. Можно настроить формат вывода (формат передается во втором параметре $format = '');
  2. Можно, исключить или наоборот, включить какие-либо категории;
  3. Можно изменить тег списка (вместо 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.

Функция для вывода последних записей в WordPress 165 комментариев
Полезные 2 Вопросы 2 Все
  • Максим @

    Тимур хочу для последних записей задать стили, но мои изменения никак не реагируют:
    .li1{background-color: #666666;}
    .li2{background-color: #336699;}
    Что я делаю не так?

    Ответитьмесяц назад #
  • Nick

    Сыпятся ошибки дебаг показывает на след строки

    $IDs .= $post->ID .',';
    
    $sql = "SELECT $DISTINCT p.ID, post_title, post_date, comment_count, guid $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";
    
    $x == 'li1' ? $x = 'li2' : $x = 'li1';
    
    $out .= "\n<$list_tag class='$x'>{$Sformat}</$list_tag>";
    

    Для вывода использую параметры <?php kama_recent_posts (6, '', '4'); ?>

    1
    Ответить16 дней назад #
    • Kama4662

      Подправил спасибо! Теперь заметок быть не должно.

      Ответить15 дней назад #
      • Nick

        Теперь выводит только одну запись из рубрики, вместо 6 указанных smile

        1
        Ответить15 дней назад #
      • Nick

        Хотя в предыдущей версии всё выводилось, но в логах были ошибки.

        Ответить15 дней назад #
      • Nick

        Не удалось еще исправить?

        Ответить14 дней назад #

Здравствуйте, !

Ваш комментарий