Definitivamente lo haría field_attach_update
.
La idea es simple. Simplemente cargue el nodo y guárdelo 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));
Esto no cambiará ninguna marca de tiempo ni ningún otro gancho que invoque node_save. Cargar el nodo también invocará algunos ganchos, por lo que probablemente no sea tan eficiente.
Si tiene el nid y si la estructura del nodo es muy simple, también puede hacerlo así:
$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 todos modos, si está intentando actualizar algo que no sean campos, esto no funcionará (estado de comentarios, estado publicado, etc.). Además, si está utilizando node_save, la memoria caché para el nodo en particular se borrará automáticamente para los diferentes métodos que necesitamos borrar con 'entity_get_controller'.
Actualización:
Parece que también debe llamar field_attach_presave()
para permitir que otros módulos procesen la entrada de campo correctamente. El módulo de archivo, por ejemplo, lo usa para establecer el estado del archivo en permanente usando este enlace. He actualizado mis 2 ejemplos anteriores.
field_attach_update
?node_save
afield_attach_update
y desdeEntityFieldQuery
quedb_query_range
fue muy gratificante. De 3h actualización a 40 minutos.Si no desea guardar datos de campo sin causar que ocurran los eventos y acciones estándar, puede usar drupal_write_record .
Aquí hay un ejemplo para insertar Hello World en el campo del cuerpo para un nodo de tipo artículo con una identificación de 1.
Si su sitio es multlingual, entonces querrá usar 'en' o el idioma de su contenido en lugar de 'und'.
Si está realizando una revisión, deberá tener cuidado de insertar la identificación de revisión correcta; de lo contrario, simplemente puede insertar el mismo valor que la entidad_id.
Observe cómo se insertan estos datos en dos tablas field_data_ * y field_revision_ *. Debe insertar en ambos para asegurarse de que el sitio funciona como lo desea.
Después de ejecutar esto, deberá borrar los cachés para que se muestren los campos, según cómo esté configurado el almacenamiento en caché.
fuente
Para una actualización simple como esta donde se necesitan actualizar muchos nodos, siempre uso una declaración de actualización de MySQL. Sí, es necesario tener en cuenta el almacenamiento en caché, pero puede limpiar el caché una vez que haya terminado y todo está bien. Usted, por supuesto, debe estar familiarizado con la estructura de datos, pero es relativamente simple en Drupal 6. (aunque horrible en Drupal 7)
fuente
También sugiero
field_attach_update
, y no una consulta directa de SQL, porque sql no actualiza el objeto de caché del nodo, y en su próximonode_load
no cargará el valor del campo actualizado, cargará el valor anteriorfield_attach_update
es mucho mejor que la consulta directa de SQL.fuente
stdClass
objeto sin cargar. ¿Sabes qué podría suceder si intento actualizar el nodo de esta manera sin configurar todos los campos? ¿Se sobrescribirán con nulos o valores predeterminados? ¿Puede ser ignorado por el proceso de actualización?Después de probar todos los enfoques mencionados en las otras respuestas, obtuve tiempos de actualización muy lentos (aproximadamente 7 días para 700,000 nodos de un tipo de nodo con más de 20 campos) hasta que encontré este artículo: http://www.drupalonwindows.com/en/ blog / only-update-changed-fields-or-properties-entity-drupal .
Después de implementar algo como el código a continuación en un hook_update, reduje el tiempo de actualización a 2 horas, lo que creo que es manejable.
fuente
Incluso tenía el mismo requisito de actualizar un campo para todos los nodos de un tipo de contenido en particular. Solía node_load_multiple y field_attach_update .
Lo puse en seco y fue bastante rápido.
fuente
¿Ha considerado hacer estas actualizaciones directamente en la base de datos usando mySQL? Probablemente sea la forma más sencilla y rápida de lograr lo que desea.
Aquí hay un ejemplo simple. Puede ejecutar dicho comando desde la pestaña 'SQL' en phpMyAdmin. Imagine que tiene un tipo de contenido llamado Perfil de miembro. En él tiene un campo llamado 'Tipo de miembro' (por ejemplo, empresa, individuo, organización). Supongamos que desea actualizar todas las ocurrencias de 'EMPRESA' a 'empresa'. El siguiente comando hará exactamente eso.
ACTUALIZAR content_type_member_profile SET
field_type_of_member_value
= 'empresa' WHEREfield_type_of_member_value
= 'EMPRESA';Además, vaya a Comenzar con MySQL
fuente