Shumaher’s_Blog@AlexZ.me

— yet another stupid personal weblog

HTML-код в RSS и Firefox

RSSНаткнувшись недавно на ленту Хабра, и открыв прямую ссылку на 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-лента. Думаю, так у большинства.

Результат

До:

RSS: до

RSS: до

и после:

RSS: после

RSS: после



На сегодня всё.
Может придумаю, что ещё улучшить в лентах, тогда расскажу :-)

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

VN:F [1.9.17_1161]
Rating: 0.0/5 (0 votes cast)
Оставьте свой комментарий




OpenID Mail.Ru Flickr Blogger WordPress.com Technorati Verisign AOL

Вы можете использовать следующие теги: <a href="" title=""> <abbr title="">
<acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime="">
<em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Это не спам.

Subscribe without commenting