Функція для виведення останніх записів у 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 це кількість записів, що виводяться.

Додаткові можливості функції

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

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *