Hack los mas comentados y leidos

Hack los mas comentados y leidos

Postby perublog on Tue Aug 26, 2008 12:17 pm

Hace tiempo teniamos el problema de usuarios que actualizaban la fecha de sus articulos (articulos con mas de 5 meses de antiguedad) para que apareciesen en la página principal del sitio. Es lógico que habian articulos que tenian una buena cantidad de visitas y comentarios. Esta acción no permitía que artículos publicados en los ultimos 5 dias, no se mostrasen en el ranking de Los Mas Leidos y Comentados de la semana de la web.

Para darle una solución rápida, decidimos meter manos a las tablas y código. Esperemos sirva para otros que tengan el mismo problema. Desconocemos si este problema esta solucionado en los ultimos parches, tenemos instalado LT 1.2.4

Primero. Realizamos un backup de la Base de Datos.
Segundo. Quitamos el atributo ON UPDATE CURRENT_TIMESTAMP del campo DATE de la tabla PLOG_ARTICLES. Esto para evitar se actualizen todos los articulos de la tabla PLOG_ARTICLES con la fecha actual. (Hasta ahora no sabemos el motivo de añadir este atributo al campo)
Tercero. Quitamos el valor predeterminado CURRENT_TIMESTAMP al campo DATE de la tabla PLOG_ARTICLES.
Cuarto. Añadimos un campo llamado DATE_ORIGINAL de tipo TIMESTAMP en la tabla PLOG_ARTICLES con el valor predeterminado CURRENT_TIMESTAMP.
Quinto. Actualizamos el nuevo campo con los valores actuales del campo DATE. Deben asegurarse de haber quitado el atributo ON UPDATE CURRENT_TIMESTAMP al campo DATE.
Code: Select all
update plog_articles set date_original=date

Sexto. Modificamos las funciones getMostCommentedArticles() y getMostReadArticles() declarados en el archivo class/summary/summarystats.class.php

getMostCommentedArticles()
ANTES:
Code: Select all
function getMostCommentedArticles( $maxPosts = 0 )
        {
            lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
            lt_include( PLOG_CLASS_PATH."class/dao/commentscommon.class.php" );
         $articles = new Articles();
         
            $maxPosts > 0 ? $max = $maxPosts : $max = $this->_summaryPageShowMax;

         $prefix = $this->getPrefix();         
         $query = "SELECT a.*
                 FROM {$prefix}articles AS a,
                      {$prefix}blogs b
                 WHERE a.blog_id = b.id
                       AND a.status = ".POST_STATUS_PUBLISHED."
                     AND b.status = ".BLOG_STATUS_ACTIVE."
                            AND a.date >= ".$this->_startTime."
                     AND a.date <= ".$this->_now."
                     AND a.in_summary_page = '1'
                     AND a.num_nonspam_comments > 0
                     AND b.show_in_summary = '1'
                 ORDER BY a.num_nonspam_comments DESC
                 LIMIT 0, $max";

            $result = $this->Execute( $query );

            if( !$result ){
               return Array();
            }

            $posts = Array();
            while( $row = $result->FetchRow()) {
               array_push( $posts, $articles->mapRow($row));
            }
           
            $result->Close();

            return $posts;
        }

DESPUES: (Modificado el Select para obtener los datos)
Code: Select all
function getMostCommentedArticles( $maxPosts = 0 )
        {
            lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
            lt_include( PLOG_CLASS_PATH."class/dao/commentscommon.class.php" );
         $articles = new Articles();
         
            $maxPosts > 0 ? $max = $maxPosts : $max = $this->_summaryPageShowMax;

         $prefix = $this->getPrefix();         
         $query = "SELECT a.*
                 FROM {$prefix}articles AS a,
                      {$prefix}blogs b
                 WHERE a.blog_id = b.id
                       AND a.status = ".POST_STATUS_PUBLISHED."
                     AND b.status = ".BLOG_STATUS_ACTIVE."
                            AND a.date_original >= ".$this->_startTime."
                     AND a.date_original <= ".$this->_now."
                     AND a.in_summary_page = '1'
                     AND a.num_nonspam_comments > 0
                     AND b.show_in_summary = '1'
                 ORDER BY a.num_nonspam_comments DESC
                 LIMIT 0, $max";

            $result = $this->Execute( $query );

            if( !$result ){
               return Array();
            }

            $posts = Array();
            while( $row = $result->FetchRow()) {
               array_push( $posts, $articles->mapRow($row));
            }
           
            $result->Close();

            return $posts;
        }

getMostReadArticles()
ANTES:
Code: Select all
function getMostReadArticles( $maxPosts = 0 )
        {
             lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
             
             $prefix = $this->getPrefix();
          $articles = new Articles();

             $query = "SELECT a.*
                 FROM {$prefix}articles a, {$prefix}blogs b
                 WHERE a.status = ".POST_STATUS_PUBLISHED."
                 AND a.blog_id = b.id
             AND b.status = ".BLOG_STATUS_ACTIVE."
                 AND a.date <= ".$this->_now." AND a.date > ".$this->_startTime."
             AND in_summary_page = '1'
             AND b.show_in_summary = '1'
             ORDER BY a.num_reads DESC";

            if( $maxPosts > 0 )
               $query .= " LIMIT 0,".$maxPosts;
            else
               $query .= " LIMIT 0,".$this->_summaryPageShowMax;

            $result = $this->Execute( $query );

            if( !$result )
               return Array();

            $posts = Array();
            while( $row = $result->FetchRow()) {
            $post = $articles->mapRow($row);
               array_push( $posts, $post );
            }
           
            $result->Close();           

            return $posts;
        }

DESPUES: (Modificado el Select para obtener los datos)
Code: Select all
function getMostReadArticles( $maxPosts = 0 )
        {
             lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
             
             $prefix = $this->getPrefix();
          $articles = new Articles();

             $query = "SELECT a.*
                 FROM {$prefix}articles a, {$prefix}blogs b
                 WHERE a.status = ".POST_STATUS_PUBLISHED."
                 AND a.blog_id = b.id
             AND b.status = ".BLOG_STATUS_ACTIVE."
                 AND a.date_original <= ".$this->_now." AND a.date_original > ".$this->_startTime."
             AND in_summary_page = '1'
             AND b.show_in_summary = '1'
             ORDER BY a.num_reads DESC";

            if( $maxPosts > 0 )
               $query .= " LIMIT 0,".$maxPosts;
            else
               $query .= " LIMIT 0,".$this->_summaryPageShowMax;

            $result = $this->Execute( $query );

            if( !$result )
               return Array();

            $posts = Array();
            while( $row = $result->FetchRow()) {
            $post = $articles->mapRow($row);
               array_push( $posts, $post );
            }
           
            $result->Close();           

            return $posts;
        }

Estos cambios no alteran el funcionamiento normal de las bitacoras. Ahora obtendremos los articulos mas leidos y comentados que han sudo publicado en la semana.

¿Existe una manera de utilizar tus propias funciones sin tener que modificar el código original de LT?

Esperemos sirva de ayuda este pequeño hack.
perublog
 
Posts: 89
Joined: Wed Jul 27, 2005 11:04 am

Return to Español

cron