Una vez más aquí. En esta ocasión voy a dejar un artículo relacionado con otro que publiqué hace ya bastante tiempo sobre cómo crear un lector rss mediante Ajax y PHP. En esta ocasión vamos a simplificarlo utilizando solo PHP. Esto en su día fue de los primeros códigos un poco complejos que codifiqué, y por lo que tengo entendido a algunos «usuarios» que están empezando, les puede resultar de utilidad.
En el caso que nos ocupa vamos a ver cómo podremos utilizar PHP para leer los canales RSS de los sitios web y mostrar las listas de publicaciones recientes que lo utilizan. Por defecto he indicado que solo se muestren 5 resultados, pero esto es muy sencillo de cambiar.
Por si alguien todavía no lo sabe, RSS (Rich Site Summary) es un formato que se utiliza en muchos sitios web y que permite al editor web sindicar sus últimas publicaciones o datos automáticamente. También beneficia a las personas que desean recibir las últimas actualizaciones de publicaciones de sus sitios web favoritos.
Hay otro método que permite al usuario mantenerse actualizado es el marcador. Pero necesitan ir manualmente a los sitios web de manera oportuna y verificar qué novedades se han al sitio en cuestión.
El código PHP del lector de canales RSS
Bueno, aclarado todo, aquí queda el código del lector de canales RSS. He ido comentando el código, por lo que espero que no queden muchas dudas sobre cómo funciona. Yo creo que el código es sencillo, pero quizás las partes más complicadas son las funcionessimplexml_load_file(), implode() y array_slice(). Pero todas ellas tienen un buen montón de referencias en internet para entender como funcionan.
Decir que el código consta de un formulario en html desde dónde vamos a poder escribir las URL de los FEED y que a continuación se van a presentar. Por defecto la URL que se va a mostrar es el FEED de esta página.
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Lector de rss usando PHP</title> <link href="style.css" type="text/css" rel="stylesheet"> </head> <body> <!--formulario para añadir la URL a leer--> <div class="content"> <form method="post" action=""> <input type="text" name="feedurl" placeholder="Escribe una URL del FEED"> <input type="submit" value="Enviar" name="submit"> </form> <?php //URL a leer por defecto $url = "https://entreunosyceros.net/feed"; if(isset($_POST['submit'])){ if($_POST['feedurl'] != ''){ $url = $_POST['feedurl']; } } $invalidurl = false; //Comprobamos si la URL es correcta. if(@simplexml_load_file($url)){ $feeds = simplexml_load_file($url); }else{ $invalidurl = true; echo "<h2>URL de feed RSS incorrecto.</h2>"; echo "<h3>No te olvides de incluir el protocolo http(s)</h3>"; } $i=0; //Comprobamos si la URL está vacía. Continúa si no está vacía. De lo contrario pasa al else. if(!empty($feeds)){ $site = $feeds->channel->title; $sitelink = $feeds->channel->link; //Título de la página echo "<h1>".$site."</h1>"; foreach ($feeds->channel->item as $item) { //Datos obtenidos de la noticia $title = $item->title; $link = $item->link; $description = $item->description; $postDate = $item->pubDate; $pubDate = date('D, d M Y',strtotime($postDate)); // 5 es el número de noticias a mostrar if($i>=5) break; ?> <!--contruimos cada una de las noticias--> <div class="post"> <div class="post-head"> <!--Título de la noticia--> <h2><a class="feed_title" href="<?php echo $link; ?>"><?php echo $title; ?></a></h2> <span><?php echo $pubDate; ?></span> <!--Fecha de la publicación--> </div> <!-- Cuerpo de la noticia--> <div class="post-content"> <?php echo implode(' ', array_slice(explode(' ', $description), 0, 20)) . "..."; ?> <a href="<?php echo $link; ?>">Leer más</a> <!-- botón leer más. Con enlace a la noticia--> </div> </div> <?php $i++; } }else{ //Error que se muestra si no hay nada que mostrar if(!$invalidurl){ echo "<h2>No se encontró nada que mostrar</h2>"; } } ?> </div> </body> </html>
CSS para dejarlo bonito
Como este código que estamos viendo quedaría un poco feo así sin más, siempre es aconsejable aplicar un poco de estilos CSS para darle un mejor aspecto. En este caso yo utilice el siguiente código:
.content{ width: 60%; margin: 0 auto; } input[type=text]{ padding: 5px 10px; width: 60%; letter-spacing: 1px; } input[type=submit]{ padding: 5px 15px; letter-spacing: 1px; border: 0; background: gold; color: white; font-weight: bold; font-size: 17px; } h1{ border-bottom: 1px solid gray; } h2{ color: black; } h2 a{ color: black; text-decoration: none; } .post{ border: 1px solid gray; padding: 5px; border-radius: 3px; margin-top: 15px; } .post-head span{ font-size: 14px; color: gray; letter-spacing: 1px; } .post-content{ font-size: 18px; color: black; } /* media query */ @media (max-width: 880px){ .content{ width: 99%; } }
Bueno, y para terminar solo queda mostrar este código en funcionamientos en el siguiente enlace. Además he publicado el código en GitHub.