Как добавить изображение в RSS-ленту WordPress без плагина?
Я искал способ добавления изображения записи в RSS-ленту WordPress без использования плагина. Я нашел несколько примеров и применил их согласно инструкциям. Но пока что результата нет. Изображение все еще не отображается.
Последнее и лучшее (на мой взгляд) решение (как указано здесь) которое я нашел - это добавление следующего кода в файл functions.php
текущей темы
function featured_image_in_feed( $content ) {
global $post;
if( is_feed() ) {
if ( has_post_thumbnail( $post->ID ) ){
$output = get_the_post_thumbnail( $post->ID, 'medium', array( 'style' => 'float:right; margin:0 0 10px 10px;' ) );
$content = $output . $content;
}
}
return $content;
}
add_filter( 'the_content', 'featured_image_in_feed' );
Я не заметил никаких изменений. Нужно ли сделать что-то еще?
То, что я хочу сделать - это добавить изображение записи как отдельный элемент в XML. Это было бы удобнее для отображения в моем слайдере.
На основе заметок здесь и множества других прочитанных ресурсов я разработал это решение специально для работы с конвертером RSS в Email от Mailchimp, используя фид из WordPress. Их шаблоны используют расширение <media:content>
для элемента item
, чтобы заполнить макрос изображения. Этот код нужно поместить в functions.php темы.
// Добавляем пространство имен для элемента media:image, используемого ниже
add_filter( 'rss2_ns', function(){
echo 'xmlns:media="http://search.yahoo.com/mrss/"';
});
// Вставляем объект изображения в элемент RSS (см. MB-191)
add_action('rss2_item', function(){
global $post;
if (has_post_thumbnail($post->ID)){
$thumbnail_ID = get_post_thumbnail_id($post->ID);
$thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'medium');
if (is_array($thumbnail)) {
echo '<media:content medium="image" url="' . $thumbnail[0]
. '" width="' . $thumbnail[1] . '" height="' . $thumbnail[2] . '" />';
}
}
});
Размер изображения 'medium' можно заменить на 'thumbnail', если требуется изображение меньшего размера.

Спасибо. Именно то, что нужно, чтобы другие агрегаторы могли найти изображение. Просто добавления тега изображения в контент недостаточно

rss2_ns
— это хук действия. Поэтому вместо add_filter
следует использовать add_action
— https://core.trac.wordpress.org/browser/tags/5.7.1/src/wp-includes/feed-rss2.php#L36

Привет! У меня вопрос. Что нужно вставить в выделенную область? Скриншот --> https://snipboard.io/rn6vWx.jpg

@Jornes оставь эту часть как есть. Почему ты думаешь, что её нужно менять?

Привет, Vick, спасибо за ответ! Я не уверен. Я думал, что ссылка должна быть ссылкой на мой RSS-канал.

Привет @Vick, SEOpress рекомендовал мне игнорировать первую часть. И это работает. Но я заметил некоторые ошибки (выделенные) здесь. Пожалуйста, посмотрите скриншот. -> https://snipboard.io/iDXZBj.jpg
Как мне это исправить?

Вот отличный пример. Как выводить миниатюры записей в лентах WordPress
Вставьте этот код в файл functions.php вашей темы
// вывод миниатюр записей в лентах WordPress
function wcs_post_thumbnails_in_feeds( $content ) {
global $post;
if( has_post_thumbnail( $post->ID ) ) {
$content = '<p>' . get_the_post_thumbnail( $post->ID ) . '</p>' . $content;
}
return $content;
}
add_filter( 'the_excerpt_rss', 'wcs_post_thumbnails_in_feeds' );
add_filter( 'the_content_feed', 'wcs_post_thumbnails_in_feeds' );

Для этого вам нужно изменить шаблон фида. Вот руководство по этому поводу: http://digwp.com/2012/10/customizing-wordpress-feeds/#customize-templates

Что именно вы хотите сделать? Если вы объясните подробнее, возможно, кто-то здесь сможет вам помочь.

Я хочу отображать изображения и заголовки избранных новостей в компоненте карусели Bootstrap. Пытаюсь написать .php файл. Ваша помощь уже достаточно хороша, чтобы решить мою проблему. Спасибо. Я буду извлекать путь к изображению из ключа описания.

@Roberthue Можешь подтвердить, что это работает для ленты постов по категории? /?cat=15&feed=rss2

Я попробовал выбранный ответ и получил действительно большое изображение в своей ленте. Я бы порекомендовал добавить размер изображения в код.
// отображение миниатюр избранных записей в RSS-лентах
function WPGood_rss_thumbs( $content ) {
global $post;
if( has_post_thumbnail( $post->ID ) ) {
$content = '<figure>' . get_the_post_thumbnail( $post->ID, 'thumbnail' ) . '</figure>' . $content;
}
return $content;
}
add_filter( 'the_excerpt_rss', 'WPGood_rss_thumbs' );
add_filter( 'the_content_feed', 'WPGood_rss_thumbs' );
Я использовал 'thumbnail' для своей ленты, но 'medium' может работать лучше для некоторых сайтов.

Я перепробовал все предложенные выше решения, но ничего не сработало. Изображение продолжало добавляться в область описания.
Я нашел это решение на другом сайте, немного модифицировал его, и вуаля — оно заработало.
add_action('rss2_item', function(){
global $post;
if(has_post_thumbnail($post->ID)){
$output = '';
$thumbnail_ID = get_post_thumbnail_id( $post->ID );
$thumbnail = wp_get_attachment_image_src($thumbnail_ID, 'thumbnail');
$output .= '<post-thumbnail>';
$output .= '<url>'. $thumbnail[0] .'</url>';
$output .= '<width>'. $thumbnail[1] .'</width>';
$output .= '<height>'. $thumbnail[2] .'</height>';
$output .= '</post-thumbnail>';
echo $output;
}
});

Вот как я получаю изображения вместе со ссылкой и заголовком записи из внешнего RSS-канала.
<div class="row">
<?php
/*
* Получаем последние записи блога из RSS-канала
* Сортируем записи по дате публикации
* Получаем SRC и ALT атрибуты Featured Image с помощью регулярных выражений
* Цикл повторяется 4 раза для отображения 4 статей
*/
$feed = 'https://www.somewpsite.com/feed/';
$entries = array();
$xml = simplexml_load_file($feed);
$entries = array_merge($entries, $xml->xpath("//item"));
//Сортируем записи по pubDate
usort($entries, function ($feed1, $feed2) {
return strtotime($feed2->pubDate) - strtotime($feed1->pubDate);
});
?>
<?php
$counter = 0;
foreach ($entries as $entry) {
//получаем Featured Image
//Забираем контент записи блога
$blogContent = $entry->description;
//регулярное выражение для поиска атрибутов img
preg_match('/(<img[^>]+>)/i', $blogContent, $matches);
//сохраняем первое изображение в переменную
$featuredImage = $matches[0];
//Получаем атрибут src с помощью регулярного выражения
preg_match('@src="([^"]+)"@', $featuredImage, $getSrc);
//Получаем атрибут alt с помощью регулярного выражения
preg_match('@alt="([^"]+)"@', $featuredImage, $getAlt);
//Сохраняем отфильтрованные атрибуты для их отображения.
$imgAlt = array_pop($getAlt);
$imgSrc = array_pop($getSrc);
// удаляем параметры URL
$url = $entry->link;
$url = strtok($url, '?');
//Устанавливаем счетчик для итерации по 4 элементам и останавливаем цикл.
if ($counter <= 3) { ?>
<div class="col-12 col-sm-12 col-md-6 col-lg-3 col-xl-3">
<div class="imgContainer">
<a href="<?php echo $url ?>">
<img src="<?php echo $imgSrc ?>" alt="<?php echo $imgAlt; ?>" class="img-fluid">
</a>
</div>
<h4>
<a class="blog-entry-link" href="<?php echo $url ?>"><?= $entry->title ?></a>
</h4>
</div>
<?php
$counter++;
} // конец условия счетчика
}// конец цикла ?>
</div>
