drupal 7 – valor de campo único de ahorro rápido

Pregunta:

Tengo alrededor de 70k nodos del tipo especificado en mi sitio. Necesito actualizarlos. Algunas operaciones y configuración de un campo al valor deseado. node_save es realmente lento y causa bloqueos (puede que la pila de llamadas sea demasiado larga). ¿Existe una forma más rápida de escribir información en este campo en particular?

Se mencionó field_attach_update en una publicación, pero no es mucho más rápido.

EDITAR: Hay una vista bastante compleja construida en este tipo de nodo, pero no funciona en este campo que quiero actualizar.

Respuesta:

Definitivamente iría por field_attach_update .

La idea es sencilla. Simplemente cargue el nodo y guárdelo usando field_attach_update.

Ex:

$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
  // Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));

Esto no cambiará ninguna marca de tiempo ni ningún otro gancho que node_save normalmente invoca. La carga del nodo también invocará algunos ganchos, por lo que probablemente no sea tan eficiente.

Si tiene el nid y si la estructura del nodo es completamente simple, también puede hacerlo así:

 $node = new stdClass();
 $node->nid = $nid; // Enter the nid taken. Make sure it exists. 
 $node->type = 'article';
 $node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
 field_attach_presave('node', $node);
 field_attach_update('node', $node);
  // Clear the static loading cache.
 entity_get_controller('node')->resetCache(array($node->nid));

De todos modos, si está intentando actualizar algo que no sean campos, esto no funcionará (estado de comentario, estado de publicación, etc.). Además, si está utilizando node_save, la caché para el nodo en particular se borrará automáticamente para diferentes métodos, necesitamos borrarlo con 'entity_get_controller'.

Actualización: parece que también debería llamar a field_attach_presave() para permitir que otros módulos procesen la entrada del campo correctamente. El módulo de archivo, por ejemplo, lo usa para establecer el estado del archivo en permanente usando este gancho. He actualizado mis 2 ejemplos anteriores.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım