Skip to main content

Mostrar un feed RSS en WordPress

Publicado hace
Actualizado hace
4 minutos de lectura
Advertencia

Este artículo fue escrito en 2011 👴🏼. La mayoría de los consejos aquí no son válidos y no recomiendo usar ninguno de los fragmentos mostrados aquí.

Mantengo este artículo aquí por razones históricas y para recordarme cuánto he mejorado a lo largo de los años.

Solo se hicieron cambios cosméticos a este artículo.

Una de las cosas que me encanta de WordPress es poder hacer prácticamente cualquier cosa, y sus funciones integradas hacen que esto sea aún más fácil. Hace unos días tuve la necesidad de crear una plantilla para obtener y mostrar publicaciones de un feed. A pesar de ser la primera vez que hacía algo así, lo hice funcionar en muy poco tiempo. Además, encontré un par de formas de hacer esto.

Opción 1: WP_Http

La persona que me pidió que hiciera la plantilla me dejó un enlace al blog de Ozh, donde explica cómo usar la clase WP_Http para obtener contenido de sitios externos, una forma simple y bien explicada. Una vez más, hay más de una forma de hacer esto.

Usando la clase

La forma básica (que Ozh explica en su artículo), se hace haciendo una llamada a la clase en sí.

Primero incluimos la clase (desde WP 3.x)

1if( !class_exists( 'WP_Http' ) )
2 include_once( ABSPATH . WPINC. '/class-http.php' );
3

Luego hacemos la llamada y probamos la conexión:

1$request = new WP_Http;
2 $result = $request->request( 'http://feed.url' );
3

Si tiene éxito, entonces $result será un array con los siguientes datos:

  • 'headers': Array con… cabeceras… como "x-powered-by" => "PHP/5.2.1"
  • 'body': El contenido del feed, la cosa que necesitamos. Devuelve HTML sin formato
  • 'response': Array con la respuesta del servidor, necesitamos array('code'=>200, 'message'=>'OK')
  • 'cookies': Array con información de cookies.

Ahora a lo bueno, la implementación:

1function fetchFeed2($strFeedURL) { // Función del feed
2 if( !class_exists( 'WP_Http' ) ) // Clase WP_Http
3 include_once( ABSPATH . WPINC. '/class-http.php' ); // Incluir clase
4
5 $request = new WP_Http;
6 $result = $request->request( $strFeedURL ); // probar conexión
7
8 if ( ! is_wp_error($result) ) { // Sin error
9 if ( ( $result['response']['code'] = 200 ) && ( $result['response']['message'] = "OK" ) ) {
10 return $result['body']; // obtener datos
11 } else {
12 return $result = "";
13 }
14 } else { // error
15 return $result = "";
16 $error_string = $result->get_error_message(); // ¿qué error fue?
17 echo '
18' . $error_string . '; // mostrar error
19 }
20 }
21

Ahora solo tenemos que agregar esto donde queremos que se muestre el feed.

1<?php
2 $strFeedURL = "http://feed.url";
3 echo fetchFeed2($strFeedURL);
4?>
5

Fácil ¿verdad? fuente

Usando funciones

Como mencioné antes, hay más de una forma de usar esta clase, la otra forma es usar las funciones (en lugar de la clase en sí), en este caso wp_remote_get().

Podríamos decir que esta es la forma más rápida de usar la clase, solo necesitamos este código:

1$response = wp_remote_get( 'http://feed.url' );
2if( is_wp_error( $response ) ) { // error
3 echo 'Algo salió mal!';
4 $error_string = $response->get_error_message(); // ¿qué error fue?
5 echo $error_string; // mostrar error
6} else { // Sin error
7 echo $response['body']; // mostrar contenido
8}
9

El problema aquí es que (al menos en mi caso) devolvió el contenido en XML, y no soy realmente bueno con eso, ¿cómo lo convierto en un simple html?

Opción 2: Simplepie

Mi solución final fue usar otro método, afortunadamente ya tenemos Simplepie integrado en WordPress, ahora solo tenemos que llamar a la función fetch_feed().

1<?php
2$rss = fetch_feed('http://feed.url');
3if (!is_wp_error( $rss ) ) : // ¿Se creó el objeto?
4 // ¿Cuántos elementos tenemos? (Máximo 5)
5 $maxitems = $rss->get_item_quantity(5);
6 // Crear un array con elementos comenzando con #0
7 $rss_items = $rss->get_items(0, $maxitems);
8 endif;
9?>
10

Ahora solo tenemos que mostrar los elementos, al igual que un loop de WordPress

1<ul>
2<?php if ($maxitems == 0) echo '<li>No hay elementos.</li>';
3else
4// Recorrer cada elemento del feed y mostrar cada elemento como un hipervínculo.
5foreach ( $rss_items as $item ) : ?>
6<li>
7 <a href='<?php echo esc_url( $item->get_permalink() ); ?>'
8 title='<?php echo 'Publicado '.$item->get_date('j F Y | g:i a'); ?>'>
9 <?php echo esc_html( $item->get_title() ); ?></a>
10</li>
11<?php endforeach; ?>
12</ul>
13

Esta fue sin dudas la forma más fácil y rápida ya que me permite personalizar casi en su totalidad la forma en que se muestran los elementos, el uso es muy similar al loop de WordPress y soporta una serie de etiquetas, cada una listada en la documentación de Simplepie.