Sindicando categorías

21.jul 2006 Envía un trackback

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.
php planet rss

Comentarios
Gravatar InKiLiNo@21.07.2006, 'Re: Sindicando categorías'

Muy bueno el articulo ;)
Gracias, enviare aki a los que me lo han preguntado.

Gravatar krs@26.07.2006, 'Re: Sindicando categorías'

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

Gravatar r0sk@26.07.2006, 'Re: Sindicando categorías'

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 ;).

Gravatar InKiLiNo@12.08.2006, 'Re: Sindicando categorías'

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.


Escribe tu comentario
 
 
Guardar datos
Escribe tu comentario:
captcha


Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles: [url=http://direccion]texto[/url], negrita: [b]texto[/b], itálica: [i]texto[/i], subrayada: [u]texto[/u]. Para mencionar o citar a alguien (quote): [cita]texto[/cita]