Наткнулся на очередной трюк 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 потока в любое количество колонок, что обеспечивает высокую гибкость дизайна Вашего проекта. Удачи.
возможно rss сайтов которые транслируешь на своем блоге заблокированы? в принципе должно работать, хотя на рабочих поектах не пробовал
Не работает, к сожалению. Сам не пойму, почему. Кучу сайтов перелопатил, разные способы пробовал — не выводятся новости и всё…
patriotizm.org/?cat=799
там справа «Новости партнёров». Выдаёт ошибку.