Definitivamente lo haría field_attach_update
.
La idea es simple. 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 invoque node_save. Cargar el 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 muy 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 comentarios, estado publicado, etc.). Además, si está utilizando node_save, la memoria caché para el nodo en particular se borrará automáticamente para los diferentes métodos que necesitamos borrar con 'entity_get_controller'.
Actualización:
Parece que también debe llamar field_attach_presave()
para permitir que otros módulos procesen la entrada de campo correctamente. El módulo de archivo, por ejemplo, lo usa para establecer el estado del archivo en permanente usando este enlace. He actualizado mis 2 ejemplos anteriores.
field_attach_update
?