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 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:

titlebodycategoriaautor
Artículo AContenido del artículo ANoticiasadmin
Artículo BContenido del artículo BEventoseditor

💡 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.

Ir al contenido