El Camino del Erizo

Aventuras y desventuras de un Erizo dormilón… y friki!

Archive for the ‘Técnico’ Category

WordPress Post List Plugin Bug

leave a comment »

Estos días estoy trabajando mucho con WordPress, y algunas de las tareas que llevo a cabo me están permitiendo meterme muy a fondo dentro de su API.

En este caso concreto, he querido utilizar un plugin sencillo que me permitiese incluir en una página el listado de entradas existentes dentro del blog.

Para ello me decidí por Post-List, un plugin, por su nombre, daba lo que prometía. Y así ha sido.

El problema ha llegado cuando wordpress ha comenzado a hacer cosas extrañas: estoy creando una página que pretendo que sea estática, y eso incluye impedir que los visitantes utilicen los comentarios.

WordPress permite este tipo de adaptaciones de forma muy sencilla, y me sorprendí mucho al comprobar que por muchas vueltas que le daba, no conseguía desactivar el formulario de comentarios para esa página concreta.

A partir de ahí hice muchas comprobaciones, a saber:

  • Probé la ocultación de comentarios en otros posts y páginas, en las que funcionaba.
  • Investigué el código de la plantilla, para ver si había algún error a la hora de mostrar los comentarios.
  • Me cercioré de que la entrada problemática aparecía bien en la base de datos, y con los campos que tenía que tener.
  • Investigué la carga de posts desde y hacia la base de datos.

Por último, me dio por desactivar el plugin en esa entrada, y el problema se vio claro: el plugin estaba dando problemas.

El siguiente paso fue estudiar el código del plugin. Siendo un código sencillo, y viniendo como venía de haber estado examinando las Clases de Post, me resultó fácil dar con el problema: la carga del listado de posts que hacía el plugin sustituía la referencia al post actual que se estaba cargando: un fallo garrafal que me ha sido fácil arreglar, y que he aprovechado para compartir en el foro del plugin como aviso a otros usuarios. El texto de dicho aviso es el siguiente:

I’ve been having troubles with this plugin at the time of accessing the state of the post or page in which it is located after the shortcode is processed.

Placing this shortcode in a post or page in order to access a list of posts makes any further post information to be lost. I’ve found this to be very annoying in the case of the comment-status property of the posts: even though I disabled comments on the post I was using this plugin in, they kept appearing.

After debugging the plugin, I found out that this is due to the way the list of posts is requested from the database. Once the list is obtained, it is iterated over the $post variable, which is global. The previous post information is overriden, and thus lost, for any later processing. The information stored in that variable from then on is the last post from the list that was obtained from the DB.

I managed to fix this behavior up, and I’m telling you my small patch as an example in case it is useful for anyone else.

In the plugin code, reference the global $post variable at the start of the postlist() function. Then, store the $post variable value into another temporary variable, i.e. $post2.

Just close to the end of the function, after the post list is iterated and the $out variable is filled, but before it is returned, assign the $post2 value back to the global $post var. You’ll keep the original $post values for any further processing outside the plugin.

In a nutshell:

function postlist($attr){

global $post; //MOVE THIS LINE UP
$post2 = $post; //NEW LINE

extract(...// REST OF THE FUNCTION, UP TO THE DB ACCESS AND POST ITERATION.

if ( $query->have_posts() ) :
$out = "<ul>";
while ( $query->have_posts() ) : $query->the_post();
$out .= "<li><a href='".get_permalink($post->ID)."'>" .get_the_title($post->ID). "</a></li>";
endwhile;
$out .= "</ul>";
$post = $post2; //NEW LINE

return $out;
else:
$post = $post2;
return "<p>No Post found.</p>";
endif;

Finally, the “wp_reset_query();” line is never executed, I’m afraid.

I hope this helps. Best Regards,

Erizo

Lo cierto es que no fue hasta después de escribir el post que me di cuenta de que el plugin llevaba sin actualizarse durante varios años… Bueno, igualmente ha sido una experiencia interesante y satisfactoria 🙂

Written by Erizo

31/12/2014 at 1:37

Publicado en Técnico

Instalando Joomla 3.x en Xampp

leave a comment »

La creación de páginas web ha sido un área que me ha interesado desde que era un niño. Uno de los primeros lenguajes informáticos que aprendí, después de Basic, fue HTML. La razón es simple: con HTML puedes ver fácilmente cuáles son los resultados de tus programas con tan solo pulsar F5. Para un iniciado de la informática, comprobar que consigues dar instrucciones a tu ordenador y que éste las lleve a cabo es una gozada.

Pero el desarrollo de páginas web ha cambiado mucho desde 1999, y hoy en día puedes montar una página web fácilmente sin tener que tirar una sola linea de código. De eso se encargan aplicaciones de CMS como Joomla o WordPress, siendo quizás el segundo mucho más accesible y sencillo que el primero.

Estas tecnologías tienen mucha presencia en el mundo del blogging, ya que como Sistemas de Gestión del Contenido, estas aplicaciones están orientadas principalmente a ser utilizadas para la creación y administración de blogs.

Como profesional tecnológico, me resulta muy interesante las diferencias que tienen estos CMS unos de otros, e intento explorarlos siempre que tengo la oportunidad. Concretamente suelo utilizar instalaciones locales de Joomla y de WordPress sobre mi ordenador de sobre mesa, utilizando el paquete XAMPP como servidor (Apache + php + mysql, entre otros).

Nunca había tenido excesivos problemas a la hora de instalar, en este último caso, Joomla. De hecho, la instalación de estos CMS es increiblemente sencilla e intuitiva, constando normalmente de tres pasos que concluyen en la página de login de administrador del sistema. Sin embargo, en esta ocasión Joomla me estaba dando problemas.

Concretamente, la dificultad surgía a la hora realizar la instalación de Joomla en la base de datos. Tras poder escuchar ronronear al ordenador durante unos segundos, éste se detenía mientras la barra de progreso (una barra azul zigzagueante) continuaba bailando sin avanzar un ápice. La instalación no finalizaba, y recargar la página solo me llevaba de nuevo al inicio de dicha instalación.

El caso es que, accediendo a la base de datos a través de phpmyadmin, podía comprobar que la creación y llenado de las tablas se había estado llevando a cabo durante la instalación. Sin embargo, ésta debía de encontrarse con algún problema que le impedía continuar. La consola de Chrome y de Firebug no daban información alguna, así que tan solo me quedaba recurrir al siempre fiel Google.

Existen multitud de temas donde se comenta este error, junto a muchos otros, y en los que a veces es confuso poder encontrar la respuesta. Además, la mayoría están en inglés. Enlazo a un par de los que he visitado en mi pequeño viaje como referencia, siendo en éste donde encontré la solución al problema… que bien mirado, es bastante obvia.

Resulta que el script de instalación de Joomla es, debido al crecimiento con los años y al alto número de funcionalidades que ofrece, bastante largo de ejecutar. Resulta además que en las instalaciones de XAMPP, la configuración de PHP por defecto permite ejecución de scripts de como máximo 30 segundos. Este tiempo era insuficiente para Joomla, que se quedaba impedido después de este tiempo sin poder ir ni para adelante, ni para detrás. Además, no muestra ningún error en pantalla, razón por la que la barra azul de progreso continua moviéndose eternamente.

Tenemos que irnos hasta los logs de php para encontrar la prueba de que éste es el problema, localizados normalmente en “xampp\php\logs\php_error_log“. En ellos encontraremos una linea como ésta:

[14-Nov-2014 17:19:06 Europe/Berlin] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in xampp\htdocs\myWeb\libraries\framework\Joomla\Registry\Registry.php on line 11

Y a semejante problema, la solución no es otra que acceder al archivo de configuración de php, localizado normalmente en “xamp\php\php.ini“, y cambiar la linea

max_execution_time=30

a

max_execution_time=300

Espero que esto sirva a quienquiera que venga detrás mía, y le ahorre alguna que otra hora de incertidumbre.

Written by Erizo

14/11/2014 at 18:33

Publicado en Técnico