В современном мире 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. Почему ВКонтакте «забирает» не все картинки?
- Ограничения платформы. Импорт RSS в ВКонтакте — функция, которая периодически меняется. Иногда ВК вовсе отказывается обрабатывать
<img>
теги внутри<description>
или<content:encoded>
. - Фильтрация HTML. Чтобы «бороться со спамом и потенциальными угрозами», ВКонтакте может «вычищать» все HTML‑теги, кроме самых базовых.
- Неактуальность
<enclosure>
. VK в разные периоды истории то обращает, то не обращает внимания на<enclosure>
. - Перекрытие механикой 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. Вывод
- Сгенерировать RSS для ВК — дело несложное (несколько строк кода в
functions.php
). - Вывести полную статью и картинки — тоже реально, используя
<content:encoded>
и<enclosure>
. - Гарантированно увидеть картинки во ВКонтакте? Это либо везение (если ВК в данный момент корректно обрабатывает
<enclosure>
/HTML), либо использование плагинов автопостинга через API.
И здесь приходит инженерная логика: если что‑то не работает через «Syndication», попробуй «Integration». Иногда это надёжнее, чем надеяться на благосклонность ВК.
Новогодний юмор (и пожелания)
А теперь, уважаемые коллеги, переведёмся с инженерного языка на человеческий! Подходит к концу год, насыщенный кодом, интеграциями и дебагом.
Пусть ваши логи исключительно радуют глазами зелёными строчками об успешном выполнении, а error_log
светится лишь праздничными гирляндами, а не ошибками!
Желаем вам в новом году:
- Поменьше багов, а если они и появятся — пусть чинятся легко, как
wp_reset_postdata()
. - Чтобы серверные задачи решались «по щучьему велению», а клиенты выстраивались к вам в очередь, словно в очередь к символу года за подарками.
- И, конечно же, ярких свершений, инновационных проектов и стабильного хостинга без 502‑х ответов!
С наступающим Новым годом!
Пусть ваша лента RSS будет полна интересных новостей, а ВКонтакте — красивыми картинками ваших постов!