Eu definitivamente iria field_attach_update
.
A ideia é simples. Basta carregar o nó e salvá-lo 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));
Isso não alterará nenhum registro de data e hora ou qualquer outro gancho que o node_save normalmente invoque. Carregar o nó também chamará alguns ganchos, portanto, provavelmente não é tão eficiente.
Se você possui o nid e a estrutura do nó é simples, você também pode fazer o seguinte:
$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 qualquer forma, se você estiver tentando atualizar algo diferente de campos, isso não funcionará (status do comentário, status publicado, etc.). Além disso, se você estiver usando node_save, o cache para o nó específico será limpo automaticamente para diferentes métodos, precisamos limpá-lo com 'entity_get_controller'.
Atualização:
Parece que você também deve ligar field_attach_presave()
para permitir que outros módulos processem a entrada de campo corretamente. O módulo de arquivo, por exemplo, usa-o para definir o status do arquivo como permanente usando este gancho. Eu atualizei meus 2 exemplos acima.
field_attach_update
?