RSS для ВКонтакте в WordPress: фид, enclosure и почему нет картинок

Импорт 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. Почему ВК «съедает» картинки

  1. Ограничения импорта. RSS во ВКонтакте – побочный канал, правила обработки меняются. HTML внутри description/content:encoded часто режется.
  2. Санитизация HTML. В целях антиспама остаются в основном простые текстовые теги; <img> вычищают.
  3. Ненадёжный enclosure. Опора только на <enclosure> не гарантирует превью в ленте сообщества.
  4. 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. Краткий чеклист

  1. Зарегистрировать feed через add_feed(), сбросить permalinks.
  2. Отдавать полный HTML в content:encoded и thumbnail в enclosure.
  3. Не рассчитывать, что ВК всегда покажет картинки из RSS.
  4. Для продакшена с визуалом – API-автопостинг.

Логика простая: syndication удобна для ридеров и части сервисов; для ВК с картинками чаще выигрывает integration через API.

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


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