Cómo añadir imágenes en el feed RSS de WordPress

Cómo añadir imágenes en el feed RSS de WordPress

Por mucho que se repita que los feeds RSS ya no se utilizan, que están en peligro o que es algo obsoleto que ha sido sustituido por Twitter, envíos por email (newsletter), Zite, Flipboard o cualquier otro servicio, la verdad es que es una tecnología que sigue tan viva y tan útil como siempre.

WordPress incluye esta función por defecto. No hay que hacer nada para enviar nuestros contenidos por RSS, pero en algunos casos puede ser necesario hacer algunos retoques para asegurarnos de que el contenido que estamos enviando se adapta a nuestras necesidades.

Desde los ajustes de WordPress podemos elegir si queremos incluir en el feed RSS el contenido completo o sólo un resumen. Tal como viene configurado por defecto, el contenido por RSS se envía completo. Para cambiarlo a “Resumen” tenemos que ir a:

Ajustes > Lectura > Mostrar para cada entrada en el feed

Si lo cambiamos de “Texto completo” a “Resumen”, WordPress sólo incluirá:

  • El título de la entrada
  • Resumen automático: las primeras 55 palabras (the_excerpt)
  • Datos de la entrada: autor y fecha

Es decir, si decidimos enviar por RSS sólo un resumen, perderemos las imágenes adjuntas, incluso si se ha añadido una imagen destacada a la entrada.

La manera más lógica y fácil de conseguir que salgan imágenes en el feed es dejarlo en “Texto completo”, pero si necesitamos mostrar el resumen y, al mismo tiempo, una imágen de muestra, tendremos que añadir alguna función adicional a mano (o a través de un plugin, si lo preferimos), a través de the_excerpt_rss.

Así podremos personalizar nuestro contenido y añadir cualquier función, ampliando así sus posibilidades: incluir imágenes de muestra, texto, avisos, opciones para compartir el contenido en redes sociales, publicidad, etc.

Como siempre, hay varias soluciones. La manera más popular, que es la que encontramos en montones de blogs y tutoriales, es esta:

1
2
3
4
5
6
7
8
9
// Función para añadir la imagen destacada al resumen RSS
function mytheme_excerpt_post_thumbnail($content) {
    global $post;
    if ( has_post_thumbnail($post->ID) ) {
        $content = '<div>' . get_the_post_thumbnail($post->ID, 'thumbnail') . '</div>' . $content;
    }
    return $content;
}
add_filter('the_excerpt_rss', 'mytheme_excerpt_post_thumbnail');

Pero esta solución sólo tiene en cuenta la imagen destacada y por tanto, si la plantilla que utilizamos no tiene activada la función “post_thumbnails”, nuestro feed simplemente dejará de funcionar.

Otro problema con el código anterior es que nos obliga a definir una “imagen destacada” (post thumbnail) para cada entrada, pero en realidad, cuando añadimos una imagen ya la estamos asociando a esa entrada en particular, por lo que no hace ninguna falta hacerlo dos veces.

Por tanto, la solución ideal sería la que:

  1. Si la entrada tiene una imagen destacada, la muestra
  2. En caso contrario, muestra la primera (o última) imagen adjunta
  3. Si sigue sin encontrar ninguna imagen, no muestra nada (o muestra una imagen predefinida)

Recuperamos la primera imagen de la entrada

Otras soluciones lo que hacen es utilizar expresiones regulares para identificar las imágenes y adjuntar en el resumen RSS la primera que se encuentra:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Recuperamos la primera imagen de la entrada para el resumen RSS
function mytheme_excerpt_rss_images($content) {
    global $post;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];
    if ( empty($first_img) ) {
        $first_img = "";
    }
    return '<p><img src="'.$first_img.'" /></p>' . $content;
}
add_filter('the_excerpt_rss', 'mytheme_excerpt_rss_images');

Esta solución tiene el inconveniente de que el tamaño de la imagen añadida será el que hayamos incluído en la entrada (probablemente mucho más grande de lo necesario). Además, utiliza expresiones regulares (preg_match_all), que puede ser un poco caro en cuanto a recursos.

Además, no es una solución ideal porque no nos permite definir una imagen destacada que tenga preferencia sobre el resto de fotos incluídas en la entrada.

Recuperamos una miniatura de la imagen destacada o de una adjunta

Lo que más sentido tiene en el resumen que enviamos por RSS es mostrar una miniatura (sea de la imagen destacada o de una adjunta) ya que, al fin y al cabo, se trata de una muestra del contenido.

Por ejemplo, con el siguiente fragmento de código podemos recuperar las imágenes adjuntas a cada entrada y ordenarlas según el criterio que más nos interese, pero solo se activará en caso de que no haya una imagen destacada definida.

De esta manera estamos utilizando la miniatura que WordPress ya ha creado. No es necesario crear otra ni cambiar el tamaño a una más grande, sinó que aprovechamos el trabajo que el gestor de contenidos ya ha hecho por nosotros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Incluimos una imagen de muestra (tamaño miniatura) en el resumen RSS
function mytheme_excerpt_rss_thumbs($content) {
    global $post;
    $args = array(
        'post_type'      => 'attachment', // Seleccionamos adjuntos
        'post_mime_type' => 'image', // Del tipo "imagen"
        'order'          => 'ASC', // Los ordenamos ascendentemente
        'orderby'        => 'menu_order', // Que respete el orden asignado
        'post_parent'    => $post->ID // De la entrada actual
    );
    $images = get_posts($args);
    $style = 'float:right;margin:0 0 20px 20px;'; // Estilos CSS
    // La entrada tiene una imagen destacada.
    if ( has_post_thumbnail($post->ID) ) {
        $content = '<div style="' . $style . '">' . get_the_post_thumbnail($post->ID, 'thumbnail') . '</div>' . $content;
    // No se ha asignado una imagen destacada, asi que adjuntamos
    // la primera que encontramos asociada a la entrada actual.
    } elseif ( $images ) {
        $post_link = get_permalink();
        $content = '<a href="' . $post_link . '" style="' . $style . '">' . wp_get_attachment_image($images[0]->ID, 'thumbnail') . '</a>' . $content;
    }
    return $content;
}
add_filter('the_excerpt_rss', 'mytheme_excerpt_rss_thumbs');

En este caso, damos preferencia a la imagen destacada, pero si no hay ninguna definida, seleccionará una imagen adjunta alternativa.

Además, hemos añadido un poco de estilo para que los lectores RSS muestren la foto a la derecha con el texto flotando alrededor y con algo de margen a los lados.

Si lo preferimos, podemos incluir el código en formato de plugin, para poder activarlo fácilmente y no tener que editar los archivos: Descargar plugin

Este es el código incluido en el plugin:

 

<?php /*
*************************************************************************************
Plugin Name: Custom Feed Thumbnails
Description: A function to display custom thumbnail images in feed excerpts (featured images or attachments). “Summary” has to be selected in Settings > Reading > For each article in a feed show.
Plugin URI: http://www.danielnabil.com/blog/como-anadir-miniaturas-imagen-feed-rss-wordpress/
Version: 1.0
License: GPL
Author: Daniel Nabil
Author URI: http://www.danielnabil.com/
*************************************************************************************/
function dn_excerpt_rss_thumbs($content) {
global $post;
$args = array(
‘post_type’ => ‘attachment’, // Selecting attachments
‘post_mime_type’ => ‘image’, // Only images
‘order’ => ‘ASC’, // Attachments’ order
‘orderby’ => ‘menu_order’, // Order them by
‘post_parent’ => $post->ID // Current post
);
$images = get_posts($args);
$style = ‘float:right;margin:0 0 20px 20px;’; // CSS styles
// The post has a featured image
if ( has_post_thumbnail($post->ID) ) {
$content = ‘<div style=”‘ . $style . ‘”>’ . get_the_post_thumbnail($post->ID, ‘thumbnail’) . ‘</div>’ . $content;
// The post doesn’t have a featured image, so we attach
// the first image associated with current post.
} elseif ( $images ) {
$post_link = get_permalink();
$content = ‘<a href=”‘ . $post_link . ‘” style=”‘ . $style . ‘”>’ . wp_get_attachment_image($images[0]->ID, ‘thumbnail’) . ‘</a>’ . $content;
}
return $content;
}
add_filter( ‘the_excerpt_rss’, ‘dn_excerpt_rss_thumbs’ );
?>
 

Cómo incluir miniaturas de todas las imágenes adjuntas en el resumen RSS

Si la web que estamos personalizando incluye entradas con muchas imágenes grandes o galerías (habitual por ejemplo en webs de fotógrafos o de noticias), en vez de enviar el contenido tal como lo hemos publicado, podemos incluir junto al resumen únicamente las miniaturas, enlazadas a la imagen a tamaño completo o a la misma entrada.

En este caso, en vez de utilizar get_posts para recuperar las imágenes como en el ejemplo anterior, vamos a utilizar get_attached_media, una función introducida en WordPress 3.6 que simplifica este tipo de tareas, permitiéndonos hacer consultas en una solo linea:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Incluimos en el feed RSS miniaturas
// de todas las imagenes adjuntas.
function mytheme_post_gallery_thumbs_feed($content) {
    if ( is_feed() ) {
        global $post;
        $media = get_attached_media( 'image', $post->ID ); // Recuperamos todas las imagenes adjuntas
        $feedthumbs = '';
        if ( $media ) {
            foreach ( $media as $attachment ) {
                $feedthumbs .= wp_get_attachment_image( $attachment->ID, 'thumbnail' );
            }
        }
        $content .= '<div>' . $feedthumbs . '</div>';
    }
    return $content;
}
add_filter('the_excerpt_rss', 'mytheme_post_gallery_thumbs_feed');

Conclusión

Aunque por defecto WordPress sólo incluye la opción de mostrar el contenido completo o un resumen en los feeds RSS, gracias a the_excerpt_rss podemos incluir cualquier función para personalizar el contenido. De la misma manera, si quisiéramos modificar la versión completa del feed, la función que nos interesa es the_content_feed.