El Camino del Erizo

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

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 a 1:37

Publicado en Técnico

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: