<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Drupal | Eligeunaweb Agencia de marketing y programación web</title>
	<atom:link href="https://eligeunaweb.es/category/drupal/feed/" rel="self" type="application/rss+xml" />
	<link>https://eligeunaweb.es</link>
	<description>Diseño de paginas web, tiendas online, posicionamiento SEO  y redes sociales</description>
	<lastBuildDate>Sat, 21 Jun 2025 06:05:09 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://eligeunaweb.es/wp-content/uploads/2018/09/favicon.png</url>
	<title>Drupal | Eligeunaweb Agencia de marketing y programación web</title>
	<link>https://eligeunaweb.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cómo recalcular URLs amigables de contenido masivo en Drupal</title>
		<link>https://eligeunaweb.es/como-recalcular-urls-amigables-de-contenido-masivo-en-drupal/</link>
					<comments>https://eligeunaweb.es/como-recalcular-urls-amigables-de-contenido-masivo-en-drupal/#respond</comments>
		
		<dc:creator><![CDATA[eligeunaweb]]></dc:creator>
		<pubDate>Thu, 26 Jun 2025 07:00:00 +0000</pubDate>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Recomendaciones]]></category>
		<guid isPermaLink="false">https://eligeunaweb.es/?p=987610843</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_0 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_0">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_0  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><h3><strong>Introducción</strong></h3>
<p>Las URLs amigables en Drupal mejoran el SEO y la experiencia del usuario. Sin embargo, cuando se realizan cambios masivos en contenido, traducciones o migraciones, pueden quedar desactualizadas.</p>
<p>En este artículo aprenderás a <strong>recalcular URLs amigables (path aliases) en Drupal</strong> de forma segura, usando interfaz, Drush y consultas SQL.</p>

<div style="height:40px;"></div>

<h4>Índice</h4>
<ul>
<li><a href="#quees"><strong>1. Qué son los path aliases en Drupal</strong></a></li>
<li><a href="#cuando"><strong>2. Cuándo es necesario recalcularlos</strong></a></li>
<li><a href="#backend"><strong>3. Recalcular desde el backend</strong></a></li>
<li><a href="#drush"><strong>4. Usar Drush para regenerar aliases</strong></a></li>
<li><a href="#sql"><strong>5. SQL y scripts para automatizar</strong></a></li>
<li><a href="#buenaspracticas"><strong>6. Buenas prácticas</strong></a></li>
<li><a href="#conclusion"><strong>7. Conclusión</strong></a></li>
</ul>

<div style="height:40px;"></div>

<h3 id="quees"><strong>1. ¿Qué son los path aliases?</strong></h3>
<p>Un path alias es la URL amigable que reemplaza la ruta interna de Drupal. Por ejemplo:</p>
<p><code>/node/123</code> → <code>/articulos/como-optimizar-drupal</code></p>

<div style="height:40px;"></div>

<h3 id="cuando"><strong>2. ¿Cuándo recalcularlos?</strong></h3>
<ul>
<li>🔄 Tras migrar contenido masivo</li>
<li>🌐 Al cambiar títulos o estructuras de nodos</li>
<li>🗂️ Tras importar traducciones o actualizaciones de idioma</li>
</ul>

<div style="height:40px;"></div>

<h3 id="backend"><strong>3. Recalcular desde el backend</strong></h3>
<p>En Drupal 8/9/10:</p>
<ul>
<li>Ve a <strong>Configuración &gt; URL aliases</strong>.</li>
<li>Filtra por contenido y elimina aliases obsoletos.</li>
<li>Usa la opción “Bulk Generate” del módulo Pathauto para regenerar.</li>
</ul>

<div style="height:40px;"></div>

<h3 id="drush"><strong>4. Usar Drush</strong></h3>
<p>Drush facilita regenerar aliases sin acceder al panel:</p>
<table>
<thead><tr><th>Comando</th><th>Descripción</th></tr></thead>
<tbody>
<tr><td><code>drush pathauto:alias-rebuild</code></td><td>Regenera todos los aliases según patrones</td></tr>
<tr><td><code>drush cache:rebuild</code></td><td>Recalcula caché tras regenerar</td></tr>
</tbody>
</table>

<div style="height:40px;"></div>

<h3 id="sql"><strong>5. Automatizar con SQL o script PHP</strong></h3>
<p>Puedes eliminar registros viejos de la tabla <code>path_alias</code>:</p>
<pre class="caja-codigo-blog">DELETE FROM path_alias WHERE path LIKE '/node/%';</pre>

<p>Luego, usa Drush para regenerar de forma masiva.</p>

<div style="height:40px;"></div>

<h3 id="buenaspracticas"><strong>6. Buenas prácticas</strong></h3>
<ul>
<li>💾 Haz backup de la base de datos antes de borrar aliases.</li>
<li>🔁 Borra caché después de regenerar.</li>
<li>🔗 Verifica redirecciones para no perder tráfico SEO.</li>
</ul>

<div style="height:40px;"></div>

<h3 id="conclusion"><strong>7. Conclusión</strong></h3>
<p>Recalcular URLs amigables en Drupal garantiza URLs limpias, coherentes y optimizadas para buscadores.</p>
<p>📩 ¿Necesitas ayuda para regenerar aliases en tu proyecto? Contáctanos.</p></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>La entrada <a href="https://eligeunaweb.es/como-recalcular-urls-amigables-de-contenido-masivo-en-drupal/">Cómo recalcular URLs amigables de contenido masivo en Drupal</a> apareció primero en <a href="https://eligeunaweb.es">Eligeunaweb Agencia de marketing y programación web</a>.]]></content:encoded>
					
					<wfw:commentRss>https://eligeunaweb.es/como-recalcular-urls-amigables-de-contenido-masivo-en-drupal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar views o bloques programáticamente en Drupal</title>
		<link>https://eligeunaweb.es/clonar-views-o-bloques-programaticamente-en-drupal/</link>
					<comments>https://eligeunaweb.es/clonar-views-o-bloques-programaticamente-en-drupal/#respond</comments>
		
		<dc:creator><![CDATA[eligeunaweb]]></dc:creator>
		<pubDate>Fri, 30 May 2025 07:00:00 +0000</pubDate>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Recomendaciones]]></category>
		<guid isPermaLink="false">https://eligeunaweb.es/?p=987610684</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_1 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_1">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_1  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_1  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><h3><strong>Introducción</strong></h3>
<p>En proyectos Drupal complejos, muchas veces necesitas duplicar vistas (views) o bloques con ligeras variaciones. Hacerlo manualmente es lento y propenso a errores. Afortunadamente, puedes clonar views o bloques desde código, de forma limpia y controlada.</p>
<p>En esta guía aprenderás cómo <strong>clonar views y bloques programáticamente en Drupal 9/10</strong> usando la API de configuración y la entidad adecuada.</p>

<div style="height:40px;"></div>

<h4>Índice</h4>
<ul>
<li><a href="#views"><strong>1. Cómo clonar una view desde código</strong></a></li>
<li><a href="#yaml"><strong>2. Clonar views exportando YAML y modificando IDs</strong></a></li>
<li><a href="#bloques"><strong>3. Cómo clonar bloques personalizados</strong></a></li>
<li><a href="#configapi"><strong>4. Uso de Config API para duplicación dinámica</strong></a></li>
<li><a href="#usecase"><strong>5. Casos reales donde clonar views o bloques es útil</strong></a></li>
<li><a href="#consejos"><strong>6. Consejos para evitar errores comunes</strong></a></li>
<li><a href="#conclusion"><strong>7. Conclusión</strong></a></li>
</ul>

<div style="height:40px;"></div>

<h3 id="views"><strong>1. Clonar views desde código</strong></h3>
<pre class="caja-codigo-blog">$original = \Drupal::entityTypeManager()
  ->getStorage('view')
  ->load('mi_vista_original');

$clon = $original->createDuplicate();
$clon->set('id', 'mi_vista_clonada');
$clon->set('label', 'Vista Clonada');
$clon->save();</pre>

<p>✔️ Este método duplica toda la configuración sin alterar la original.</p>

<div style="height:40px;"></div>

<h3 id="yaml"><strong>2. Clonar vistas desde YAML</strong></h3>
<ul>
<li>Exporta la view original: <code>drush config:export view.mi_vista</code></li>
<li>Cambia el <code>id</code>, <code>label</code> y el archivo</li>
<li>Importa la nueva: <code>drush config:import</code></li>
</ul>

<p>💡 Ideal para clonar múltiples vistas con variantes pequeñas.</p>

<div style="height:40px;"></div>

<h3 id="bloques"><strong>3. Clonar bloques programáticamente</strong></h3>
<p>Solo aplica a bloques personalizados (tipo basic block):</p>
<pre class="caja-codigo-blog">$original = \Drupal\block_content\Entity\BlockContent::load($id);
$clon = $original->createDuplicate();
$clon->setTitle('Bloque Clonado');
$clon->save();</pre>

<p>🔁 Puedes cambiar el contenido del cuerpo, título o asignación a regiones.</p>

<div style="height:40px;"></div>

<h3 id="configapi"><strong>4. Clonar con Config API</strong></h3>
<p>Usa la clase <code>ConfigFactoryInterface</code>:</p>
<pre class="caja-codigo-blog">$config = \Drupal::configFactory()->getEditable('block.block.mi_bloque');
$data = $config->getRawData();
$data['id'] = 'block.block.mi_bloque_clonado';
\Drupal::service('config.storage')->write('block.block.mi_bloque_clonado', $data);</pre>

<p>🧠 Útil para bloques de configuración reutilizable entre entornos.</p>

<div style="height:40px;"></div>

<h3 id="usecase"><strong>5. Cuándo clonar vistas o bloques</strong></h3>
<ul>
<li>🔄 Para multisitio con configuración base repetida</li>
<li>🧪 En staging o testing con vistas personalizadas</li>
<li>🌐 Reutilizar bloques en múltiples regiones o idiomas</li>
<li>🗂️ Crear versiones A/B de una view sin afectar la original</li>
</ul>

<div style="height:40px;"></div>

<h3 id="consejos"><strong>6. Consejos y precauciones</strong></h3>
<ul>
<li>✅ Siempre cambia el <code>id</code> antes de guardar</li>
<li>🔁 Revisa si hay dependencias (taxonomías, campos, roles)</li>
<li>📤 Usa config export/import para entornos sincronizados</li>
<li>📋 Documenta qué clonas y por qué para mantenimiento futuro</li>
</ul>

<div style="height:40px;"></div>

<h3 id="conclusion"><strong>7. Conclusión</strong></h3>
<p>Clonar views o bloques desde código te da rapidez, control y escalabilidad en entornos Drupal. Ya sea para pruebas, personalizaciones o replicar funcionalidades, esta técnica te ahorra tiempo y errores.</p>
<p>📩 ¿Necesitas un módulo que lo automatice o gestione desde el backoffice? Escríbenos y lo creamos para ti.</p></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>La entrada <a href="https://eligeunaweb.es/clonar-views-o-bloques-programaticamente-en-drupal/">Clonar views o bloques programáticamente en Drupal</a> apareció primero en <a href="https://eligeunaweb.es">Eligeunaweb Agencia de marketing y programación web</a>.]]></content:encoded>
					
					<wfw:commentRss>https://eligeunaweb.es/clonar-views-o-bloques-programaticamente-en-drupal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sincronizar campos personalizados entre nodos en Drupal</title>
		<link>https://eligeunaweb.es/sincronizar-campos-personalizados-entre-nodos-en-drupal/</link>
					<comments>https://eligeunaweb.es/sincronizar-campos-personalizados-entre-nodos-en-drupal/#respond</comments>
		
		<dc:creator><![CDATA[eligeunaweb]]></dc:creator>
		<pubDate>Thu, 22 May 2025 07:00:00 +0000</pubDate>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Recomendaciones]]></category>
		<guid isPermaLink="false">https://eligeunaweb.es/?p=987501827</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_2 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_2">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_2  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_2  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><h3><strong>Introducción</strong></h3>
<p>En proyectos complejos de Drupal, es habitual tener múltiples nodos que deben compartir información o mantener campos sincronizados entre sí. Esto puede ocurrir en sitios multilenguaje, sistemas de fichas de producto, clonado de contenido o cuando se relacionan entidades automáticamente.</p>
<p>En esta guía avanzada te mostramos cómo <strong>sincronizar campos personalizados entre nodos en Drupal 9/10</strong>, utilizando código PHP, servicios del núcleo y estrategias seguras de sincronización.</p>

<div style="height:40px;"></div>

<h4>Índice</h4>
<ul>
<li><a href="#casos"><strong>1. Casos comunes donde sincronizar campos</strong></a></li>
<li><a href="#estructura"><strong>2. Cómo están estructurados los campos en Drupal</strong></a></li>
<li><a href="#acceso"><strong>3. Cómo acceder a campos desde PHP</strong></a></li>
<li><a href="#copiar"><strong>4. Copiar valores simples entre nodos</strong></a></li>
<li><a href="#multiples"><strong>5. Copiar valores múltiples o de referencia</strong></a></li>
<li><a href="#hook"><strong>6. Sincronizar al guardar (hook_entity_presave)</strong></a></li>
<li><a href="#batch"><strong>7. Sincronizar por lote (batch API)</strong></a></li>
<li><a href="#validacion"><strong>8. Validar tipos, formatos y estructuras</strong></a></li>
<li><a href="#errores"><strong>9. Errores comunes y cómo evitarlos</strong></a></li>
<li><a href="#conclusion"><strong>10. Conclusión y recomendaciones</strong></a></li>
</ul>

<div style="height:40px;"></div>

<h3 id="casos"><strong>1. Casos comunes de sincronización</strong></h3>
<ul>
<li>Multilenguaje: sincronizar valores entre versiones de un mismo nodo</li>
<li>Duplicación de contenido (clones)</li>
<li>Sincronización de campos entre tipo A (fichas) y tipo B (resúmenes)</li>
<li>Relaciones entre productos, eventos o autores compartidos</li>
</ul>

<div style="height:40px;"></div>

<h3 id="estructura"><strong>2. Estructura de los campos personalizados</strong></h3>
<p>Los campos están contenidos en objetos <code>FieldItemList</code>. Ejemplo:</p>
<pre class="caja-codigo-blog">$valor = $nodo->get('field_precio')->value;</pre>

<p>✔️ Algunos campos tienen estructura compleja (multivalor, referencias, entity collections).</p>

<div style="height:40px;"></div>

<h3 id="acceso"><strong>3. Acceso a campos entre nodos</strong></h3>
<pre class="caja-codigo-blog">$origen = Node::load($nid_origen);
$destino = Node::load($nid_destino);

$valor = $origen->get('field_precio')->value;
$destino->set('field_precio', $valor);
$destino->save();</pre>

<p>💡 Este ejemplo es básico y sirve como patrón para sincronizar campos.</p>

<div style="height:40px;"></div>

<h3 id="copiar"><strong>4. Copiar campos simples</strong></h3>
<ul>
<li>text (corto o largo)</li>
<li>number (integer, decimal)</li>
<li>boolean</li>
<li>list (textual)</li>
</ul>
<p>💡 Siempre valida que el campo existe antes de copiar.</p>

<div style="height:40px;"></div>

<h3 id="multiples"><strong>5. Copiar campos de múltiples valores o referencias</strong></h3>
<pre class="caja-codigo-blog">$items = $origen->get('field_tags');
$destino->set('field_tags', []);

foreach ($items as $item) {
  $destino->get('field_tags')->appendItem($item->target_id);
}</pre>

<p>✔️ También puedes usar <code>entity_reference_revisions</code> si trabajas con paragraphs.</p>

<div style="height:40px;"></div>

<h3 id="hook"><strong>6. Sincronizar automáticamente al guardar</strong></h3>
<pre class="caja-codigo-blog">function mi_modulo_entity_presave(EntityInterface $entity) {
  if ($entity->getEntityTypeId() === 'node' && $entity->bundle() === 'producto') {
    if ($relacion = $entity->get('field_clon_origen')->target_id) {
      $origen = Node::load($relacion);
      $entity->set('field_precio', $origen->get('field_precio')->value);
    }
  }
}</pre>

<p>✔️ Este ejemplo sincroniza automáticamente el precio al guardar.</p>

<div style="height:40px;"></div>

<h3 id="batch"><strong>7. Sincronizar por lote (batch)</strong></h3>
<p>Ideal para catálogos grandes. Usa la Batch API de Drupal:</p>
<pre class="caja-codigo-blog">$nids = \Drupal::entityQuery('node')->condition('type', 'producto')->execute();

foreach ($nids as $nid) {
  batch_set([...]);
}</pre>

<p>💡 Controla errores, interrumpe si falla, y guarda logs.</p>

<div style="height:40px;"></div>

<h3 id="validacion"><strong>8. Validar tipos y estructuras</strong></h3>
<ul>
<li>✔️ Verifica que ambos nodos tengan el campo</li>
<li>✔️ Compara cardinalidad (simple vs multivalor)</li>
<li>✔️ Usa <code>isEmpty()</code> antes de sobrescribir</li>
</ul>

<div style="height:40px;"></div>

<h3 id="errores"><strong>9. Errores comunes</strong></h3>
<ul>
<li>❌ No cargar el nodo antes de usar <code>get()</code></li>
<li>❌ Sobrescribir campos complejos con valores simples</li>
<li>❌ No validar la existencia del campo en ambos bundles</li>
</ul>

<div style="height:40px;"></div>

<h3 id="conclusion"><strong>10. Conclusión</strong></h3>
<p>Sincronizar campos entre nodos en Drupal requiere entender cómo se estructuran, cómo acceder a ellos, y cuándo intervenir (presave, batch, hook). Con un enfoque organizado puedes automatizar tareas, mantener datos coherentes y ahorrar tiempo en mantenimiento.</p>
<p>📩 ¿Quieres que desarrollemos un módulo personalizado para sincronización masiva o mantener versiones sincronizadas automáticamente? Escríbenos.</p></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>La entrada <a href="https://eligeunaweb.es/sincronizar-campos-personalizados-entre-nodos-en-drupal/">Sincronizar campos personalizados entre nodos en Drupal</a> apareció primero en <a href="https://eligeunaweb.es">Eligeunaweb Agencia de marketing y programación web</a>.]]></content:encoded>
					
					<wfw:commentRss>https://eligeunaweb.es/sincronizar-campos-personalizados-entre-nodos-en-drupal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo importar contenido desde CSV en Drupal 9/10 con control de tipo de nodo y campos</title>
		<link>https://eligeunaweb.es/como-importar-contenido-desde-csv-en-drupal-9-10-con-control-de-tipo-de-nodo-y-campos/</link>
					<comments>https://eligeunaweb.es/como-importar-contenido-desde-csv-en-drupal-9-10-con-control-de-tipo-de-nodo-y-campos/#respond</comments>
		
		<dc:creator><![CDATA[eligeunaweb]]></dc:creator>
		<pubDate>Thu, 15 May 2025 05:00:00 +0000</pubDate>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Recomendaciones]]></category>
		<guid isPermaLink="false">https://eligeunaweb.es/?p=987501799</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section et_pb_section_3 et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_3">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_3  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_3  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><h3><strong>Introducción</strong></h3>
<p>Importar contenido desde archivos CSV en Drupal 9 o 10 es una necesidad habitual al migrar, actualizar o centralizar contenidos de otros sistemas.</p>
<p>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.</p>
<p>En este artículo te mostramos cómo <strong>crear un script en PHP para importar contenido desde CSV a Drupal</strong>, controlando tipo de nodo, campos (incluidos personalizados), taxonomías y más.</p>

<div style="height:40px;"></div>

<h4>Índice</h4>
<ul>
<li><a href="#paso1"><strong>1. ¿Cuándo usar código en vez de módulos?</strong></a></li>
<li><a href="#paso2"><strong>2. Preparar el CSV para importar</strong></a></li>
<li><a href="#paso3"><strong>3. Estructura básica de importador en Drupal</strong></a></li>
<li><a href="#paso4"><strong>4. Mapeo de campos personalizados</strong></a></li>
<li><a href="#paso5"><strong>5. Importar relaciones: taxonomías y referencias</strong></a></li>
<li><a href="#paso6"><strong>6. Validación y control de errores</strong></a></li>
<li><a href="#paso7"><strong>7. Conclusión</strong></a></li>
</ul>

<div style="height:40px;"></div>

<h3 id="paso1"><strong>1. ¿Cuándo usar código en lugar de módulos?</strong></h3>
<ul>
<li>Necesitas mapear campos no estándar o de múltiples valores</li>
<li>La fuente CSV cambia su estructura regularmente</li>
<li>Quieres validar, depurar o registrar cada inserción</li>
<li>El volumen es tan alto que necesitas paginar o automatizar</li>
</ul>

<div style="height:40px;"></div>

<h3 id="paso2"><strong>2. Preparar tu CSV</strong></h3>
<p>Ejemplo mínimo:</p>
<table>
<thead><tr><th>title</th><th>body</th><th>categoria</th><th>autor</th></tr></thead>
<tbody>
<tr><td>Artículo A</td><td>Contenido del artículo A</td><td>Noticias</td><td>admin</td></tr>
<tr><td>Artículo B</td><td>Contenido del artículo B</td><td>Eventos</td><td>editor</td></tr>
</tbody></table>

<p>💡 Puedes guardar en <code>sites/default/files/import/contenido.csv</code></p>

<div style="height:40px;"></div>

<h3 id="paso3"><strong>3. Script base de importación</strong></h3>
<pre class="caja-codigo-blog">&lt;?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);
?&gt;</pre>

<div style="height:40px;"></div>

<h3 id="paso4"><strong>4. Mapear campos personalizados</strong></h3>
<p>Si tu tipo de contenido tiene campos propios como <code>field_subtitulo</code> o <code>field_precio</code>:</p>
<pre class="caja-codigo-blog">$node->set('field_subtitulo', $data['subtitulo']);
$node->set('field_precio', floatval($data['precio']));</pre>

<p>Recuerda que los campos deben existir previamente en el tipo de contenido.</p>

<div style="height:40px;"></div>

<h3 id="paso5"><strong>5. Importar taxonomías y referencias</strong></h3>
<p><strong>Ejemplo para crear o asociar una categoría:</strong></p>
<pre class="caja-codigo-blog">$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());</pre>

<div style="height:40px;"></div>

<h3 id="paso6"><strong>6. Validación y control de errores</strong></h3>
<ul>
<li>✔️ Validar campos obligatorios como `title` o `body`</li>
<li>📄 Registrar errores en archivo o log del sistema</li>
<li>🔄 Usar `batch` para importar grandes volúmenes sin agotar memoria</li>
</ul>

<p>💡 Añade un contador de nodos creados o líneas fallidas</p>

<div style="height:40px;"></div>

<h3 id="paso7"><strong>7. Conclusión</strong></h3>
<p>Con un importador personalizado puedes controlar cada aspecto del contenido que entra en tu Drupal, garantizar calidad de datos y automatizar tareas repetitivas.</p>
<p>📩 ¿Quieres que creemos un importador a medida con validaciones, logs y cron programado? Escríbenos y lo preparamos para tu sitio.</p></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>La entrada <a href="https://eligeunaweb.es/como-importar-contenido-desde-csv-en-drupal-9-10-con-control-de-tipo-de-nodo-y-campos/">Cómo importar contenido desde CSV en Drupal 9/10 con control de tipo de nodo y campos</a> apareció primero en <a href="https://eligeunaweb.es">Eligeunaweb Agencia de marketing y programación web</a>.]]></content:encoded>
					
					<wfw:commentRss>https://eligeunaweb.es/como-importar-contenido-desde-csv-en-drupal-9-10-con-control-de-tipo-de-nodo-y-campos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
