Problemas de timeout de WordPress 2.5 en el fichero classes.php

Recientemente hemos actualizado Marujeo a WordPress 2.5 y nos hemos encontrado con un serio problema a la hora de cargar las categorías de los artículos, este timeout en todas las pantallas relacionadas con las categorías:

Fatal error: Maximum execution time of 30 seconds exceeded
in /home/marujeo/public_html/wp-includes/classes.php on line 422

Al principio pensamos que era alguna consulta de base de datos que no estaba optimizada, pero hemos encontrado la causa. En el fichero /wp-includes/classes.php, hay una función recursiva llamada display_element que va calculando el tamaño de las categorías y las va clasificando de forma jerárquica. Esta función es correcta cuando tienes 20 o 30 categorías, pero nosotros tenemos nada más y nada menos que 999 categorías y esta función llega a tardar hasta 4 minutos en terminar.

Así que finalmente hemos subido un “parche” (a falta de una solución definitiva) que elimina la ejecución de esta función, lo malo es que no se pueden dar de alta nuevas categorías hasta que encontremos una solución mejor.

El parche ha consistido en comentar las siguientes líneas del método walk del fichero /wp-includes/classes.php:

// flat display
/*if ( -1 == $max_depth ) {
$empty_array = array();
foreach ( $elements as $e )
$output = $this->display_element( $e, $empty_array, 1, 0, $args, $output );
return $output;
}*/

/*foreach ( $top_level_elements as $e )
$output = $this->display_element($e,$children_elements $max_depth,0,$args,$output );
/*
* if we are displaying all levels, and remaining children_elements is not empty,
* then we got orphans, which should be displayed regardless
*/
/*if ( ( $max_depth == 0 ) && sizeof( $children_elements ) > 0 ) {
$empty_array = array();
foreach ( $children_elements as $orphan_e )
$output = $this->display_element( $orphan_e, $empty_array, 1, 0, $args, $output );
}*/

4 pensamientos en “Problemas de timeout de WordPress 2.5 en el fichero classes.php

  1. Pingback: Arreglando Wordpress | Jordi Bufí

  2. Yo lo resolví cambiando temporalmente el “max execution time” de mi php.ini aunque claro esta yo no tenia 999 categorias ;)