Как добавить миниатюру записи в отдельный тег RSS?
Я могу добавить миниатюру записи в RSS-ленту следующим образом:
function insertThumbnailRSS($content) {
global $post;
if(has_post_thumbnail($post->ID)){
$content = ''.get_the_post_thumbnail($post->ID, 'thumbnail', array('alt' => get_the_title(), 'title' => get_the_title(), 'style' => 'float:right;')).''.$content;
}
return $content;
}
add_filter('the_excerpt_rss', 'insertThumbnailRSS');
add_filter('the_content_feed', 'insertThumbnailRSS');
Однако, при анализе сгенерированного XML для RSS-ленты, я заметил, что миниатюра добавляется в тег описания XML.
Как я могу вставить миниатюру записи в отдельный тег RSS-ленты, например "image", вместо того чтобы добавлять её в содержимое поста?

Вы можете сделать это, добавив действие к хуку 'rss2_item' следующим образом:
add_action('rss2_item', function(){
global $post;
$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;
});

Развивая отличный ответ codekipple, представляю мою модифицированную реализацию, которая использует допустимый элемент Media RSS media:content
(спецификация) и проверяет наличие миниатюры/изображения записи:
function dn_add_rss_image() {
global $post;
$output = '';
if ( has_post_thumbnail( $post->ID ) ) {
$thumbnail_ID = get_post_thumbnail_id( $post->ID );
$thumbnail = wp_get_attachment_image_src( $thumbnail_ID, 'thumbnail' );
$output .= '<media:content xmlns:media="http://search.yahoo.com/mrss/" medium="image" type="image/jpeg"';
$output .= ' url="'. $thumbnail[0] .'"';
$output .= ' width="'. $thumbnail[1] .'"';
$output .= ' height="'. $thumbnail[2] .'"';
$output .= ' />';
}
echo $output;
}
add_action( 'rss2_item', 'dn_add_rss_image' );
Примечание: Включите атрибут xmlns здесь, чтобы код проходил валидацию. Начальная установка WordPress не включает это объявление пространства имен, и хотя вы можете изменить это, другие темы/плагины также могут это сделать.
Подробнее о других атрибутах и т.д. можно узнать в моем ответе, не специфичном для WordPress.
Это решение интегрируется с созданием RSS-рассылок в MailChimp.

Хороший ответ. Я пробовал плагины для WordPress, которые добавляют изображение в RSS, но на деле они только добавляют его как часть контента. Этот вариант добавляет изображение как отдельный элемент, что даёт больше контроля над вёрсткой при использовании мердж-тегов MailChimp.

Расширяя решения codekipple и D_N, мне понадобилось добавить несколько дополнительных атрибутов в тег media:content
, и вот что я сделал:
function add_media_content_to_feed() {
global $post;
$post_id = $post->ID;
if(!has_post_thumbnail($post)) {
return;
}
$thumbnail_size = 'large';
$thumbnail_id = get_post_thumbnail_id($post_id);
$file = image_get_intermediate_size(get_post_thumbnail_id(), $thumbnail_size);
$url = $file['url'];
$type = $file['mime-type'];
$height = $file['height'];
$width = $file['width'];
$file_size = '';
$path = $file['path'];
if($path && 0 !== strpos($path, '/') && !preg_match('|^.:\\\|', $path) && (($uploads = wp_get_upload_dir()) && false === $uploads['error'])) {
$path = $uploads['basedir']."/$path";
$file_size = filesize($path);
}
echo sprintf(__('<media:content url="%s" type="%s" medium="image" height="%s" width="%s" fileSize="%s" />'),
$url,
$type,
$height,
$width,
$file_size
);
}
add_action('rss2_item', 'add_media_content_to_feed');
В ответе codekipple изображение добавляется в конце содержимого фида. Я же хотел, чтобы изображение было в начале, поэтому реализовал следующее:
function add_featured_image_to_feed($content, $feed_type) {
global $post;
$post_id = $post->ID;
if(has_post_thumbnail($post)) {
$content = '<div class="feed-image">'.get_the_post_thumbnail($post_id, 'large').'</div>'.$content;
}
return $content;
}
add_filter('the_content_feed', 'add_featured_image_to_feed', 10, 9999);
