Ir directamente al contenido de esta página
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 página de ConstructoWeb.
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.
Somos un pequeño estudio fundado en 2007 por tres amigos y que actualmente cuenta con un nutrido grupo de colaboradores, todos ellos profesionales con entre ocho y once años de experiencia en diversos aspectos del desarrollo y la programación web.
Además, Digital Icon, S.L. (N.I.F.: B84622927) es una empresa inscrita en el Registro Mercantil de Madrid, Tomo 22 436, Libro 0, Folio 20, Sección 8, Hoja M-400861, Inscripción 1, conforme a los artículos 18 del Código de Comercio y 6 del Reglamento del Registro Mercantil.
Si quiere conocer un poco mejor cómo trabajamos, puede descargar una copia del contrato que firmamos con nuestros clientes o seguirnos en Google+:
Cliente: La Fábrica
División: MovilizaWeb
Nuestro trabajo: PHP, HTML5, CSS
Cliente: Ana del Val
División: EidoWeb
Nuestro trabajo: PHP, XHTML, CSS, JavaScript
Cliente: Guiomar González
División: EidoWeb
Nuestro trabajo: PHP, HTML5, CSS, jQuery
© Digital Icon, S.L., 2007 – 2012
Comentarios
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.
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?
¿Algún comentario?