Introducción
Importar contenido desde archivos CSV en Drupal 9 o 10 es una necesidad habitual al migrar, actualizar o centralizar contenidos de otros sistemas.
Aunque existen módulos como Feeds, a veces necesitas un control más específico sobre qué tipo de nodo crear, cómo mapear campos personalizados y qué validaciones aplicar.
En este artículo te mostramos cómo crear un script en PHP para importar contenido desde CSV a Drupal, controlando tipo de nodo, campos (incluidos personalizados), taxonomías y más.
Índice
- 1. ¿Cuándo usar código en vez de módulos?
- 2. Preparar el CSV para importar
- 3. Estructura básica de importador en Drupal
- 4. Mapeo de campos personalizados
- 5. Importar relaciones: taxonomías y referencias
- 6. Validación y control de errores
- 7. Conclusión
1. ¿Cuándo usar código en lugar de módulos?
- Necesitas mapear campos no estándar o de múltiples valores
- La fuente CSV cambia su estructura regularmente
- Quieres validar, depurar o registrar cada inserción
- El volumen es tan alto que necesitas paginar o automatizar
2. Preparar tu CSV
Ejemplo mínimo:
title | body | categoria | autor |
---|---|---|---|
Artículo A | Contenido del artículo A | Noticias | admin |
Artículo B | Contenido del artículo B | Eventos | editor |
💡 Puedes guardar en sites/default/files/import/contenido.csv
3. Script base de importación
<?php use Drupal\node\Entity\Node; use Drupal\user\Entity\User; use Drupal\taxonomy\Entity\Term; $csv = fopen('public://import/contenido.csv', 'r'); $headers = fgetcsv($csv); while ($row = fgetcsv($csv)) { $data = array_combine($headers, $row); $node = Node::create([ 'type' => 'articulo', 'title' => $data['title'], 'body' => [ 'value' => $data['body'], 'format' => 'basic_html', ], 'uid' => User::loadByProperties(['name' => $data['autor']]) ? User::loadByProperties(['name' => $data['autor']])->id() : 1, ]); $node->save(); } fclose($csv); ?>
4. Mapear campos personalizados
Si tu tipo de contenido tiene campos propios como field_subtitulo
o field_precio
:
$node->set('field_subtitulo', $data['subtitulo']); $node->set('field_precio', floatval($data['precio']));
Recuerda que los campos deben existir previamente en el tipo de contenido.
5. Importar taxonomías y referencias
Ejemplo para crear o asociar una categoría:
$term = \Drupal::entityTypeManager() ->getStorage('taxonomy_term') ->loadByProperties(['name' => $data['categoria']]); if (!$term) { $term = Term::create([ 'vid' => 'categorias', 'name' => $data['categoria'], ]); $term->save(); } $node->set('field_categoria', reset($term)->id());
6. Validación y control de errores
- ✔️ Validar campos obligatorios como `title` o `body`
- 📄 Registrar errores en archivo o log del sistema
- 🔄 Usar `batch` para importar grandes volúmenes sin agotar memoria
💡 Añade un contador de nodos creados o líneas fallidas
7. Conclusión
Con un importador personalizado puedes controlar cada aspecto del contenido que entra en tu Drupal, garantizar calidad de datos y automatizar tareas repetitivas.
📩 ¿Quieres que creemos un importador a medida con validaciones, logs y cron programado? Escríbenos y lo preparamos para tu sitio.