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.

