Drupal 6 - Warning: Invalid argument supplied for foreach() in taxonomy_node_update_index()

Por: MaxMendez --

Los modulos de log de eventos de Drupal, por lo general son una de las mejores herramienta para encontrar problemas y puntos de mejora en nuestra instalación, despues de realizar una actualización del Core de un sitio desarrollado al cual doy mantenimiento, me encontre con el siguiente error:

 

Warning: Invalid argument supplied for foreach() in taxonomy_node_update_index() (line 1293 of public_html/modules/taxonomy/taxonomy.module).

 

Despues de una investigación rápida logre determinar que este no era un problema aislado, sino que el mismo le ha ocurrido variedad de desarrolladores como se puede observar en el siguiente enlace http://drupal.org/node/259632, en mi caso me dispuse a tomar las idemás que se exponen en este tema de la comunidad Drupal, para depurar yo mismo mi sistema y determinar que nodos me estaban causando problemas y porque, para esto modifique temporalmente el modulo node del Core, en una instalación espejo de pruebas.

 

El primer paso que realice fue buscar la función "_node_index_node" dentro del archivo node.module y la modifique de la siguiente manera:

 

function _node_index_node($node) {
$node2 = $node;
  $node = node_load($node->nid);
if (empty($node->taxonomy)) {
  watchdog('error','<pre>' . print_r($node2,1) .'</pre>');
}
  // save the changed time of the most recent indexed node, for the search results half-life calculation
  variable_set('node_cron_last', $node->changed);

  // Build the node body.
  $node->build_mode = NODE_BUILD_SEARCH_INDEX;
  $node = node_build_content($node, FALSE, FALSE);
  $node->body = drupal_render($node->content);

  $text = '<h1>' . check_plain($node->title) . '</h1>' . $node->body;

  // Fetch extra data normally not visible
  $extra = node_invoke_nodeapi($node, 'update index');
  foreach ($extra as $t) {
    $text .= $t;
  }

  // Update index
  search_index($node->nid, 'node', $text);
}

 

Con esto logre determinar que nodos estaban provocando el problema y de esta forma analizar que problema existia con le mismo, al final de toda la depuración, logre determinar que el problema ocurria porque el usuario que creo dichos nodos fue borrado del sistema, lo cual hace que estos contenidos no sean cargados por la funcion node_load. Para corregir el problema hay dos caminos, muy posiblemente ya estos contenidos no son necesarios en nuestro sitio y podemos hacer un borrado manual, la segunda opción es realizar una actualización de la columna uid en la tabla de nodos a todos aquellos contenidos afectados.