Sindicando categorías - Userlinux.net

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…

Sindicando categorías

21.Jul.2006 ~ 4 Comentarios ~ 1808 Lecturas
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.
Categorías: programación
Tags: php bsd rss planet

Comentarios


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

gravatar
26.Jul.2006
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
26.Jul.2006
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
12.Aug.2006
La verdad, es que no utilizo ningun lector de feeds , aparte de uno que me 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.

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés