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
?node_save
quefield_attach_update
e deEntityFieldQuery
quedb_query_range
foi muito gratificante. De 3h de atualização para 40 minutos.Se você não deseja salvar os dados do campo sem fazer com que os eventos e ações padrão aconteçam, use drupal_write_record .
Aqui está um exemplo para inserir Hello World no campo body para um nó do tipo article com um ID 1.
Se o seu site for multilíngüe, convém usar 'en' ou o idioma do seu conteúdo em vez de 'und'.
Se você estiver revisando, precisará ter o cuidado de inserir o ID de revisão correto, caso contrário, pode simplesmente inserir o mesmo valor que o entity_id.
Observe como esses dados são inseridos em duas tabelas field_data_ * e field_revision_ *. Você deve inserir os dois para garantir que o site funcione conforme desejado.
Depois de executar isso, você precisará limpar os caches para os campos aparecerem, dependendo de como o cache estiver configurado.
fonte
Para uma atualização simples como essa, na qual muitos nós precisam ser atualizados, eu sempre uso uma instrução de atualização do MySQL. Sim, o armazenamento em cache precisa ser levado em consideração, mas você pode apenas liberá-lo após concluir e tudo fica bem. Você, é claro, precisa estar familiarizado com a estrutura de dados, mas é relativamente simples no Drupal 6. (embora horrendo no Drupal 7)
fonte
Sugiro
field_attach_update
também, e não uma consulta SQL direta, porque o sql não atualiza o objeto de cache do nó e em sua próximanode_load
você não carregará o valor do campo atualizado, você carregará o valor antigofield_attach_update
é muito melhor do que a consulta SQL direta.fonte
stdClass
objeto sem carregar. Você sabe o que pode acontecer se eu tentar atualizar o nó dessa maneira sem definir todos os campos? Eles serão substituídos por valores nulos ou padrões? Talvez eles sejam ignorados pelo processo de atualização?Tendo tentado todas as abordagens mencionadas nas outras respostas, obtive tempos de atualização muito lentos (cerca de 7 dias para 700.000 nós de um tipo de nó com mais de 20 campos) até encontrar este artigo: http://www.drupalonwindows.com/en/ blog / somente atualização-alterada-campos-ou-propriedades-entidade-drupal .
Depois de implementar algo como o código abaixo em um hook_update, reduzi o tempo de atualização para 2 horas, o que eu acho que é gerenciável.
fonte
Eu ainda tinha o mesmo requisito de atualizar um campo para todos os nós de um tipo de conteúdo específico. Eu usei node_load_multiple e field_attach_update .
Eu passei pelo drush e foi bem rápido.
fonte
Você já pensou em fazer essas atualizações diretamente no banco de dados usando o mySQL? É provavelmente a maneira mais simples e rápida de alcançar o que deseja.
Aqui está um exemplo simples. Você pode executar esse comando na guia 'SQL' no phpMyAdmin. Imagine que você tem um tipo de conteúdo chamado Perfil do Membro. Nele você tem um campo chamado 'Tipo de membro' (por exemplo, empresa, indivíduo, organização). Digamos que você queira atualizar todas as ocorrências de 'COMPANY' para 'company'. O comando a seguir fará exatamente isso.
UPDATE content_type_member_profile SET
field_type_of_member_value
= 'empresa' WHEREfield_type_of_member_value
= 'EMPRESA';Além disso, check-out Introdução ao MySQL
fonte