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-&gt;get_data($sql);
    $len = count ($data);
      for($i=0;$i&lt;$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 &gt; 0)
      {
        for($k=1;$k&lt;$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-&gt;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-&gt;get_data($sql_user);
      $user=$data_user[0][nickname];
      // Miramos el enlace del post
      $link_new=$this-&gt;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.

code freebsd

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.