Ir directamente al contenido de esta página

Integrar contenido del RSS de WordPress por medio de PHP

Varios de nuestros clientes nos han pedido que en sus páginas aparezcan vínculos a las últimas entradas de sus blogs. Para hacerlo hemos aprovechado los feeds que genera WordPress, y los hemos integrado por medio de PHP.

Los feeds de WordPress

WordPress genera por defecto cuatro feeds:

Especificación URL Permalink
RSS 1.0 http://la-url-del-blog/?feed=rdf
http://la-url-del-blog/feed/rdf/
RSS 0.92 http://la-url-del-blog/?feed=rss
http://la-url-del-blog/feed/rss/
RSS 2.0 http://la-url-del-blog/?feed=rss2
http://la-url-del-blog/feed/rss2/
Atom http://la-url-del-blog/?feed=atom
http://la-url-del-blog/feed/atom/

Como un feed no es más que un documento XML, podemos recorrerlo gracias a las extensiones de DOM de PHP.

El código de PHP

Básicamente lo que hay que hacer es asignar a una variable un nuevo DomDocument en el que cargamos el feed, después sólo hay que obtener una lista de los nodos que contienen la información de las entradas, y por último crear un bucle que extraiga los datos que nos interesan y cree el marcado que queremos mostrar en la página:


<ul>
<?php
  $xml = new DomDocument();
  $xml->load('http://la-url-del-blog/?feed=rss2');
  $raiz = $xml->documentElement;
  $entradas = $raiz->getElementsByTagName('item');
  for($i=0;$i<10;$i++){
    $titulo = $entradas->item($i)->getElementsByTagName('title')->item(0)->nodeValue;
    $vinculo = $entradas->item($i)->getElementsByTagName('link')->item(0)->nodeValue;
    $fecha = $entradas->item($i)->getElementsByTagName('pubDate')->item(0)->nodeValue; 
    $fecha_unix = strtotime($fecha);
    $fecha = strftime("%d/%m/%Y",$fecha_unix);
    echo '<li><a href="'.$vinculo.'">'.$titulo.'</a> '.$fecha.'</li>';
  }
?>
</ul>
	

Vamos a analizar el código por partes:

Si alguien quiere ver un ejemplo de su funcionamiento, puede visitar nuestra página de ConstructoWeb.

¿Y por qué no hacer una petición a la base de datos?

Una pregunta muy inteligente. Sí, podríamos haber abierto una conexión con la base de datos y hacer una petición como (SELECT * FROM wp_posts WHERE post_status="publish" AND post_type="post") ORDER BY post_date_gmt DESC LIMIT 10, pero de cara a los proyectos ya entregados a los clientes nos presenta dos posibles problemas:

Por ello preferimos confiar en un estándar estable.

Esta entrada se publicó el 7 de abril de 2010, se archivó en , y fue etiquetada como , . Autor: Saúl González Fernández. Hay 8 comentarios ›.

Comentarios

  1. Fran dice:

    Muy buenas,

    Veras, acabo de probar el codigo y me esta dando fallos.
    Con el código tal cual (sustituyendo solo por mi feed de wordpress) me dice:
    Parse error: parse error, unexpected T_OBJECT_OPERATOR in /var/www/www/varios/pruebas/prueba.php on line 8

    He probado otras maneras de colocar esa zona de código, pero creo que el problema viene de la linea anterior. Creo que no debe de recoger los elementos de una manera correcta.

    Seguro que el fallo es mío. Si necesitas algún dato más de cómo lo estoy haciendo, dímelo y te lo diré. Me gustaría hacerlo funcionar de manera correcta y saber en que me estoy equivocando.

  2. Por lo general cuando aparece ese mensaje en PHP está complementados con un expecting ‘ ‘ y entre las comillas aparece algún símbolo que se ha omitido, como un paréntesis o un punto y coma.
    ¿Podrías mostrarme la línea 8, que es la que se supone que genera el error?

  3. Ricardo dice:

    ¿Cómo saco el thumbnail?

    $img= $xpath -> evaluate('string(atom:thumbnail)', $e);

  4. Saúl González Fernández dice:

    @Ricardo: Para extraer los contenidos del feed de Atom tienes que registrar su espacio de nombres al principio del script. Explicamos la manera detallada en nuestra entrada sobre cómo integrar contenidos del Atom de Twitter.

  5. David dice:

    Hola, Saúl.

    El código es muy bueno, pero tengo la siguiente pregunta.

    Estoy usando este código en dos sitios web. En el primero funciona correctamente: lo que hago es mostrar los cinco primeros posts en un index (PHP, no wordpress ya que el blog esta en otro directorio y funciona correctamente). Pero cuando trato de usar el mismo código en otro sitio web en PHP no se puede. Mi pregunta es: ¿por qué no puede llamar a los feed en un index al blog? (mismo dominio, pero el blog esta en otro directorio). Lo más raro es que sí puede extraer feeds de otros dominios pero no de sí mismo.

    ¿Qué estará sucediendo? ¿Habrá alguna función de PHP dentro del host desactivada o algo así?

    Espero tu respuesta y muchas gracias.

  6. Saúl González Fernández dice:

    @David: Puede que se deba a la configuración de seguridad de tu hosting. Lo mejor es que pruebes a obtener el feed por medio de cURL. Echa un ojo a esta entrada en la que mostramos un ejemplo práctico.

  7. Niko dice:

    En este código, ¿cómo hago para obtener la imagen del media:content? ¡Saludos!

  8. Saúl González Fernández dice:

    @Niko: Tendrás que definir el espacio de nombres de Atom, y luego emplear las funciones de PHP para recorrer el DOM. Puedes leer una explicación más detallada en nuestra entrada sobre agregar contenidos del Atom de YouTube.

¿Algún comentario?

* Los campos con un asterisco son necesarios

Últimos proyectos

© Digital Icon, S.L., 2007 – 2017