Cómo Agregar Imágenes al Feed RSS de WordPress sin Plugins
He buscado cómo agregar imágenes destacadas al feed RSS sin plugins para WordPress. He encontrado algunos ejemplos y los he aplicado según las instrucciones. Pero hasta ahora no he conseguido nada. Todavía no puedo mostrar la imagen.
La última y mejor solución (en mi opinión) que he encontrado (como se menciona aquí) es agregar el siguiente código al archivo functions.php
del tema actual
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' );
No he visto ningún cambio. ¿Hay algo más que deba hacerse?
Lo que quiero hacer es agregar la imagen destacada como otra clave en el XML. Sería más fácil mostrarla en mi slider.
Basándome en las notas aquí y muchos otros recursos que leí, llegué a esta solución específicamente para trabajar con el convertidor RSS a Email de Mailchimp con el feed de Wordpress. Sus plantillas usan la extensión <media:content>
para el elemento item
para poblar su macro de imagen. Este código va en el functions.php del tema.
// Agregar namespace para el elemento media:image usado abajo
add_filter( 'rss2_ns', function(){
echo 'xmlns:media="http://search.yahoo.com/mrss/"';
});
// insertar el objeto de imagen en el item RSS (ver 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] . '" />';
}
}
});
La elección del tamaño de imagen 'medium' también puede ser 'thumbnail' si se desea una más pequeña.

Gracias. Justo lo que necesitaba para que otros agregadores puedan encontrar una imagen. Simplemente añadir una etiqueta de imagen al contenido no es suficiente

rss2_ns
es un hook de acción. Así que en lugar de add_filter
debería ser add_action
- https://core.trac.wordpress.org/browser/tags/5.7.1/src/wp-includes/feed-rss2.php#L36

¡Hola! Tengo una pregunta. ¿Qué debería insertar en el área resaltada? Captura de pantalla --> https://snipboard.io/rn6vWx.jpg

@Jornes deja ese fragmento como está. ¿Por qué crees que necesitas cambiarlo?

¡Hola Vick, gracias por tu respuesta! No estoy seguro. Pensé que el enlace debería ser el enlace para mi feed RSS.

Hola @Vick, SEOpress me recomendó ignorar la primera parte. Y funciona. Pero noté algunos errores (resaltados) aquí. Por favor, consulta la captura de pantalla. -> https://snipboard.io/iDXZBj.jpg
¿Cómo puedo solucionarlo?

Aquí tienes un gran ejemplo. Cómo mostrar miniaturas de posts destacados en los feeds de WordPress
Pega este fragmento de código en el archivo functions.php de tu tema
// mostrar miniaturas de posts destacados en los feeds de 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' );

Para eso tendrás que modificar la plantilla del Feed. Aquí hay un tutorial para eso. http://digwp.com/2012/10/customizing-wordpress-feeds/#customize-templates

¿Qué es exactamente lo que quieres hacer? Si puedes explicar más, tal vez alguien aquí pueda ayudarte.

Quiero mostrar las imágenes y títulos de noticias destacadas en un componente carrusel de Bootstrap. Estoy intentando escribir un archivo .php. Y tu ayuda es más que suficiente para resolver mi problema. Gracias. Extraeré la ruta de la imagen de la clave de descripción.

@Roberthue ¿Puedes confirmar que esto funciona para el feed de publicaciones por categoría? /?cat=15&feed=rss2

Probé la respuesta seleccionada y obtuve una imagen realmente grande en mi feed. Recomendaría agregar un tamaño de imagen al código.
// mostrar miniaturas de posts destacados en feeds 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' );
Usé 'thumbnail' para mi feed, pero 'medium' podría funcionar mejor para algunos sitios.

Probé las respuestas anteriores y no pude hacer que funcionara. Seguía añadiendo mi imagen en el área de descripción.
Encontré esto en otro sitio, lo modifiqué un poco y ¡voilá! comenzó a funcionar.
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;
}
});

Aquí te muestro cómo obtengo las imágenes junto con el enlace y el título de la publicación, desde un feed RSS externo.
<div class="row">
<?php
/*
* Obtener las últimas entradas del blog desde un feed RSS
* Ordenar las entradas por fecha de publicación
* Obtener los atributos SRC y ALT de la imagen destacada usando expresiones regulares
* Repetir el bucle 4 veces para mostrar 4 artículos
*/
$feed = 'https://www.somewpsite.com/feed/';
$entries = array();
$xml = simplexml_load_file($feed);
$entries = array_merge($entries, $xml->xpath("//item"));
//Ordenar entradas del feed por pubDate
usort($entries, function ($feed1, $feed2) {
return strtotime($feed2->pubDate) - strtotime($feed1->pubDate);
});
?>
<?php
$counter = 0;
foreach ($entries as $entry) {
//obtener imagen destacada
//Obtener contenido de la entrada del blog
$blogContent = $entry->description;
//expresión regular para encontrar atributo img
preg_match('/(<img[^>]+>)/i', $blogContent, $matches);
//almacenar la primera img en variable
$featuredImage = $matches[0];
//Obtener atributo src con regexp
preg_match('@src="([^"]+)"@', $featuredImage, $getSrc);
//Obtener atributo alt con regexp
preg_match('@alt="([^"]+)"@', $featuredImage, $getAlt);
//Almacenar los atributos filtrados para mostrarlos.
$imgAlt = array_pop($getAlt);
$imgSrc = array_pop($getSrc);
// eliminar parámetros de URL
$url = $entry->link;
$url = strtok($url, '?');
//Configurar contador para iterar sobre 4 elementos y luego detener el bucle.
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++;
} // fin condición contador
}// fin bucle foreach ?>
</div>
