Импорт RSS во ВКонтакте выглядит просто: отдал URL ленты, и посты сами появляются в сообществе. На практике текст часто доезжает, а картинки – нет. Ниже: как в WordPress сделать отдельный фид под ВК, как отдать полный HTML и enclosure, и почему ВК всё равно может выкинуть изображения.
1. Свой RSS-фид в WordPress
1.1. Регистрация фида
Стандартный /feed/ отдаёт обычные посты. Если нужны кастомные типы (например project) или отдельный URL вроде /feed/vkontakte/, регистрируют новый feed. В functions.php или в небольшом плагине:
add_action('init', 'krvshn_add_vkontakte_feed');
function krvshn_add_vkontakte_feed() {
add_feed('vkontakte', 'krvshn_render_vkontakte_feed');
}
После сброса rewrite-правил (Настройки → Постоянные ссылки → «Сохранить») лента будет доступна по /feed/vkontakte/. Вывод рисует callback krvshn_render_vkontakte_feed().
1.2. Генерация XML
Дальше – выборка постов и каркас RSS 2.0:
function krvshn_render_vkontakte_feed() {
$args = array(
'post_type' => array('post', 'project'),
'posts_per_page' => 10,
'post_status' => 'publish',
);
$feed_query = new WP_Query($args);
header('Content-Type: application/rss+xml; charset=' . get_option('blog_charset'), true);
echo '' . "\n";
?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title><?php bloginfo_rss('name'); ?></title>
<link><?php bloginfo_rss('url'); ?></link>
<description><?php bloginfo_rss('description'); ?></description>
<language><?php bloginfo_rss('language'); ?></language>
<?php if ($feed_query->have_posts()): ?>
<?php while ($feed_query->have_posts()): $feed_query->the_post(); ?>
<item>
<title><![CDATA[<?php the_title_rss(); ?>]]></title>
<link><?php the_permalink_rss(); ?></link>
<pubDate><?php echo get_the_date(DATE_RSS); ?></pubDate>
<guid isPermaLink="false"><?php the_guid(); ?></guid>
<description><![CDATA[
<?php the_excerpt_rss(); ?>
]]></description>
</item>
<?php endwhile; wp_reset_postdata(); ?>
<?php endif; ?>
</channel>
</rss>
<?php
}
Так получается лента из 10 последних записей типов post и project. Полный текст и картинки в этом каркасе ещё не отдаются.
2. Полный контент и изображения
2.1. Тег content:encoded
Чтобы в item попала вся статья, в канал добавляют namespace content и внутри item – блок content:encoded:
<content:encoded><![CDATA[
<?php
$content = get_the_content();
$content = apply_filters('the_content', $content);
echo $content;
?>
]]></content:encoded>
Ридеры и часть соцсетей (часто Telegram) могут забрать HTML целиком. ВКонтакте ведёт себя жёстче.
2.2. enclosure для обложки
Даже если <img> есть в content:encoded, ВК нередко вычищает HTML и оставляет текст. Имеет смысл явно отдать featured image через <enclosure>:
if (has_post_thumbnail()) {
$thumbnail_id = get_post_thumbnail_id();
$thumbnail_url = wp_get_attachment_image_url($thumbnail_id, 'full');
$mime_type = get_post_mime_type($thumbnail_id);
$file_path = get_attached_file($thumbnail_id);
$file_size = $file_path && file_exists($file_path) ? filesize($file_path) : 0;
?>
<enclosure url="<?php echo esc_url($thumbnail_url); ?>"
length="<?php echo intval($file_size); ?>"
type="<?php echo esc_attr($mime_type); ?>" />
<?php
}
Многие RSS-клиенты и часть импортеров берут enclosure как превью. У ВК это работает нестабильно: в разные периоды enclosure и media:content то учитываются, то игнорируются.
3. Почему ВК «съедает» картинки
- Ограничения импорта. RSS во ВКонтакте – побочный канал, правила обработки меняются. HTML внутри
description/content:encodedчасто режется. - Санитизация HTML. В целях антиспама остаются в основном простые текстовые теги;
<img>вычищают. - Ненадёжный enclosure. Опора только на
<enclosure>не гарантирует превью в ленте сообщества. - Open Graph – другой путь. При ручной вставке ссылки ВК смотрит
og:image,og:title,og:description. При RSS-импорте парсер часто берёт только XML ленты и OG не трогает.
4. Альтернатива: автопостинг через API
Если нужны стабильные обложки и нормальный вид поста, надёжнее не RSS, а публикация через API ВКонтакте (плагин или свой скрипт). Из популярных направлений: Social Networks Auto-Poster, Blog2Social, Jetpack Social и аналоги – они отдают пост с вложениями напрямую, а не надеются на парсер ленты.
Плюсы API-пути:
- явное прикрепление фото/обложки;
- контроль текста, ссылок и формата;
- отложенная публикация в части плагинов.
Минус: нужна авторизация приложения ВК или сервис-посредник, плюс аккуратность с токенами. Зато предсказуемее, чем «а вдруг RSS снова начнёт тащить img».
5. Краткий чеклист
- Зарегистрировать feed через
add_feed(), сбросить permalinks. - Отдавать полный HTML в
content:encodedи thumbnail вenclosure. - Не рассчитывать, что ВК всегда покажет картинки из RSS.
- Для продакшена с визуалом – API-автопостинг.
Логика простая: syndication удобна для ридеров и части сервисов; для ВК с картинками чаще выигрывает integration через API.


