Как заставить WordPress отображать полный текст в RSS-каналах

В RSS 2.0 элемент <description> описан размыто: кто-то кладёт туда анонс, кто-то полный HTML. WordPress по умолчанию часто отдаёт excerpt в description, а полный текст — в content:encoded (если он вообще включён). Часть ридеров и агрегаторов смотрит только description и показывает «обрезанный» пост.

Ниже — как заставить RSS отдавать полный текст. Сначала безопасные варианты без правки ядра, затем классический хак файлов feed (с оговорками).

Без правки ядра (предпочтительно)

  1. Настройки → Чтение: для ленты выберите «Полный текст», а не «Анонс». Это включает опцию rss_use_excerpt = 0.
  2. Если тема или плагин всё равно режет вывод, добавьте фильтр в child theme / mu-plugin:
// Полный контент в RSS вместо excerpt
add_filter( 'option_rss_use_excerpt', '__return_false' );

// На крайний случай - подменить the_content_feed
add_filter( 'the_content_feed', function ( $content ) {
	global $post;
	if ( $post instanceof WP_Post ) {
		return apply_filters( 'the_content', $post->post_content );
	}
	return $content;
} );

Так вы не трогаете wp-includes и не потеряете правки при обновлении WordPress.

Правка feed-rss2.php (не рекомендуется на проде)

Исторический способ: открыть wp-includes/feed-rss2.php и заменить блок с rss_use_excerpt.

Было (упрощённо, логика ядра):

<?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_feed( 'rss2' ); ?>]]></content:encoded>
	<?php else : ?>
		<content:encoded><![CDATA[<?php the_excerpt_rss(); ?>]]></content:encoded>
	<?php endif; ?>
<?php endif; ?>

Стало — полный текст сразу в description:

<?php if ( get_option( 'rss_use_excerpt' ) ) : ?>
	<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>
<?php else : ?>
	<description><![CDATA[<?php the_content_feed( 'rss2' ); ?>]]></description>
<?php endif; ?>

Минусы: правка слетит при обновлении WP, возможны конфликты с плагинами ленты, в description окажется весь HTML поста (тяжёлая лента, риск для слабых ридеров).

Комментарии в RSS

Аналогично для комментариев: файл wp-includes/feed-rss2-comments.php. Идея та же — в description отдавать полный текст комментария (или форму пароля для закрытых постов), а не урезанный вариант.

Было (упрощённо):

<?php if ( post_password_required( $comment_post ) ) : ?>
	<description><?php echo ent2ncr( __( 'Protected Comments: Please enter your password to view comments.' ) ); ?></description>
	<content:encoded><![CDATA[<?php echo get_the_password_form(); ?>]]></content:encoded>
<?php else : ?>
	<description><?php comment_text_rss(); ?></description>
	<content:encoded><![CDATA[<?php comment_text(); ?>]]></content:encoded>
<?php endif; ?>

Стало:

<?php if ( post_password_required( $comment_post ) ) : ?>
	<description><![CDATA[<?php echo get_the_password_form(); ?>]]></description>
<?php else : ?>
	<description><![CDATA[<?php comment_text(); ?>]]></description>
<?php endif; ?>

Снова: лучше не править ядро. Для комментариев чаще достаточно настроек обсуждения и фильтров темы/плагина RSS.

Что проверить после изменений

  • откройте https://ваш-сайт/feed/ и посмотрите тело item: в description / content:encoded должен быть полный HTML;
  • сбросьте кэш (плагин кэша, CDN, object cache) — лента часто кэшируется отдельно;
  • убедитесь, что не отдаёте в публичный RSS черновики, private и парольные посты.

Источники и ссылки


Комментарии загружаются…