Наткнувшись недавно на ленту Хабра, и открыв прямую ссылку на RSS не в NewsFox, а просто во вкладке, я очень удивился наличию в ленте картинок и прочего HTML-форматирования. Мои-то ленты выглядят так только в ридерах, да на странице FeedBurner, но не в "голом" Firefox.
Естественно, захотелось поковырять ещё и сделать себе так же, и конечно же получилось. Хотя этот твик и может вызвать определённые проблемы, о которых ниже.
Так почему же FF сразу не показывает HTML в RSS WordPress'а? Потому что изначально WP просто не поддерживает HTML в лентах вообще. "Красивый" текст на выходе, а также футер и обрезку поста по тегу <!--more-->
добавляет плагин Ozh' Better Feed.
Но даже после этого, FF не будет отображать форматирование.
Вот пример XML-кода RSS-ленты:
<item> <description><![CDATA[Plain text only]]></description> <content:encoded><![CDATA[Some <b>HTML</b> text]]></content:encoded> ... </item>
(остальные теги внутри
опущены)
Проблема в том, что некоторые ридеры показывают содержимое <description>
игнорируя <content:encoded>
, даже если на самом деле поддерживают этот элемент. В их число и входит всеми нами любимый огнелис.
На самом деле, спецификация RSS 2.0 разрешает HTML в <description>
, если для экранирования запрещённых в XML символов использованы Esc-последовательности.
<content:encoded>
оставлено для совместимости.
Кстати, Mozilla рекомендует делать именно так (как и указано в примере выше).
Такую ленту генерирует по умолчанию WP.
И это правильно. Если вы откроете ленту с лишними тегами в <description>
, в ридере поддерживающем только RSS 1.0, получите вместо нормального текста код.
Хотя сейчас, наверное, таких и нет уже. Непонятно только, почему Firefox так поступает.
Это к слову о проблемах: что предпочесть, красоту или совместимость — решать вам.
В принципе, это проблема FF (и других, которые игнорируют <content:encoded>
), и менять правильное поведение движка несколько нелогично.
Я же у себя решил пофиксить это дело.
Итак, практическая часть, что именно изменить в файлах вордпресса, если вы все-таки решили это сделать.
Твик
В файле wp-includes/feed-rss2.php замените:
44 45 46 47 48 49 50 51 | <?php if (get_option('rss_use_excerpt')) : ?> <description><![CDATA[<?php the_excerpt_rss() ?>]]></description> <?php else : ?> <description><![CDATA[<?php the_excerpt_rss() ?>]]></description> <?php if ( strlen( $post->post_content ) > 0 ) : ?> <content:encoded><![CDATA[<?php the_content() ?>]]></content:encoded> <?php else : ?> <content:encoded><![CDATA[<?php the_excerpt_rss() ?>]]></content:encoded> |
на:
44 45 46 47 48 49 50 51 | <?php if (get_option('rss_use_excerpt')) : ?> <?php else : ?> <?php if ( strlen( $post->post_content ) > 0 ) : ?> <description><![CDATA[<?php the_content() ?>]]></description> <?php else : ?> <description><![CDATA[<?php the_excerpt_rss() ?>]]></description> |
Если вы внимательно прочитали предыдущий текст, то поняли что wp-includes/feed-rss.php трогать НЕ надо.
wp-includes/feed-atom.php и wp-includes/feed-rdf.php тоже можно исправить, хотя формат самих тегов там естественно другой, принцип исправления тот же.
Я этого делать не стал, потому что на FeedBurner отправляется именно RSS2-лента. Думаю, так у большинства.
Результат
До:
и после:
На сегодня всё.
Может придумаю, что ещё улучшить в лентах, тогда расскажу
P.S. уже написав эту статью, я нашёл скрипт, делающий то же самое, но без модификации файлов движка.
Так как использование внешней обработки уже после генерации ленты, по идее, должно замедлить ее открытие, пробовать не стал.