Ritornerei sicuramente field_attach_update
.
L'idea è semplice Basta caricare il nodo e salvarlo utilizzando 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));
Questo non cambierà alcun timestamp o qualsiasi altro hook che node_save solitamente invoca. Il caricamento del nodo invocherà anche alcuni hook, quindi probabilmente non è così efficiente.
Se hai il nid e se la struttura del nodo è semplice, puoi farlo anche in questo modo:
$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));
Ad ogni modo, se stai provando ad aggiornare qualcosa di diverso dai campi, questo non funzionerà (stato dei commenti, stato pubblicato, ecc.). Inoltre, se si utilizza node_save, la cache per il nodo particolare verrà cancellata automaticamente per i diversi metodi che è necessario cancellare con 'entity_get_controller'.
Aggiornamento:
sembra che dovresti anche chiamare field_attach_presave()
per consentire ad altri moduli di elaborare correttamente l'input di campo. Il modulo file, ad esempio, lo utilizza per impostare lo stato del file su permanente utilizzando questo hook. Ho aggiornato i miei 2 esempi sopra.
field_attach_update
?