В RSS 2.0 элемент <description> описан размыто: кто-то кладёт туда анонс, кто-то полный HTML. WordPress по умолчанию часто отдаёт excerpt в description, а полный текст — в content:encoded (если он вообще включён). Часть ридеров и агрегаторов смотрит только description и показывает «обрезанный» пост.
Ниже — как заставить RSS отдавать полный текст. Сначала безопасные варианты без правки ядра, затем классический хак файлов feed (с оговорками).
Без правки ядра (предпочтительно)
- Настройки → Чтение: для ленты выберите «Полный текст», а не «Анонс». Это включает опцию
rss_use_excerpt = 0. - Если тема или плагин всё равно режет вывод, добавьте фильтр в 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 и парольные посты.