GEO con Drupal: Guía completa de implementación
intermediateDrupal implementa GEO via tres módulos: Metatag (para meta tags y Open Graph), Schema.org Metatag (para generación de JSON-LD) y Simple XML Sitemap (para soporte de lastmod). Configura robots.txt en el directorio público para permitir crawlers de IA. La salida HTML estática de Drupal es nativamente rastreable.
GEO con Drupal: Guía completa de implementación
Drupal implementa GEO via tres módulos: Metatag (para meta tags y Open Graph), Schema.org Metatag (para generación de JSON-LD) y Simple XML Sitemap (para soporte de lastmod). Configura robots.txt en el directorio público para permitir crawlers de IA. La salida HTML estática de Drupal es nativamente rastreable.
Drupal renderiza HTML server-side por defecto, haciéndolo nativamente compatible con los crawlers de IA. El trabajo principal de GEO es la configuración de módulos y robots.txt.
Módulos requeridos
Instala via Composer:
composer require drupal/metatag
composer require drupal/schema_metatag
composer require drupal/simple_sitemap
drush en metatag schema_metatag simple_sitemap -y
drush cr
Configuración del módulo Metatag
El módulo Metatag gestiona todos los meta tags, Open Graph y fechas de artículo.
Ruta de configuración: Admin → Configuración → Búsqueda y metadatos → Metatags
Defaults globales
Establece estos defaults que aplican a todos los tipos de contenido:
Título: [node:title] | [site:name]
Descripción: [node:summary]
URL canónica: [node:url]
Pestaña Open Graph (OG)
OG: Tipo: article
OG: Título: [node:title]
OG: Descripción: [node:summary]
OG: URL: [node:url]
OG: Nombre del sitio: [site:name]
OG: Imagen: [node:field_image:entity:url]
OG: Locale: es_ES
Article tags (críticos para recencia)
Article: Tiempo publicado: [node:created:html_datetime]
Article: Tiempo modificado: [node:changed:html_datetime]
Article: Autor: [node:author:url]
Article: Sección: [node:field_category:entity:name]
Nota: [node:created:html_datetime] produce formato ISO 8601 (2026-04-18T00:00:00+00:00) que es correcto para las señales de recencia de GEO.
Schema.org Metatag para JSON-LD
El módulo Schema.org Metatag añade datos estructurados JSON-LD. Después de activarlo, ve a Admin → Configuración → Búsqueda y metadatos → Metatags → Editar (para el tipo de contenido Article).
Configuración del JSON-LD Article
En la pestaña Schema.org, configura el schema Article:
@type: Article
headline: [node:title]
description: [node:summary]
datePublished: [node:created:html_datetime]
dateModified: [node:changed:html_datetime]
author @type: Person
author name: [node:author:display-name]
author url: [node:author:url]
publisher @type: Organization
publisher name: [site:name]
publisher logo url: https://misitio.com/logo.png
mainEntityOfPage @id: [node:url]
Esto genera JSON-LD completo para cada nodo Article automáticamente.
robots.txt
El robots.txt de Drupal está en el directorio raíz de Drupal. Edítalo para añadir los crawlers de IA:
# Crawlers de IA — requerido para GEO
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Claude-User
Allow: /
User-agent: Claude-SearchBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: BingBot
Allow: /
# Reglas existentes de Drupal abajo
User-agent: *
Crawl-delay: 10
Disallow: /admin/
Disallow: /comment/reply/
Disallow: /filter/tips
Disallow: /node/add/
Disallow: /search/
Disallow: /user/register/
Disallow: /user/password/
Disallow: /user/login/
Disallow: /user/logout/
Sitemap: https://misitio.com/sitemap.xml
Sitemap: https://misitio.com/llms.txt
Importante: Para hosting gestionado (Acquia, Pantheon, etc.) donde no puedes editar robots.txt directamente, usa el módulo robots.txt que añade gestión via UI.
llms.txt via módulo personalizado
Crea un módulo personalizado simple para servir llms.txt:
<?php
// web/modules/custom/geo_llms/geo_llms.routing.yml
geo_llms.txt:
path: '/llms.txt'
defaults:
_controller: '\Drupal\geo_llms\Controller\LlmsController::generate'
requirements:
_access: 'TRUE'
<?php
// web/modules/custom/geo_llms/src/Controller/LlmsController.php
namespace Drupal\geo_llms\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Response;
class LlmsController extends ControllerBase {
public function generate(): Response {
$site_name = \Drupal::config('system.site')->get('name');
$site_slogan = \Drupal::config('system.site')->get('slogan');
$base_url = \Drupal::request()->getSchemeAndHttpHost();
// Obtener nodos publicados
$query = \Drupal::entityQuery('node')
->condition('status', 1)
->sort('changed', 'DESC')
->range(0, 30)
->accessCheck(TRUE);
$nids = $query->execute();
$nodes = \Drupal\node\Entity\Node::loadMultiple($nids);
$output = "# {$site_name}\n";
$output .= "> {$site_slogan}\n\n";
$output .= "## Contenido principal\n";
foreach ($nodes as $node) {
$title = $node->getTitle();
$url = $node->toUrl()->setAbsolute()->toString();
$summary = $node->hasField('body') ? strip_tags($node->get('body')->summary) : '';
$output .= "- [{$title}]({$url}): {$summary}\n";
}
return new Response($output, 200, ['Content-Type' => 'text/plain']);
}
}
Configuración de Simple XML Sitemap
Después de activar el módulo:
- Admin → Configuración → Búsqueda y metadatos → Simple XML Sitemap
- Activa todos los tipos de contenido que quieres indexar
- Establece regeneración a “On entity save” — esto actualiza lastmod automáticamente
- Establece prioridad para diferentes tipos de contenido (0.9 para guías principales, 0.7 para posts)
El módulo genera /sitemap.xml con <lastmod> del timestamp changed de la entidad de Drupal.
Checklist GEO para Drupal
- Módulo Metatag: instalado y configurado con Open Graph y article dates
- Schema.org Metatag: schema Article con publisher y fechas
- robots.txt: los 8 crawlers de IA explícitamente permitidos
- llms.txt: endpoint creado (módulo personalizado o archivo estático)
- Simple XML Sitemap: configurado con lastmod para todos los tipos de contenido
- Regeneración del sitemap en entity save activada
- URL canónica configurada en el módulo Metatag
- Campo descripción/summary del artículo completado para todos los nodos
- Pirámide invertida: respuesta en el primer párrafo del campo body
- Core Web Vitals: LCP < 2.5s, INP < 200ms, CLS < 0.1