Generando feed RSS de noticias en PHP

Cómo crear un sistema RSS en PHP para publicar la información de las novedades o noticias de nuestro sitio web o blog.
Muchas veces nos hemos preguntado como generar feed RSS para nuestros blogs o sistema de noticias. Al igual que muchos, yo pensaba que era una tarea más que dura, pero con observación y un poco de ingenio todo se puede. A continuación explicaré una de las formas de generar RSS para nuestros sistemas. Necesitaremos que nuestras noticias se recojan de una base de datos.

El XML a veces es complejo de entender, para mi aún lo es, pero como dije: Con ingenio todo es posible. Lo primero es saber: ¿Qué etiquetas ocupan las distintas versiones de RSS?, pues fácil, nos vamos a algún sitio que genere dichos RSS, por ejempo, un Blog y miramos el código fuente de dicho RSS. Ya tenemos aproximadamente el 90% del "trabajo" hecho, solo falta el código de nuestro documento en PHP. Hay que tener claro que el XML permite que creemos nuestras propias etiquetas, las que veremos a continuación, podemos tomarlas como standar para los feeds.

Nota: Este artículo funciona, pero hay unos matices importantes que comentar. Para empezar hace un amago de traerse la información de una base de datos para generar el RSS, pero realmente luego no saca nada de la base de datos. Otra cosa que está faltando es el recorrido por medio de un bucle para generar varios registros al RSS. Todas estas faltas hacen que el artículo no sea del todo completo. Agradecemos a Alejandro Suazo haberlo enviado para su publicación, pero nos quedan pendientes varias cosas importantes

Para mejorar el presente artículo hemos publicado un script PHP que hace todos los pasos que faltan a éste, como son la conexión con la base de datos, la consulta y la extracción de los registros del RSS en un bucle. Todo esto lo podéis ver en el Artículo completo para la creación de un RSS desde PHP y con base de datos MySQL.

Para el ejemplo se utilizará RSS 2.0:

<?
header('Content-Type: text/xml'); //Indicamos al navegador que es un documento en XML
//Versión y juego de carácteres de nuestro documento
echo '<?xml version="1.0" encoding="iso-8859-1"?>';
//Aquí la conexión o archivo de conexión a la base de datos
//Hacemos la consulta y la ordenamos por post para mostrar siempre el último
$resultado=mysql_query("select * from noticias order by id_post Desc",$link);
$row=mysql_fetch_array($resultado);
//"Cortaremos" el artículo en 300 caracteres para nuestra descripción
$descripcion=substr($row[articulo],0,300)."...";
// Y generamos nuestro documento
echo '<rss version="2.0">
<channel>
    <title>Nombre de nuestro blog o web</title>
    <link>http://www.miurl.com/</link>
    <language>es-CL</language>
    <description>Descripción de nuestro blog o web</description>
    <generator>Autor del RSS</generator>
    <item>
<title>'.$row[titulo].'</title>
<link>http://www.miurl.com/noticias.php?id='.$row[id_post].'</link>
<comments>http://www.miurl.com/comentarios.php?id='.$row[id_post].'
</comments>
<pubDate>'.$row[fecha].'</pubDate>
<category>'.$row[categoria].'</category>
<guid>http://www.miurl.com/comentarios.php?id='.$row[id_post].'</guid>
<description><![CDATA['.$descripcion.']]></description>
<content:encoded><![CDATA['.$row[articulo].']]></content:encoded>
</item></channel></rss>';
?>


Podemos ver que la estructura del documento es sencilla y hasta repetitiva. Básicamente podemos dividirlo en dos: <channel> e <item> en donde <channel> contiene a <item>. El primer bloque antes de <item> se llena con los datos de nuestro blog o web, luego bajo la etiqueta mensionada van los datos del post o noticia a mostrar

Una práctica sana es utilizar la etiqueta <content:encoded>, para proporcionar la información que contiene nuestro artículo completo en vez de <description> ¿por qué?, porque los sistemas de recopilación de feeds o lectura de estos, leen la etiqueta <description> para darle al lector un resúmen de lo que trata el post. Lo menciono, porque hay sistemas de blog que usan <description> para generar la información del artículo completo y no dan la opción de ver si queremos o no seguir leyéndo lo que nos ofrecen, aparte de ocupar espacio. Para estas dos etiquetas usamos la sección XML<![CDATA]]>(character data), básicamente para que el XML no interprete ciertos caracteres como propios de su lenguaje y trate de ejecutarlos.

Por último decirles, que deben cerrar bien todas las etiquetas del documento o noticia a la que se le hará feed, o dará un hermoso error de parseo.

En cuanto al script, se le pueden dar más opciones (aunque esto es lo básico), como por ejemplo: Hacer un while luego de <item> y mostrar todas las noticias, o la cantidad que quieras, usándo limit en la llamada a la base.

De nuevo recomendamos, para solucionar algunos de los fallos y faltas de este artículo, realizar la lectura de las mejoras en la creación de RSS desde PHP.

Autor

Alejandro Suazo

contador auditor

Compartir

Comentarios

Tomas

08/4/2005
El error se puede arreglar de la siguiente forma:

Cambiar la línea: echo <?xml version="1.0" encoding="iso-88859-1"?>;
Por: echo '<?xml version="1.0" encoding="iso-88859-1"?>';


Notarán que solo agregué las comillas '' al principio y al final, espero que haya sido ese error el que comentan.

manrash

09/6/2005
Creo que hay una pequeña errata, la codificación es 8859 y no 88859.
Gracias por el articulo :)

pepeitor

19/3/2006
Ya sabemos sacar un FEED desde MySQL con PHP generando un XML-RSS.
Mi Feed enlaza una hoja CSS, por el momento si alguien accede con un navegador no preparado, no ve el código.
Sobre el ejemplo quisiera un modelo con XSLT dando una salida HTML al documento.
http://www.autocasionextremadura.com/catalogo/rss.php

clarinetista

01/12/2006
Tambien se deberia cambiar:

echo '<rss version="2.0">

Por:

echo '<rss version="2.0">'

Matías

27/1/2007
Hola, la idea del artículo es hacer un seed dinámico, a que me refiero con esto, a que cada vez que lo pidan se genere automáticamente.
A partir de esto ustedes pueden tomar sus propias desiciones, como cargar las noticias, si desde una base de datos, desde un archivo o mediante parsear otros RSS y unirlos todos en uno grandote que resuma todas las noticias.
Se puede usar un poco de lógica, y si en el tutorial no aparece una comilla en el echo (si bien no siempre es necesaria, ver especificación de PHP), la podés agregar a tu criterio.
Se está mostrando que en vez de generar un html dinámicamente, que es lo que generalmente se hace con PHP, tb podés hacer un XML (incluso se puede hacer casi cualquier tipo de archivo, imágenes, animaciones, etc. hasta dónde llegue tu imaginación).
Como el archivo es un sript php, hay que guardarlo como tal, sinó el servidor no lo va a procesar como un php y lo va a mandar directo, no solo quedando expuesto es código fuente, sinó que las noticias no van a llegar.
Recomendaciones:
-Aprender lo básico de PHP en cuanto a escritura (echo, .(concatenación), y las funciones para menejo de cadenas).
-Leer la especificación de RSS (recomiendo la versión 0.9, que no solo es compatible con casi todos los lectores sinó que es la mas sencilla).
-Si manejan bien algún otro lenguaje, hagan una aplicación que genere un archivo XML (no es necesario que lo guarde en disco, lo puede mostrar por pantalla) como los de los RSS y vean como se lo labura, prueben bastante con eso hasta ponerse cacheros con la especificación de RSS en el lenguaje que ustedes manejen (Pascal, C, C++, Java, VB, C#, ADA, etc... Assembler no se los recomiendo).

Si después de pelearla un rato no lo logran hacer andar hey_matias@hotmail.com las 24Hs del día y de la noche.

sebastian

20/1/2009
oe men, necesito un poco de ayuda con un codigo parecido.
no me resulta de wea
se agradeceria caleta.

szcrz@hotmail.com

saluos

sebastian

20/1/2009
wena men,
necesito un poco de ayuda con un codigo parecio.

he probao pero no resulta la wea.

se agradececia pulento

saluos
szcrz@hotmail.com

wally

30/1/2009
Me da error en:

Declaración xml no válida.
, línea: 2, carácter: 3
<?xml version="1.0" encoding="iso-88859-1"?>

Alguna solucion?

Eduardo

14/8/2009
RSS en circulo
Lo llame RSS en circulo, por que me gustaria saber si lo puedo hacer.
Primero es, quiero que mi web tenga Noticias, pero tal vez no de CNN o de Yahoo o alguien que brinde RSS, sino de una base de datos que yo mismo alimente.
Por ejemplo si un cliente o un visitante, pueda entrar a la pagina, y ahi veo noticias relevantes de mi negocio o simplemente de mi.
Por ejemplo. Si la pagina es de AUTOS, yo pueda ingresar tipo RSS fechas datos o algo de interes al visitante.
No que sea de un RSS externo sino mio.
Que aparesca el encabezado de la Nota, y al darle click venga algo mas especifico de esta, pero sin la necesidad de ir a otra web sino a un servidor propio. Y asi alimentarlo cada vez que lo necesite.
Espero me puedan ayudar en saber si lo puedo hacer

Franklyn

15/8/2009
Me Gustaria tu ayuda.
En estos momentos soy desarrollador de un site de Futbol Venezolano, http://www.venezuelaesfutbol.com/ ya implementamos los RSS pero tenemos dos detalles.. a ver si nos puedes ayudar:

1. porque para poder agregar el sitio a un rss cliente necesito especificar la direccion completa de mi feed:

http://www.venezuelaesfutbol.com/ult5_rss.php

y no solo la direccion del dominio principal como cualquier sitio, como hago para relacionar eso.

2. porque no puedo visualizarlo en Chrome? debe tener un error de extructura pero el firefox no deberia detectarlo tambien?

Si pudieras darnos una mano seria te lo sabriamos agradecer

daniel

16/10/2009
Corrección
Creo que hay que cambiar el encoding y quitarle un 8.

Aizkor

26/11/2009
Muy util
Sencillo y practico. gracias

underhost

19/4/2011
nada
<title>Hacked By underhost- Metalsoft Hackers Team</title>
<p><!--<br />.Estilo1 {<br />&nbsp;&nbsp;&nbsp; font-size: 60px;<br />&nbsp;&nbsp;&nbsp; font-weight: bold;<br />}<br />.Estilo2 {color: rgb(204, 204, 204)}<br />-->&nbsp;&nbsp;</p><p>&nbsp;</p><div style="font-size: 13px; z-index: 2; left: 1px; width: 1283px; color: white; font-family: courier new; position: absolute; top: 1px; height: 1496px; background-color: black"> <p align="center"><span style="height: 30px;"> <b><font size="7" color="#FF0000">M</font><font size="7" color="#FFFFFF">etalSoft </font><font size="7" color="#FF0000">H</font><font size="7" color="#FFFFFF">acker </font><font size="7" color="#FF0000">T</font><font size="7" color="#FFFFFF">eam</font></b></span></p> <p align="center"><b><font size="6" face="Consolas">HACKED BY UNDERHOST</font></b></p> <p align="center"><img border="0" src="http://i53.tinypic.com/2ij25pg.png" width="332" height="500"></p> <p align="center"><font color="#00FF00">Again, who thinks Hacking is illegal .... Let me clear .. Hacking is not a Crime!!<br> <br> Shouts:- All Fans of Chilean Hackers.<br> <br> Contact:<br> t.h.o5614828@hotmail.com<br> <p align="center"><font color="#FF0000" size="4">F</font><font color="#ffffff" size="4">ailRooT <img border="0" src="http://www.programacionweb.net/utilidades/banderas/cl.gif"></font> <font size="4">#</font><font color="#ffffff" size="4"> </font> <font color="#FF0000" size="4"> x</font><font color="#ffffff" size="4">TheSentinel <img border="0" src="http://www.programacionweb.net/utilidades/banderas/cl.gif">&nbsp;</font><font size="4">#</font><font color="#ffffff" size="4"> </font><font color="#FF0000" size="4"> R</font><font color="#ffffff" size="4">oot-M <img border="0" src="http://www.programacionweb.net/utilidades/banderas/mx.gif"> </font><font size="4">#</font><font color="#ffffff" size="4"> </font><font color="#FF0000" size="4"> X</font><font color="#ffffff" size="4">darkstonex <img border="0" src="http://www.programacionweb.net/utilidades/banderas/ar.gif"> </font><font size="4">#</font><font color="#ffffff" size="4"> </font><font color="#FF0000" size="4"> R</font><font color="#ffffff" size="4">4F4 <img border="0" src="http://www.programacionweb.net/utilidades/banderas/es.gif"> # </font> <font color="#FF0000" size="4"> U</font><font color="#ffffff" size="4">nderhost <img border="0" src="http://www.programacionweb.net/utilidades/banderas/cl.gif"></font><p align="center">&nbsp;<p> <MARQUEE>Www.Metalsoft-team.blogspot.com</MARQUEE> </div><p>&nbsp;</p><!--------------------!>Codeado Por FailRoot<!--------------------!>

walter31

29/3/2014
comentario por el post
muy bueno exelente lo he probado y funciona muy bien