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.
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.
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:
$xml = new DomDocument(): Asignamos a la variable una nueva instancia de DomDocument.$xml->load('http://la-url-del-blog/?feed=rss2'): Cargamos el feed.$raiz = $xml->documentElement: Localizamos el elemento raíz, para que el intérprete de XML comprenda por dónde debe empezar a recorrer el documento (lo que hablando español inexistente se llama parsear).$entradas = $raiz->getElementsByTagName('item'): Asignamos a una variable la lista de nodos, identificados en el caso de RSS 2.0 por la etiqueta <item>; sería la misma para RSS 1.0 y 0.92, y sería <entry> para Atom.for($i=0;$i<10;$i++): Un bucle normal y corriente, limitando el número de ciclos a 10.$titulo = $entradas->item($i)->getElementsBy…: En las tres líneas siguientes asignamos a diversas variables los datos que nos interesan, que son title (título de la entrada), link (el vínculo) y pubDate (la fecha en que se publicó). No son las únicas; por ejemplo, description incluye un resúmen de la entrada.
Hay que recordar que getElementsByTagName siempre devuelve una lista de nodos, incluso cuando sólo consta de un elemento, de ahí que tengamos que emplear ->item(0)->.
$fecha_unix = strtotime($fecha) y $fecha = strftime("%d/%m/%Y",$fecha_unix): Damos formato a la fecha, puesto que WordPress sigue la especificación de RFC822 y por tanto pubDate contiene algo como Wed, 07 Apr 2010 13:30:34 +0200, independientemente del formato que se haya seleccionado en las opciones del blog.echo…: Creamos el marcado.Si alguien quiere ver un ejemplo de su funcionamiento, puede visitar nuestra propia página.
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 a las 12:43, y se archivó en PHP. Autor: Saúl González. Puede seguir los comentarios de esta entrada a través de RSS 2.0. Puede dejar un comentario o hacer un trackback desde su propio sitio.
© Digital Icon, S.L., 2006–2010 | Gracias a la generosidad de WordPress | Diseño del tema: constructoweb