Отображение RSS фидов

Дата публикации:Октябрь 1, 2010

RSS фиды полезны не только для слежения за обновлениями сайта, но и для отображения различного контента, разрешенного к онлайн-публикации. Вы, вероятно, уже заметили наличие специального RSS виджета в панели адинистратора. С его помощью можно вывести на экран последние обновления для любого RSS канала. Осуществление работ, связанных с фидами, не сковано в рамки имеющихся плагинов или виджетов. Разработчик может в любое время использовать встроенный парсер фидов для того чтобы вывести в них произвольный материал. Информацию, которую необходимо вывести в фидах, можно всегда обернуть в HTML-код, определив ее стилизацию. Это можно сделать как вручную, так и с помощью специальных плагинов.

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

Ни в коем случае не перегружайте информацией RSS каналы, иначе вы столкнетесь с проблемой длительной загрузки ресурса.

Встроенный парсер

В WordPress существует встроенная поддержка вывода контента, расположенного в RSS фидах. Вы можете использовать для этого RSS виджет, однако он предлагает ограниченный набор возможностей. Начиная с версии 2.8, WordPress включает в себя встроенный RSS парсер, позволяющий значительно расширить границы представления информации в RSS фидах. Этот парсер использует популярную на сегодняшний день библиотеку SimplePie. Несмотря на то, что wp_rss() до сих пор работает, он потерял свою актуальность. Вместо него удобнее использовать fetch_feed(). Ниже мы рассмотрим пример, в котором определяется вывод последних заголовков в RSS фиде:

<ul>
<li><h2>Lifestream</h2></li>
<?php $feed = fetch_feed('http://stream.tdh.me');
foreach ($feed->get_items() as $item){
printf('<li><a href="%s">%s</a></li>', $item->get_permalink(), $item->get_title());
}
?>
</ul>

Немного усложним пример, добавив вывод описаний и даты размещения:

<ul>
<li><h2>Lifestream</h2></li>
<?php $feed = fetch_feed('http://stream.tdh.me');
printf($feed->get_title());
foreach ($feed->get_items() as $item){
printf('<li><a href="%s">%s</a></li>', $item->get_permalink(), $item->get_title());
printf('<p>%s</p>', $item->get_description());
printf('<p><small>%s</small></p>', $item->get_date('j F Y at g:i a'));
}
?>
</ul>

Библиотека SimplePie довольна огромна — она достойна целой книги. Стоит отметить, что библиотека не является полностью совместимой с WordPress. Ее описание можно найти здесь: simplepie.org/wiki/reference/. Мы вернемся к рассмотрению SimplePie немного позже, сейчас же остановим свой взгляд на встроенном виджете для RSS.

Использование встроенного виджета для RSS

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

Практически во всех ситуациях, исключая лишь довольно редкие случаи, ручное редактирование кода RSS парсера не требуется. Использование механизмов парсинга позволяет получить больший контроль над размещением материалов в RSS фидах.

Множественные фиды с помощью SimplePie

С добавлением SimplePie вы получаете возможность создавать множественные фиды, позволяющие смешивать контент из разных RSS каналов и выводить его на экран. В библиотеке SimplePie указанная функциональность называется «мультифидами».

В следующем примере мы возьмем два фида, перечисленные в зависимости от даты, и выведем первые 10 элементов списка:

<ul>
<Li><h2>Interesting Headlines</h2></li>
<?php $feed = fetch_feed( array('http://rss1.smashingmagazine.com/feed/', 'http://feeds.digg.com/
digg/topic/apple/popular.rss'));
$feed->enable_order_by_date(true);
foreach ($feed->get_items(0, 10) as $item){
printf('<li><a href="%s">%s</a></li>', $item->get_permalink(), $item->get_title());
printf('<p><small>%s</small></p>', $item->get_date('j F Y at g:i a'));
}
?>
</ul>

Здесь в пределах fetch_feed() мы задали в виде массива два наших фида. Параметр order_by_date был взят из документации к SimplePie:

$feed->enable_order_by_date(true);

Наконец, в цикле foreach происходит вывод десяти требуемых пунктов.

Update: полезный пример от Ravik для вывода множественных фидов:

function set_feed_url($url)
 {
 if (is_array($url))
 {
 $this->multifeed_url = array();
 foreach ($url as $value)
 {
 $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
 }
 }
 else
 {
 $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
 }
 }

Библиотека SimplePie представляет собой мощный инструмент, позволяющий решать различные проблемы с выводом фидов. Однако, указанная библиотека требует досконального изучения.

Поделиться

29 комментариев

  1. Елена says:

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

    Спасибо за подробную инструкцию.

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

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

    Заранее спасибо. И просьба объяснить понятно "для блондинок" :)

    • Ravik says:

      Здравствуйте! Вставил приведённый в вашей статье код на страницу сайта. Работает, но только не более, чем с двумя RSS-потоками. Есть ли возможность увеличить количество потоков? Ели да, то при помощи какой функции? Заранее благодарю за ответ.

  2. Architect Of Ruin says:

    Вывести в RSS медиа информацию очень просто! Чтобы не ковыряться руками, можно воспользоваться следующим плагином: MediaRSS, ниже ссылка. С его помощью вы сможете вывести аудио, видео, и другие типы медиафайлов в каналах RSS.

    http://wordpress.org/extend/plugins/mrss/

    Приятной Вам работы! :)

  3. Елена says:

    Спасибо за ссылку.

    Скачала и установила плагин, но вот как им пользоваться, не понимаю (( Во-первых, моя цель не вывод медиа в СВОЕЙ ленте, а показ медиа содержимого с другого RSS в виджете, чтобы отображался проигрыватель и название передачи, наподобие, как в моей подписке на эту ленту через google reader.

    Я так поняла, что даже если эта функция доступна, нужно что-то изменить в коде (в коде чего? плагина? виджета? где этот код, в каком файле?) с помощью информации отсюда (какой именно информации?). То есть, где и что менять, я не понимаю.

    Или этот плагин как-то настраивается в админке? Я его там вообще не нашла. Только в списке плагинов, с возможностью активирования, но без настроек.

  4. Architect Of Ruin says:

    Для подкастинга, я слышал, есть отличное средство PodPress:

    http://wordpress.org/extend/plugins/podpress/

    Но сможет ли podpress выводить фиды с другого блога, я не в курсе. Попробуйте, авось поможет. Иногда плагины создают свои собственные виджеты, поэтому не забывайте проверять раздел Виджеты.

    А насчет первого плагина, я думал, вам нужно со своего блога их в RSS загнать.

    И еще посмотрю, что можно сделать при помощи ручного редактирования.

  5. Ravik says:

    Благодарю за ответ. Пример брал с fetch_feed. Посмотрел приведённый вами пример, но не совсем понял понял то, какая именно функция отвечает за вывод множества RSS-адресов. В данный момент в моей ленте выводится RSS с двух сайтов. При вставке в строку fetch_feed( array адреса третьего сайта, добавочный адрес программой игнорируется.

    Посмотреть работы созданной ленты: ravik.lx10.net/lenta

    • Architect Of Ruin says:

      Технически можно передавать в fetch_feed множественные RSS-каналы в виде массива, но разбираться потом в том хаосе, что функция выводит… я лично так и не смог выяснить, как ее спарсить.

  6. Ravik says:

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

    Кстати у вас, похоже, один из немногих ресурсов в сети, где есть вразумительная информация по теме "ручной" настройки парсинга. По крайней мере? мне других работающих схем не встретилось. Вы очень толково выкладываете материал! Желаю продолжать в том же духе! Впш сайт у меня в закладках, буду частым гостем :)

    • Architect Of Ruin says:

      Спасибо большое, но я стараюсь не зацикливаться на одном только WP, стараюсь писать про то, что меня интересует. Сейчас временно интерес к WP заглох…

  7. Ravik says:

    Это понятно. У меня интерес к WP только из-за собственного сайта. Тему пришлось вручную перебирать, менять функционал, чтобы добиться того, что мне от неё нужно. Осталось сделать последний штрих и споткнулся, казалось бы, на элементарной вещи :)

    Был у меня ещё один вопрос по фотогалереям, но на него ответа похоже нет, т. к. не предусмотрено создателями WP. С этим я уже смирился

  8. Architect Of Ruin says:

    Я посмотрел Ваш сайт, довольно интересно сделан, нестандартно по крайней мере. Не все такое оценят, но в плане удобства, я считаю, сделано добротно, без лишней мишуры, рекламы, продающих ссылок и прочего говна, которого хватает в сети.

  9. Ravik says:

    Спасибо за хорошую оценку. Очень много поставил экспериментов, пока добился нужного отображения. Код темы написан крайне странно — одно лишнее движение и всё рушится, приходится искать обходные пути.

    Реклама, если и будет, то один-два тематических постоянных рекламодателя в сайд-баре, не больше. В ближайшем будущем планирую купить доменное имя и переехать на платный хостинг — не хватает процессорной памяти для развёртывания фотогалерей

    • Architect Of Ruin says:

      У меня был раньше опыт сотрудничества с постоянным рекламодателем, и по тематике тоже вроде бы все сходилось, хостинг хватало оплачивать. Но потом решил, что все-таки лучше оставаться независимым и не вешать рекламу. То же самое с социальными иконками. Слишком сильно влияют на загрузку. Разница была видна даже невооруженным глазом. Прибыль мне с сайта не нужна, все держится на собственном энтузиазме. Деньгами меня сложно заинтересовать. Главное, чтобы собственный интерес был. Считаю, что работу и хобби надо разграничивать, иначе не будет ни того, ни другого. Сорри за оффтопик, просто наболело ;)

  10. Ravik says:

    Не за что извиняться — тема рекламы у меня тоже наболевшая. В ЖЖ вёл специализированный рекламный журнал, тоже нахлебался… Потому сейчас крайне осторожен в этом вопросе. Пока вывесил рекламный банер своего друга просто так.

    А излишняя социализация вредна не только тем, что память поедает, но и тем, что отвлекает от основного содержания. Потому решил ограничиться стандартным набором оформления темы, разве что твитты в сайдбар вывел

  11. Architect Of Ruin says:

    А излишняя социализация вредна не только тем, что память поедает, но и тем, что отвлекает от основного содержания.

    С этим полностью согласен. Распространить статью между друзьями можно и без помощи иконок, кнопок и прочего хлама.

  12. Ravik says:

    Полностью согласен. Если вы ведете журнал в ЖЖ, с удовольствием добавлю в друзья. Правда, последнее время крайне мало пишу — много работы + работа над сайтом. Ник в ЖЖ ravik-06

    • Architect Of Ruin says:

      К сожалению, никогда там не сидел… Но зайду с удовольствием посмотрю.

  13. Ravik says:

    В ЖЖ всё то же, что и на сайте — полностью скопировал весь журнал, вместе с комментариями. Переезд уже давно планирую, осталось до конца решить проблему интеграции сайта с ЖЖ и тогда полностью уйду в автономное плаванье :)

  14. Ravik says:

    Сейчас нашёл вычленил из плагина код для множественных фидов. Оказалось действительно просто:

    function set_feed_url($url)

    {

    if (is_array($url))

    {

    $this->multifeed_url = array();

    foreach ($url as $value)

    {

    $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);

    }

    }

    else

    {

    $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);

    }

    }

    Естественно, он вставляется в div после открытия php в вашем втором примере.

    Удалось в ленте настроить показ трёх RSS. С большим числом пока не экспериментировал, времени нет. На его работу можете посмотреть здесь: ravik.lx10.net/lenta. Ещё раз большое спасибо за ваш сайт!

    • Architect Of Ruin says:

      Спасибо Вам!

      Я уверен, что Ваш код поможет кому-нибудь, кто столкнется с такой же проблемой, быстро найти решение.

  15. Ravik says:

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

    • Architect Of Ruin says:

      Пост обновил. Если у кого-то будут сбои, то народ отпишется в комментариях. Вам еще раз спасибо за настойчивость в таких вопросах.

  16. Ravik says:

    У меня идея фикс — создать максимально возможное соединение автономного сайта с ЖЖ. Потому и настойчив. :)

    Посмотрел ещё раз распотрошённый мною плагин и удивился тому, зачем его создатель передаёт часть функцианала уже встроенных в WP функций плагину. В частности, приведённый мной код, как я понял, ссылается в плагине не на инструментарий WP, а на другой собственный файл плагина, который и выступает дублёром…

    • Architect Of Ruin says:

      Как-то раз я участвовал в одном из проектов, там необходимо было доделать сайт на WP, который создавали студенты, так вот: на концепцию WP вообще было плюнуто, все перерыто, переделано, куча дополнительных файлов, которые не используются, гора подключенных библиотек, по сути ненужных. Разбираться в этом хаосе я не стал, потому что понять, что там и как функционирует, было попросту невозможно.

      И да, многие попросту не успевают оставаться в строю: новые версии WP выходят постоянно, в них что-то добавляют, что-то убирают. Знать каждую мельчайшую деталь и разбираться в ней — задача непосильная даже для тех, кто постоянно следит за новыми версиями. Можно сделать на это скидку, все мы люди :)

      Инструментарий WP настолько широк, что охватить его не позволяет даже литература, которая устаревает уже по прошествии месяца. Да и сам Codex, как я считаю, неполноценен; многое в нем дается слишком поверхностно, так что разбираться в хитросплетениях кода подчас приходится самому…

  17. Ravik says:

    Согласен. Об этих аспектах не задумывался

  18. Александр says:

    Добрый день.Как получить фид,у меня ничего не получается,пожалуйста помогите.Все делал по уроку.ввожу адрес своего сайтаНажимаю next.Далее появляется надпись:Идентифицировать источник фида

    URL фида, который ты добавил:

    FeedBurner обнаружил больше одного фида по этому адресу. Пожалуйста, выбери один в качестве истоника:

    Выбираю RSS нажимаю next.Далее появляется надпись:Идентифицировать источник фида

    Назад в Мои фиды

    URL фида, который ты добавил:

    Мы не смогли обнаружить действующего фида по данному адресу. Вот несколько причин произошедшего:

    Фид действует? Проверь это сейчас.

    если ты используешь Blogger, Feed Validator мог назвать фид «устаревшим» и выдать кучу ошибок. Это происходит потому, что Blogger использует более старый формат фидов (Atom 0.3), но это не причина для беспокойства. Узнай больше на форумах FeedBurner.

    Если фид действует, но FeedBurner все равно не может обработать его, дай нам знать.

    Этот пост также можете просмотреть здесь: How did my feed become invalid? на форуме FeedBurner.

    Ты ввел URL веб-страницы или URL фида?

    FeedBurner обычно «автоматически обнаруживает» фид на веб-странице, но в данном случае мы не смогли обнаружить соответствующего фида. Если хочешь, можешь ввести непосредственно URL фида.

    URL написан неверно или не сработало действие копирования/вставки?

    Если это произошло, попробуй еще раз.

    Что только не делал все одно и то же.Имею два ящика на gmaile.

    Спрашивал у знающих людей,сказали Поменяйте тему . В этой нет встроенного фида.Я поменял ,а все одно и тоже,совсем запутался.И как найти именно такую тему?По возможности ответте на почту.Заранее спасибо.

  19. Svetlana says:

    У вас тематика статьи близка к моей проблеме. Нигде не найду инфу как сделать так, чтобы в фидах отображались ссылки, а не набор HTML-кода: http://za-stolom.ru/salat-iz-gribov-so-smetanoy/feed/ ? Недавно зарегилась на бирже по продаже ссылок и там пожелали разместить именно в RSS комментариях. Этот сайтик у меня не задался, Яндекс забанил все внутренние страницы почему-то, даже уникальный контент и фото. Хотелось бы хоть какаю-то копейку с него иметь (((

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.

Предыдущая запись:

Следующая запись: