Наткнулся на очередной трюк WordPress. Раньше сам про такое не думал что можно в конце статьи выводить свой или чужой RSS поток, и не просто так списком выводить как все, а по хитрому в несколько колонок (сами зададим во сколько) можно на разных страницах использовать не одинаковое количество колонок.

Оказалось для осуществления такой задачи в WordPress достаточно использовать встроенную функцию fetch_feed() (для работы с внешним каналом) и небольшой магический PHP код. Гибкость решения — радует, можно выводить в любом месте Вашей темы RSS поток стандартными вариантами:

  • 10 ссылок делим на две колонки по 5 ссылок
  • 30 ссылок делим на три колонки по 10 ссылок
  • 30 ссылок делим на пять колонок из 6 ссылок

Наверняка Вы заметили закономерность! Вся заковырка в том, что общее значение отображаемых ссылок RSS потока устанавливать значение нужно устанавливать кратным общему количеству столбцов. Об этом позже, давайте разберемся как получается и создается функция fetch_feed().

Настройка fetch_feed()

Для просмотра RSS потока в несколько колонок используется функция fetch_feed(), которую Вы можете разместить в любом файле Вашей темы, допустим в single.php.

<?php include_once(ABSPATH . WPINC . '/feed.php');
if(function_exists('fetch_feed')) {
	$feed = fetch_feed('http://example.com/feed/'); // feed URL
	if (!is_wp_error($feed)) : $feed->init();
		$feed->set_output_encoding('UTF-8');	// set encoding
		$feed->handle_content_type();		// ensure encoding
		$feed->set_cache_duration(21600);	// six hours in seconds
		$limit = $feed->get_item_quantity(10);	// get 10 feed items
		$items = $feed->get_items(0, $limit);	// set array
	endif;
} ?>

Учтите, что нужно указать следующие моменты:

  • Замените http://example.com/feed/ на свой у меня это http://www.howtomake.com.ua/feed/.
  • Установите время хранения кэша, по умолчанию 6 часов.
  • Установите число элементов канала — должно быть кратным количеству столбцов.

Итак мы уже получили 10 последних постов из RSS потока, теперь, грубо говоря, нужно замутить вывод в несколько колонок — 1, 2, 5 или 10. О других значениях функции fetch_feed() можно узнать в кодексе WordPress.

Настройка array_slice()

Вот и настроили функцию fetch_feed(), но Вас скорее всего заинтересовала последняя строка с переменной $items, которая содержит наш RSS поток. Для отображения Ваших постов в несколько колонок мы будем использовать невероятно полезную функцию array_slice(), которая позволяет извлекать RSS поток кусочками и использовать массив полученных данных. Функция array_slice() принимает такие три основных параметра как входной массив RSS, сколько элементов нужно пропустить и количество отображаемых постов в одной колонке:

array_slice($array, $offset, $length);

Первое значение $array формируется из элементов массива $items, который генерируется из функции fetch_feed(), второе значение $offset — указываем какое количество записей из RSS потока мы пропустим для отображения, и третье значение $lenght — указываем какое количество постов отобразить в колонке. Таким образом, для простоты, скажем, мы хотим показать две колонки в каждой пять статей. Наш код PHP будет выглядеть примерно так:

// display first five feed items
$blocks = array_slice($items, 0, 5); // grab first five items from the array
foreach ($blocks as $block) {
	echo $block->get_title();
	echo $block->get_description();
}

// display next five feed items
$blocks = array_slice($items, 5, 10); // grab next five items from the array
foreach ($blocks as $block) {
	echo $block->get_title();
	echo $block->get_description();
}

Давайте еще создадим три цикла foreach для отображения 30 статей RSS потока в три колонки по 10 в каждой, используя функцию array_slice():

$blocks = array_slice($items, 0, 10); // first column
$blocks = array_slice($items, 10, 20); // second column
$blocks = array_slice($items, 20, 30); // third column

Как видите, ключом, к отображению внешних RSS потоков в несколько столбцов, является настройка функции array_slice() с правильными параметрами $offset и $length.

Отображаем RSS поток

Обратите внимание, что в предыдущем разделе, мы для отображения записей из RSS потока используем следующие теги в каждой колонке:

echo $block->get_title();
echo $block->get_description();

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

<div class="feed-item">
	<h1><a href="<?php echo $block->get_permalink(); ?>"><?php echo $block->get_title(); ?></a></h1>
	<p>
		<?php echo $block->get_date("l, F jS, Y"); ?>
		<?php echo substr($block->get_description(), 0, 200); // limit to 200 characters ?>
		<a href="<?php echo $block->get_permalink(); ?>">Continue reading</a>
	</p>
</div>

Мы создали цикл для постов RSS потока, в котором отобразим следующую информацию:

  • Заголовок поста с ссылкой на пост.
  • Дата публикации поста
  • Описание поста (не больше 200 символов)
  • Ссылка «Читать далее»
  • Каждый новый пост заключен в элемент

Лепим в кучу

Вот, собственно, весь окончательный код для отображения внешнего RSS потока в несколько колонок:

<?php include_once(ABSPATH . WPINC . '/feed.php');
if(function_exists('fetch_feed')) {
	$feed = fetch_feed('http://example.com/feed/');
	if (!is_wp_error($feed)) : $feed->init();
		$feed->set_output_encoding('UTF-8');	// set encoding
		$feed->handle_content_type();		// ensure encoding
		$feed->set_cache_duration(21600);	// six hours in seconds
		$limit = $feed->get_item_quantity(10);	// get 10 feed items
		$items = $feed->get_items(0, $limit);	// set array
	endif;
}

if ($limit == 0) {
	echo '<p>RSS Feed currently unavailable.</p>';
} else {
	// display first five feed items
	$blocks = array_slice($items, 0, 5);
	foreach ($blocks as $block) { ?>
		<div class="feed-item column-one">
			<h1><a href="<?php echo $block->get_permalink(); ?>"><?php echo $block->get_title(); ?></a></h1>
			<p>
				<?php echo $block->get_date("l, F jS, Y"); ?>
				<?php echo substr($block->get_description(), 0, 200); ?>
				<a href="<?php echo $block->get_permalink(); ?>">Continue reading</a>
			</p>
		</div>
	<?php } ?>

	// display next five feed items
	$blocks = array_slice($items, 5, 10);
	foreach ($blocks as $block) { ?>
		<div class="feed-item column-two">
			<h1><a href="<?php echo $block->get_permalink(); ?>"><?php echo $block->get_title(); ?></a></h1>
			<p>
				<?php echo $block->get_date("l, F jS, Y"); ?>
				<?php echo substr($block->get_description(), 0, 200); ?>
				<a href="<?php echo $block->get_permalink(); ?>">Continue reading</a>
			</p>
		</div>
	<?php }
} ?>

Этот код отображает две колонки из пяти элементов RSS канала в каждом. Используя методы, и информацию представленную в данной статье, можно настроить приведенный код для отображения любого числа элементов RSS канала в любом количестве столбцов. Большой плюс этого кода заключается в том, что он работает в практически любом файле темы Вашего шаблона. и напоследок совет: приведенный код лучше использовать за пределами основного цикла loop.

Обратите внимание, что мы также проверяем RSS канал на доступность, прежде чем пытаться что-либо показать. После настройки fetch_feed(), мы вводим следующую логику PHP, которая гарантирует, что пустые теги разметки не будут отображаться в браузере пользователей Вашего ресурса. Проверять всегда полезно:

if ($limit == 0) {
	echo '<p>RSS Feed currently unavailable.</p>';
} else {
	// display first five feed items
	// display next five feed items
}

Заключение

Используя совместно функции fetch_feed() и array_slice() можно отобразить любой RSS поток, любое количество записей из RSS потока в любое количество колонок, что обеспечивает высокую гибкость дизайна Вашего проекта. Удачи.

Добавить комментарий:


Комментарии
  1. Stas

    Не работает, к сожалению. Сам не пойму, почему. Кучу сайтов перелопатил, разные способы пробовал — не выводятся новости и всё…
    patriotizm.org/?cat=799
    там справа «Новости партнёров». Выдаёт ошибку.

  2. JAH

    возможно rss сайтов которые транслируешь на своем блоге заблокированы? в принципе должно работать, хотя на рабочих поектах не пробовал