Crear un feed RSS con PHP y MySQL



Como crear un feed RSS desde MySQL con PHP
Recientemente he tenido que hacer un feed RSS para una página de antigüedades que tenía unos 90-100 artículos en puro HTML.
Así que he optado por utilizar una base de datos.
Mejor de cara a futuras actualizaciones (nuevos artículos) e incluso más practico ahora.
El feed RSS es un sencillo formato de datos que es utilizado para redifundir contenidos a suscriptores de un sitio web. El formato permite distribuir contenido sin necesidad de un navegador, utilizando un software diseñado para leer estos contenidos RSS (agregador). A pesar de eso, es posible utilizar el mismo navegador para ver los contenidos RSS. Las últimas versiones de los principales navegadores permiten leer los RSS sin necesidad de software adicional.
Base de datos
El primer paso será crear la base de datos y añadir los datos. Si nuestra página ya utiliza algún tipo de base de datos para guardar los artículos no será necesario crear otra base de datos ni tampoco hacer cambios.
Básicamente necesitaremos estos campos en la tabla:
• id – no es obligatorio pero siempre me gusta que las tablas estén numeradas
• categoria – categoría o tag del articulo (nos permitirá organizar mejor)
• titulo – título que veremos en el RSS
• resumen – un breve resumen del articulo (si ponemos el texto entero, el usuario no tendrá interés de visitar nuestra página)
• fecha – fecha del articulo para la organización (los más nuevos son los primeros)
• enlace – enlace a la pagina del articulo completo
Esta sería la estructura SQL para facilitar un poco el proceso:
CREATE TABLE `articulos` (

`id` int(11) NOT NULL auto_increment,

`categoria` text NOT NULL,

`titulo` text NOT NULL,

`resumen` text NOT NULL,

`fecha` date NOT NULL,

`enlace` text NOT NULL,

UNIQUE KEY `id` (`id`)

) ENGINE = MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Código PHP
Lo primero será abrir un archivo RSS (.xml / .rss):
$fp = fopen('index.xml', 'w');
El siguiente paso es escribir la cabecera en el archivo index.xml (esta información suele ser estática):
$rand = "\n";
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, 'Bj - El blog de un limonero' .$rand);
fwrite($fp, '
http://www.bujorel.net' .$dirname. '/' .$rand);
fwrite($fp, 'es-sp' .$rand);
fwrite($fp, 'Copyright ' .date('Y'). ' Bujorel.net' .$rand .$rand);
Ahora es el turno de la base de datos (información que se actualiza continuamente).
Realiza la conexión a la base de datos:
$db=mysql_connect('localhost','usuario','contraseña');
    mysql_select_db('base_de_datos',$db);
Crea la consulta (query):
$category = substr(dirname($_SERVER['PHP_SELF']), 1);
    if ($category != '') {
    $dirname = dirname($_SERVER['PHP_SELF']);
       }
    if (! $dirname) {
 $sql = "SELECT id,categoria,titulo,resumen,fecha,enlace FROM articulos ORDER BY fecha DESC";
       } else {
 $sql = "SELECT * FROM articulos WHERE categoria='$categoria' ORDER BY fecha DESC";
       }
$result = mysql_query($sql) or die('No se ha podido realizar la consulta.');
Extrae la información:
while ($row = mysql_fetch_array($result)) {
$id        = $row['id'];
$categoria = strip_tags($row['categoria']);
$titulo    = htmlentities(strip_tags($row['titulo']), ENT_QUOTES);
$resumen   = htmlentities(strip_tags($row['resumen']), ENT_QUOTES);
$fecha     = $row['fecha'];
$enlace    = $row['enlace'];
Y después escribe la información (contenido BBDD) en el archivo index.xml:
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$resumen. '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '
' .$enlace. '' .$rand);
fwrite($fp, '
' .date('D, d M Y H:i:s O', strtotime($fecha)). '' .$rand);
fwrite($fp, '' .$rand .$rand);}
Finalmente escribe el “pie de página” (footer) del archivo index.xml:
fwrite($fp, '' .$rand);
fwrite($fp, '');
Cierra el archivo:
fclose($fp);
Y termina mostrando un mensaje:
print ('Creado Feed RSS.');
Resultado final:
' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, 'Bj - El blog de un limonero' .$rand);
fwrite($fp, '
http://www.bujorel.net' .$dirname. '/' .$rand);
fwrite($fp, 'es-sp' .$rand);
fwrite($fp, 'Copyright ' .date('Y'). ' Bujorel.net' .$rand .$rand);

$db=mysql_connect('localhost','usuario','contraseña');
mysql_select_db('base_de_datos',$db);

$category = substr(dirname($_SERVER['PHP_SELF']), 1);
    if ($category != '') {
    $dirname = dirname($_SERVER['PHP_SELF']);
       }
    if (! $dirname) {
 $sql = "SELECT id,categoria,titulo,resumen,fecha,enlace FROM articulos ORDER BY fecha DESC";
       } else {
 $sql = "SELECT * FROM articulos WHERE categoria='$categoria' ORDER BY fecha DESC";
       }
$result = mysql_query($sql) or die('No se ha podido realizar la consulta.');

while ($row = mysql_fetch_array($result)) {
$id        = $row['id'];
$categoria = strip_tags($row['categoria']);
$titulo    = htmlentities(strip_tags($row['titulo']), ENT_QUOTES);
$resumen   = htmlentities(strip_tags($row['resumen']), ENT_QUOTES);
$fecha     = $row['fecha'];
$enlace    = $row['enlace'];

fwrite($fp, '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '' .$resumen. '' .$rand);
fwrite($fp, '' .$rand);
fwrite($fp, '
' .$enlace. '' .$rand);
fwrite($fp, '
' .date('D, d M Y H:i:s O', strtotime($fecha)). '' .$rand);
fwrite($fp, '' .$rand .$rand);}

fwrite($fp, '' .$rand);
fwrite($fp, '');

fclose($fp);

print ('Creado Feed RSS.');

?>
Ahora para utilizar esto si tenemos una página que no actualizamos muy a menudo o tenemos que actualizar la base de datos de forma manual podemos simplemente abrir el archivo php creado cuando hace falta actualizar el feed.
Pero si tenemos una página que escribe en la base de datos directamente y la actualizamos más a menudo podemos poner este código HTML:

 XML
Cada vez que pasemos el ratón por encima del enlace se ejecutara el archivo
index-xml.php (nuestro archivo) que actualizara el feed RSS

Comentarios