Оглавление

В современном мире IT‑специалисты, блогеры и просто энтузиасты стремятся максимально автоматизировать рутину. Одним из таких «автоматизированных» инструментов является импорт ленты RSS в ВКонтакте. Казалось бы, всё просто: настроили RSS (Really Simple Syndication) на сайте — и ВК будет брать оттуда записи. Но на практике всё оказывается далеко не так гладко, особенно когда речь заходит об изображениях.

В этой статье мы разберём, как создать кастомный RSS‑фид в WordPress, почему картинки иногда не доходят до ВК и что можно сделать, чтобы максимально увеличить шансы на отображение изображений.


1. Создание собственного RSS‑фида в WordPress

1.1. Регистрируем новый фид

По умолчанию WordPress генерирует стандартный фид /feed/ для постов. Но если вы хотите включить туда и записи из кастомного пост‑типа (например, project), или выдать их не в стандартную ленту, а в отдельную /feed/vkontakte/, нужно зарегистрировать новый RSS‑канал. Для этого в functions.php (или своём плагине) пишем:

add_action('init', 'krvshn_add_vkontakte_feed');
function krvshn_add_vkontakte_feed() {
    add_feed('vkontakte', 'krvshn_render_vkontakte_feed');
}

Здесь мы говорим WordPress: «Привет, теперь у нас есть фид, доступный по адресу /feed/vkontakte/. Управлять выводом в нём будет функция krvshn_render_vkontakte_feed()».

1.2. Генерируем контент фида

Во второй части кода мы задаём, какие посты (и сколько) следует выводить, и как должна выглядеть структура XML. Например:

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 '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?>' . "\n";
    ?>
<rss version="2.0">
  <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 последними записями из обоих типов контента (стандартный пост и project). Но пока ничего не сказано про полные тексты и изображения.


2. Выводим полный контент и изображения

2.1. Используем тег <content:encoded>

Чтобы в RSS действительно попадала вся статья, принято использовать тег <content:encoded> из пространства имён content:. Вот пример фрагмента кода:

<content:encoded><![CDATA[
<?php
    $content = get_the_content();
    $content = apply_filters('the_content', $content);
    echo $content;
?>
]]></content:encoded>

Так RSS‑ридеры и некоторые соцсети (например, Telegram) могут подтянуть весь HTML без обрезки.

2.2. Проблемы с импортом изображений во ВКонтакте

ВКонтакте, к сожалению, не всегда показывает изображение внутри текста поста, даже если оно есть в content:encoded. Иногда оно полностью игнорирует HTML (особенно теги <img>) и выводит лишь «голый» текст. Порой соцсеть может попытаться найти <enclosure> или <media:content> и вывести картинку‑превью, но и это бывает ненадёжно: алгоритмы ВК могут меняться, а изображения — «пропадать по дороге».

Наиболее «правильный» способ подсказать RSS‑агрегаторам, что изображение — это обложка записи, — использовать тег <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> как «подсказку» для вывода обложки или карточки поста. Но ВК, увы, не всегда это учитывает при импортировании.


3. Почему ВКонтакте «забирает» не все картинки?

  1. Ограничения платформы. Импорт RSS в ВКонтакте — функция, которая периодически меняется. Иногда ВК вовсе отказывается обрабатывать <img> теги внутри <description> или <content:encoded>.
  2. Фильтрация HTML. Чтобы «бороться со спамом и потенциальными угрозами», ВКонтакте может «вычищать» все HTML‑теги, кроме самых базовых.
  3. Неактуальность <enclosure>. VK в разные периоды истории то обращает, то не обращает внимания на <enclosure>.
  4. Перекрытие механикой Open Graph. Когда мы вручную публикуем ссылку в ВК, соцсеть смотрит на meta‑теги og:image, og:description, og:title. Но при автоматическом RSS‑импорте она может проигнорировать Open Graph и брать данные напрямую из ленты (где часто «не видит» картинки).

4. Альтернативы: автопостинг через API

Если вам принципиально важно, чтобы в постах ВК отображалась миниатюра и полный текст с изображениями, лучше отказаться от простого RSS‑импорта и перейти на автопостинг через API. Есть плагины (например, NextScripts: Social Networks Auto‑Poster, Blog2Social, Jetpack Social и другие), которые напрямую отправляют пост из WordPress в ВК со всей нужной разметкой.

Преимущества:

  • Гарантированное прикрепление обложки и/или изображений.
  • Возможность кастомизировать текст, ссылки и прочие поля при публикации.
  • Поддержка отсроченной публикации.

Недостаток — такая интеграция требует настроек и авторизации через приложение ВКонтакте или через сервис‑посредник. Но результат обычно лучше, чем «сырые» RSS‑импорты.


5. Вывод

  1. Сгенерировать RSS для ВК — дело несложное (несколько строк кода в functions.php).
  2. Вывести полную статью и картинки — тоже реально, используя <content:encoded> и <enclosure>.
  3. Гарантированно увидеть картинки во ВКонтакте? Это либо везение (если ВК в данный момент корректно обрабатывает <enclosure>/HTML), либо использование плагинов автопостинга через API.

И здесь приходит инженерная логика: если что‑то не работает через «Syndication», попробуй «Integration». Иногда это надёжнее, чем надеяться на благосклонность ВК.


Новогодний юмор (и пожелания)

А теперь, уважаемые коллеги, переведёмся с инженерного языка на человеческий! Подходит к концу год, насыщенный кодом, интеграциями и дебагом.
Пусть ваши логи исключительно радуют глазами зелёными строчками об успешном выполнении, а error_log светится лишь праздничными гирляндами, а не ошибками!

Желаем вам в новом году:

  • Поменьше багов, а если они и появятся — пусть чинятся легко, как wp_reset_postdata().
  • Чтобы серверные задачи решались «по щучьему велению», а клиенты выстраивались к вам в очередь, словно в очередь к символу года за подарками.
  • И, конечно же, ярких свершений, инновационных проектов и стабильного хостинга без 502‑х ответов!

С наступающим Новым годом!
Пусть ваша лента RSS будет полна интересных новостей, а ВКонтакте — красивыми картинками ваших постов!