Я бы определенно пошел на field_attach_update
.
Идея проста. Просто загрузите узел и сохраните его, используя field_attach_update.
Пример:
$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));
Это не изменит никакую временную метку или любой другой хук, который обычно вызывает node_save. Загрузка узла также вызовет некоторые хуки, поэтому, вероятно, это не так эффективно.
Если у вас есть nid и если структура узла очень проста, вы также можете сделать это следующим образом:
$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));
В любом случае, если вы пытаетесь обновить что-либо кроме полей, это не сработает (статус комментария, опубликованный статус и т. Д.). Также, если вы используете node_save, кеш для конкретного узла будет очищаться автоматически для разных методов, нам нужно очистить его с помощью entity_get_controller.
Обновление:
Похоже, что вам также следует вызвать field_attach_presave()
другие модули, чтобы они правильно обрабатывали поля. Файловый модуль, например, использует его, чтобы установить постоянный статус файла с помощью этой ловушки. Я обновил 2 моих примера выше.
field_attach_update
?