Sindicando categorías
Hace algunas entradas pasaba a formar parte de PlanetaBSD, para lo cual tuve que crear un archivo de sindicación adecuado al tema principal del planet. Desde que implementé la sindicación en el blog tenía un par de formatos validados: RSS y RDF, pero ambos abarcaban la totalidad de las entradas de Userlinux.
Cambiando un poco la función que genera los archivos de sindicación podía resolver el problema así que me decidí a generalizarla más para poder extender su uso a la categoría 'bsd' o cualquier otra. Al final la función ha quedado tal que así:
/** * Crea un archivo de sindicación dependiendo de la cláusula WHERE * pasada por parámetro. * * @param $page_object: Descriptor de la conexión a la base de datos. * @param $where_clause: Cláusula de condición dentro del SQL. * @param $file_rss: Nombre del archivo a crear. */ function create_rss_where($page_object, $where_clause, $file_rss) { // Variables include("config.inc.php"); $surl=$page_object->get_options("siteurl"); // URL de la web $bname=$page_object->get_options("blogname"); // Nombre de la web $bdesc=$page_object->get_options("blogdescription"); // Pequeña descripción $btheme=$page_object->get_options("blogtheme"); // Theme RSS de la web $admail=$page_object->get_options("admin_email"); // Email del administrador $archivo=$rss_rcms.$file_rss; // Seleccionamos la última noticia para quedarnos con la última fecha de modificación $sql="SELECT *, date_format(date_created, '%a, %d %b %Y %T') as fecham FROM rcms_posts WHERE $where_clause ORDER BY id DESC"; $data=$page_object->get_data($sql); $fecha_mod=$data[0][fecham]; // Seleccionamos las noticias que queremos sindicar para generar el código xml $sql="SELECT * FROM rcms_posts WHERE $where_clause ORDER BY date_created DESC LIMIT 0,15"; $data=$page_object->get_data($sql); $len = count ($data); // Generamos el contenido xml del archivo $codigo= '<?xml version="1.0" encoding="iso-8859-1"?> <rss version="2.0"> <channel> <title>'.$bname[option_value].'</title> <link>'.$surl[option_value].'</link> <description>'.$bdesc[option_value].'</description> <pubDate>'.$fecha_mod.' +0000</pubDate> <language>es-ES</language> <managingEditor>'.$admail[option_value].'</managingEditor> <image> <url>'.$surl[option_value].'themes/'.$btheme[option_value].'/images/feed.png</url> <title>'.$bname[option_value].'</title> <link>'.$surl[option_value].'</link> </image> '; $sql="SELECT *, date_format(date_created, '%a, %d %b %Y %T') as fecha FROM rcms_posts WHERE $where_clause ORDER BY date_created DESC LIMIT 0,15"; $data=$page_object->get_data($sql); $len = count ($data); for($i=0;$i<$len;$i++) { // Dejamos pasar solamente estos tags HTML // Resumen del post $resumen=strip_tags($data[$i][content], '<a></a><a ><a><p></p><div></div><br /><br><br/><pre></pre><blockquote></blockquote><img>'); // Prescindimos del html. // Resto del post $resumen2=strip_tags($data[$i][content_more], '<a></a><a ><a><p></p><div></div><br /><br><br/><pre></pre><blockquote></blockquote><img>'); // Prescindimos del html. // Calcula categorías $arr_keywords=""; $categ=""; // Tags ó palabras clave del post $arr_keywords=explode(" ", $data[$i][keywords]); $len_arr=count($arr_keywords); if($len_arr > 0) { for($k=1;$k<$len_arr; $k++) $categ .= "<category>{$arr_keywords[$k]}</category>"; } else $categ=""; $sql_categoria="SELECT * FROM rcms_posts_categories WHERE id='".$data[$i][idcategory]."'"; $data_categoria=$page_object->get_data($sql_categoria); $categoria=$data_categoria[0][title]; // Seleccionamos usuario $sql_user="SELECT * FROM rcms_users WHERE id='".$data[$i][iduser]."'"; $data_user=$page_object->get_data($sql_user); $user=$data_user[0][nickname]; // Miramos el enlace del post $link_new=$this->check_rewrite($page_object, "noticia",$data[$i][id]); $codigo.='<item> <title>'.$data[$i][title].'</title> <link>'.$surl[option_value].$link_new.'</link> <guid>'.$surl[option_value].$link_new.'</guid> <category>'.$categoria.'</category> '.$categ.' <description>'.$resumen.'</description> <pubDate>'.$data[$i][fecha].' +0200</pubDate> </item> '; }; $codigo .='</channel> </rss> '; // Actualizamos el archivo con el nuevo valor $fp = fopen($archivo,"w+"); fwrite($fp, $codigo); fclose($fp); }Espero que, adaptando las variables que he resaltado en negrita y algún que otro posible bug, el código sea reutilizable a todas aquellas personas que se han preguntado cómo implementar un rss a nivel de categorías en su blog. Dudas, mociones o censuras en los comentarios.
Muy bueno el articulo ;)
Gracias, enviare aki a los que me lo han preguntado.
Sé que algún día me va a ser muy útil éste post, lo guardo en marcadores, sobre todo, para no perder lectores cómo tú, que tirais de sindicación al 99'9% (¿me equivoco?)... pero ahora estoy muy perro con este tema.. ho ho ho!
Co, saludos
99'9% es mucho decir, pero el porcentaje se acerca cada vez más a medida que pasa el tiempo. Ya verás como con esta función (o una similar) es bastante sencillo de implementar un sistema de sindicación. De todos modos, lo que merece la pena, se visita igual a la antigua usanza ;).
La verdad, es que no utilizo ningun lector de feeds , aparte de uno que me [url=http://inkilino.sytes.net/Blog/feeds-reader/ ] hize.[url]
Me gusta ver los Blogs y las Webs al vieja usanza, que es como se ven bien los diseños, que hay muchas webs que lo merecen.


