Respostas:
É possível fazer muitas coisas no Drupal simplesmente fazendo consultas SQL, seja através do Drupal ou externamente. Geralmente, você nunca deseja adotar essa abordagem. Em alguns casos, ele pode funcionar bem, mas na maioria das vezes não há motivos para fazê-lo dessa maneira.
O Drupal possui uma API rica, isso é verdade para o Drupal 6, 7 e 8, pois sempre foi um recurso importante no Drupal. No seu exemplo de concreate, você pode usar taxonomy_term_load
e taxonomy_term_save
facilitar uma atualização de um termo. Fazendo dessa maneira, você pode editar qualquer parte dos dados, incluindo o vid
. Só porque você faz isso com a API, fazendo coisas proibidas não funcionará automaticamente, mas a chance de as coisas correrem bem é drasticamente melhorada.
Neste exemplo concreto, a API não faz o necessário. Ele define alguns dados internos sobre o termo e chama o módulo de letra de ganchos, que sabe que foi atualizado.
Você deve observar que as coisas podem quebrar, se o termo que você deseja alterar fizer parte de uma hierarquia. As coisas também podem ser interrompidas para nós que referenciam o termo, se o campo não puder fazer referência a termos no novo vocabulário.
A migração de dados é a solução à prova de balas e, a menos que você tenha um grande conjunto de dados, ele pode ser desenvolvido e executado com bastante facilidade. A idéia é criar um novo termo e migrar o conteúdo que você deseja migrar e excluir o termo antigo. Como um gancho de atualização, o código de exemplo pode ficar assim:
/**
* Put in modules .install file, replace xxxx with 7000 or higher
*/
function MODULE_NAME_update_XXXX(&$sandbox) {
$term = taxonomy_term_load(CONSTANT_WITH_TID);
$new_term = clone $term;
unset($new_term->tid);
unset($new_term->tid);
$new_term->vid = CONSTANT_WITH_VID;
taxonomy_term_save($term);
// Find all nodes we want to update and update them.
// If there is a lot of nodes, can use $sandbox to make this a batch job.
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->fieldCondition('field_which_is_term_reference', 'tid', $term->tid);
$result = $query->execute();
foreach (node_load_multiple(array_keys($result['node'])) as $node) {
$node->field_which_is_term_reference[LANGUAGE_NONE][0]['tid'] = $term->tid;
node_save($node);
}
// Migration all done - delete the old term.
taxonomy_term_delete($term->tid);
}
Observe que o código acima é um exemplo de código puro, escrito de cor. Pode ter erro de sintaxe ou outros erros e faz muitas suposições. Isso é apenas para ilustrar uma idéia e demonstrar que uma migração pode não ser um grande problema.
Não é aconselhável fazer alterações diretas no banco de dados ao trabalhar com o Drupal. Mas sim, se soubermos onde tudo isso pode impactar e fazer as alterações necessárias adequadamente, não há problema em fazer alterações diretas no banco de dados. Porque neste caso, isso não é possível através da interface do usuário. NOTA: Se você tiver nós associados ao Termo, também precisará lidar com isso manualmente.
Confira este link que explica como podemos alterar o termo vocabulário no Drupal 7: Altere o vocabulário de um termo taxonômico no Drupal 7 usando o banco de dados .
Eu não recomendaria alterar esse termo da maneira que você o descreveu em sua pergunta. Em vez disso, usaria uma abordagem alternativa para obter um resultado semelhante (na ordem especificada), que é mais detalhada abaixo.
Crie um novo campo de termo de taxonomia, para que "a partir de agora" quaisquer atualizações futuras do nó (ou novos nós sendo criados) usem esse novo campo. Suponho que esses termos sejam usados para nós (se você usá-lo para algum outro tipo de entidade, como usuários, etc.), a mesma abordagem também poderá ser usada para essas entidades.
Use o módulo Rules para criar uma regra assim:
before saving content
.entity has field
, com campo = o campo antigo.entity has field
, com campo = o novo campo).set Drupal message
que contém algumas instruções de que o campo antigo deve ser apagado e o novo campo deve conter os valores apropriados.Obviamente, a abordagem na Etapa 1 levará "algum" tempo se isso tiver que ser feito manualmente, 1 nó por vez. Mas, usando o Views (para criar uma lista de nós semelhantes a serem atualizados) e o VBO (para atualizar em massa essas listas), você pode (deve!) Acelerar o processo um pouco.
Especialmente se você usasse o Rules para criar uma operação em massa personalizada para essa visualização VBO, conforme explicado na resposta a " Como usar o Rules para criar uma operação em massa personalizada para uma visualização VBO? ". Aqui está um protótipo de um componente de regras que deve ajudar a implementar essa operação em massa personalizada (no formato de exportação de regras):
{ "rules_replace_a_term_field_by_another_term_field" : {
"LABEL" : "Replace a term field by another term field",
"PLUGIN" : "rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"USES VARIABLES" : { "node" : { "label" : "Node", "type" : "node" } },
"IF" : [
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_sample_tags" } },
{ "entity_has_field" : { "entity" : [ "node" ], "field" : "field_demo_tags" } },
{ "data_is" : { "data" : [ "node:field-demo-tags" ], "value" : "1" } }
],
"DO" : [
{ "data_set" : { "data" : [ "node:field-sample-tags" ], "value" : "31" } },
{ "drupal_message" : { "message" : "Term updated in node with id = [node:nid]" } }
]
}
}
Mais alguns detalhes para explicar o protótipo acima:
Estas são as condições das regras:
field_sample_tags
.field_demo_tags
.field_demo_tags
corresponde ao termo que queremos substituir (neste exemplo, o termo tem id = 1
). Observe que, se essa condição não for atendida, nenhuma ação de regra será executada.Estas são as ações de regras:
field_sample_tags
igual ao termo com o termo id = 31
(que é o termo no vocabulário recém-criado que corresponde ao termo no vocabulário a ser substituído).Term updated in node with id = 72
, considerando que 72
é o ID do nó atualizado.Se desejar, adapte os nomes de máquina dos nomes de campo no protótipo acima e os IDs de termo usados. Em seguida, importe-o em seu próprio site (usando a UI de regras) e faça o controle de qualidade usando o link "execute" à direita do Componente de regras importado (e insira um ID de nó para testá-lo, depois de mudar para "entrada direta" mode "para poder especificar um ID do nó). Se durante o teste você não receber essa Term updated in node ...
mensagem, deve ser porque o nó selecionado não usou o valor do termo especificado em suas regras Condição.
Depois de concluir o teste de controle de qualidade deste componente de regras da Etapa 2, crie uma visualização VBO dos nós a serem processados, na qual você se refere ao protótipo de regras acima (ou uma variação dele para atender às suas necessidades).
Usando essa abordagem, você minimiza o risco de introduzir inconsistências de dados (em comparação com a atualização direta do banco de dados), com zero código personalizado envolvido (você usaria apenas a interface do usuário Views e a UI das regras).
Eu sei que você diz programaticamente, mas se você quiser usar um módulo, pode usar o Taxonomy Manager
Este módulo fornece uma interface poderosa para gerenciar taxonomias. Um vocabulário é exibido em uma visualização em árvore dinâmica, na qual os termos pai podem ser expandidos para listar seus termos filhos aninhados ou podem ser recolhidos.
O Taxonomy Manager possui as seguintes operações e principais recursos:
- visualização dinâmica das árvores
- exclusão em massa
- adição em massa de novos termos
- movimentação de termos em hierarquias mesclagem de termos (usando o módulo Mesclar termos no 7.x)
- mudança rápida de peso com as setas para cima e para baixo (e economia de AJAX)
- Formulário de edição de termos com AJAX
- interface de pesquisa simples
- Exportação de termos CSV
- Suporte i18n para vocabulários multilíngues (por termos de idioma)
- Interface Double Tree para mover termos em hierarquias, adicionando novas traduções e alternando termos entre diferentes vocabulários