Respuestas:
Es posible hacer muchas cosas en Drupal simplemente haciendo consultas SQL, ya sea a través de Drupal o externamente. En general, nunca quieres adoptar este enfoque. Hay algunos casos en los que puede funcionar bien, pero la mayoría de las veces no hay razón para hacerlo de esta manera.
Drupal tiene una API rica, esto es cierto para Drupal 6, 7 y 8, ya que siempre ha sido una característica clave en Drupal. En su ejemplo exacto, podría usar taxonomy_term_load
y taxonomy_term_save
para facilitar la actualización de un término. Al hacerlo de esta manera, puede editar cualquier parte de datos, incluido el vid
. El hecho de que lo haga con API haciendo cosas prohibidas no funcionará automáticamente, pero la posibilidad de que las cosas salgan bien mejora drásticamente.
En este ejemplo concreto, la API no hace nada que sea necesariamente necesario. Establece algunos datos internos sobre el término e invoca el módulo de letras de ganchos que se ha actualizado.
Debe tener en cuenta que las cosas pueden romperse si el término que desea cambiar es parte de una jerarquía. Las cosas también pueden romperse para los nodos que hacen referencia al término, si el campo no puede hacer referencia a términos en el nuevo vocabulario.
La migración de datos es la solución a prueba de balas y, a menos que tenga un gran conjunto de datos, puede desarrollarse y ejecutarse con bastante facilidad. La idea es crear un nuevo término y migrar el contenido que desea migrar y luego eliminar el término anterior. Como enlace de actualización, el código de muestra podría verse así:
/**
* 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);
}
Tenga en cuenta que el código anterior es un código de ejemplo puro, escrito de memoria. Puede tener un error de sintaxis u otros errores y hace muchas suposiciones. Esto es solo para ilustrar una idea y demostrar que una migración podría no ser un gran problema.
No es aconsejable realizar cambios directos en la base de datos cuando se trabaja con Drupal. Pero sí, si sabemos dónde puede afectar y hacer los cambios necesarios en consecuencia, está bien hacer cambios directos en la base de datos. Porque en este caso esto no es posible a través de la interfaz de usuario. NOTA: Si tiene nodos asociados con Término, también tendrá que manejarlo manualmente.
Consulte este enlace que explica cómo podemos cambiar el vocabulario del término en Drupal 7: cambiar el vocabulario de un término de taxonomía en Drupal 7 utilizando la base de datos .
No recomendaría cambiar ese término de la forma en que lo describió en su pregunta. En cambio, usaría un enfoque alternativo para lograr un resultado similar (en el orden especificado), que se detalla más adelante.
Cree un nuevo campo de término de taxonomía, de modo que "a partir de ahora" cualquier futura actualización de nodo (o nuevos nodos que se creen) utilizará ese nuevo campo. Supongo que estos términos se usan para nodos (si lo usa para algún otro tipo de entidad, como usuarios, etc.), también se puede usar el mismo enfoque para esas entidades.
Use el módulo Reglas para crear una regla así:
before saving content
.entity has field
, con campo = el campo antiguo.entity has field
, con campo = el nuevo campo).set Drupal message
que contiene algunas instrucciones de que el campo anterior debe ser borrado, y el nuevo campo debe contener los valores apropiados.Obviamente, el enfoque en el Paso 1 tomará "algún" tiempo si esto tiene que hacerse manualmente, 1 nodo a la vez. Pero usando Vistas (para crear una lista de nodos similares para actualizar) y VBO (para actualizar en masa tales listas) es posible (¡debería!) Acelerar un poco este proceso.
Especialmente si usaría Reglas para crear una operación masiva personalizada para dicha vista VBO, como se explica en la respuesta a " ¿Cómo usar las Reglas para crear una operación masiva personalizada para una vista VBO? ". Aquí hay un prototipo de un componente de reglas que debería ayudar a implementar dicha operación masiva personalizada (en formato de exportación de reglas):
{ "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]" } }
]
}
}
Algunos detalles más para explicar el prototipo anterior:
Estas son las condiciones de las reglas:
field_sample_tags
.field_demo_tags
.field_demo_tags
corresponde al término que queremos reemplazar (en este ejemplo, el término tiene id = 1
). Tenga en cuenta que si no se cumple esta condición, no se realizarán acciones de reglas.Estas son las acciones de reglas:
field_sample_tags
igual al término con el término id = 31
(que es el término en el vocabulario recién creado que coincide con el término en el vocabulario que se va a reemplazar).Term updated in node with id = 72
, mientras que 72
es la identificación del nodo del nodo actualizado.Si lo desea, adapte los nombres de máquina de los nombres de campo en el prototipo anterior y los ID de término utilizados. Luego impórtelo en su propio sitio (usando la interfaz de usuario de reglas) y realice una prueba de control de calidad con el enlace "ejecutar" a la derecha del componente de reglas importado (e ingrese alguna identificación de nodo para probarlo, después de cambiar a "entrada directa" modo "para poder especificar un id de nodo). Si durante la prueba no recibe ese Term updated in node ...
mensaje, debe ser porque el nodo que seleccionó no usó el término valor especificado en su condición de reglas.
Una vez que haya finalizado la prueba de control de calidad de este componente de reglas desde el paso 2, cree una vista VBO de los nodos que se procesarán, en la que se referirá al prototipo de reglas anterior (o una variación del mismo para satisfacer sus necesidades).
Con este enfoque, minimiza el riesgo de introducir inconsistencias de datos (en comparación con la actualización directa de la base de datos), con cero código personalizado (solo usaría la UI de Vistas y la UI de Reglas).
Sé que dices programáticamente, pero si quieres usar un módulo puedes usar Taxonomy Manager
Este módulo proporciona una interfaz poderosa para administrar taxonomías. Se muestra un vocabulario en una vista de árbol dinámica, donde los términos principales se pueden expandir para enumerar sus términos secundarios anidados o se pueden contraer.
El Administrador de Taxonomía tiene las siguientes operaciones y características clave:
- vista de árbol dinámico
- eliminación masiva
- adición masiva de nuevos términos
- movimiento de términos en jerarquías fusión de términos (usando el módulo de fusión de términos en 7.x)
- cambio de peso rápido con flechas hacia arriba y hacia abajo (y ahorro de AJAX)
- Formulario de edición de términos con tecnología AJAX
- interfaz de búsqueda simple
- Exportación de términos CSV
- Soporte de i18n para vocabularios multilingües (por términos de idioma)
- Interfaz de doble árbol para mover términos en jerarquías, agregar nuevas traducciones y cambiar términos entre diferentes vocabularios