Cómo evitar el spam en los formularios de Contact Form 7 en WordPress

Valencia, 13/08/2026, G.B.
Cualquiera que administre un sitio en WordPress con un formulario de contacto conoce el problema: tarde o temprano, la bandeja de entrada empieza a llenarse de mensajes automáticos, ofertas de SEO milagroso o enlaces sospechosos. Contact Form 7, uno de los plugins de formularios más usados del ecosistema WordPress, no incorpora protección antispam por defecto, así que esa tarea recae en quien lo instala. La buena noticia es que evitarlo no requiere grandes conocimientos técnicos, sino combinar bien un puñado de técnicas.

Por qué llega el spam a un formulario de contacto

El spam en formularios no suele venir de personas, sino de bots que rastrean la web en busca de campos <form> y <input> para rellenarlos automáticamente. Cuantos más elementos «adivinables» tenga el formulario (nombre, email, mensaje), más fácil es para un bot completarlo sin intervención humana. Por eso las soluciones eficaces no se basan en dificultar la vida al usuario real, sino en tender trampas o barreras que solo detectan a las máquinas.

El método más eficaz y menos invasivo: el honeypot

La técnica del honeypot consiste en añadir al formulario un campo invisible para las personas pero visible para los bots, que recorren el HTML sin ejecutar el CSS que lo oculta. Si ese campo llega relleno al servidor, se descarta el envío sin más. Contact Form 7 permite implementarlo fácilmente combinando un campo de texto oculto con CSS y una validación en functions.php que rechace el envío si ese campo no está vacío. Es la opción que menos fricción añade, porque no exige nada al usuario legítimo.

Un honeypot («tarro de miel» en castellano) existe en el HTML, así que cualquier bot que analice el código lo detecta como un campo más a rellenar.
Está oculto para las personas, normalmente con CSS (display: none o posicionándolo fuera de la pantalla), así que un usuario real jamás lo ve ni lo rellena, por lo que debería llegar siempre vacío cuando el envío lo hace una persona.

Un bot que rastrea formularios no «ve» el CSS, solo el HTML crudo, así que interpreta ese campo como uno legítimo y lo completa automáticamente (a menudo con texto basura, o incluso su propia URL). En el servidor, la lógica es simple: si ese campo llega con algo escrito, el envío se descarta sin más, porque solo una máquina pudo haberlo rellenado.

Es una trampa en el sentido literal: no impide que el bot rellene el formulario, sino que aprovecha su propio comportamiento automático para delatarlo. Por eso es tan eficaz y tan poco invasivo a la vez —no le pide nada extra al usuario real, solo tiende una trampa que solo un bot puede pisar.

reCAPTCHA: la barrera más conocida

Google reCAPTCHA (en su versión v3, invisible) es la integración nativa de Contact Form 7 y sigue siendo una de las defensas más sólidas frente a bots más sofisticados. Se configura desde el propio panel de Contact Form 7, introduciendo la clave del sitio y la clave secreta que genera Google. Su ventaja es que analiza el comportamiento del visitante en segundo plano, sin mostrar los típicos rompecabezas de «selecciona las imágenes con semáforos», lo que evita perjudicar la conversión.

Validación estricta de campos

Otra capa de protección, complementaria a las anteriores, es endurecer la validación de los campos del formulario: exigir que el campo de email tenga un formato válido, limitar la longitud del mensaje, o bloquear la presencia de etiquetas HTML o enlaces en campos que no deberían contenerlos (el nombre, por ejemplo). Contact Form 7 admite expresiones regulares personalizadas en sus campos, lo que permite filtrar patrones típicos del spam antes de que el mensaje llegue siquiera a enviarse.

Filtrado adicional con Akismet

Si el sitio ya usa Akismet para proteger los comentarios de WordPress, se puede aprovechar el mismo servicio para los formularios: existen extensiones de Contact Form 7 que envían cada envío a Akismet para su análisis antes de reenviarlo por correo. Es un paso extra útil cuando el volumen de spam sigue siendo alto pese al honeypot y el reCAPTCHA.

Qué evitar

Conviene ser prudente con los bloqueos por IP y las limitaciones agresivas de frecuencia de envío: son medidas que, mal calibradas, terminan bloqueando a usuarios legítimos con más facilidad que a los propios bots, que suelen rotar de IP constantemente. Tampoco es necesario desactivar el formulario ni añadir capas de fricción visibles si con un honeypot y reCAPTCHA v3 ya se resuelve la mayor parte del problema.

En resumen

La combinación más razonable para un formulario de Contact Form 7 en WordPress es: honeypot como primera barrera invisible, reCAPTCHA v3 como segunda capa de análisis de comportamiento, y validación de campos para cerrar el paso a los patrones más evidentes de spam. Con estos tres elementos bien configurados, la gran mayoría de los envíos automáticos quedan filtrados sin que el visitante real note ninguna diferencia al escribir su mensaje.

Comandos para configurar Debian desde terminal

Valencia, 13/08/2026, G.B.
Dejo un repaso práctico con comandos que suelen funcionar en Debian actuales para tareas comunes: identificar la versión, actualizar el sistema, configurar red (IP/DNS), revisar historial, gestionar discos, procesos, directorios/ficheros, usuarios y operaciones básicas.

Estructura y puntos principales (índice)

El contenido se divide en 10 bloques, cada uno con comandos concretos y listos para copiar:

  • Identificación del sistema — cat /etc/os-release y cat /etc/debian_version para saber la versión exacta de Debian.
  • Actualización de paquetes — diferencia claramente entre apt update, apt upgrade y apt full-upgrade, explicando que este último puede implicar remociones de paquetes incompatibles; añade autoremove y clean para limpieza de caché.
  • Configuración de red — cubre visualización de interfaces (ip link, ip addr, ip route), asignación temporal de IP y gateway, y edición de /etc/resolv.conf para DNS. Incluye una nota práctica útil: en sistemas donde NetworkManager o systemd-resolved gestionan la red, los cambios manuales al resolv.conf pueden revertirse si no se ajusta también el gestor de red.
  • Historial de comandos — history, borrado selectivo (history -d) y limpieza de pantalla.
  • Discos y particiones — lsblk, fdisk -l, df -h.
  • Procesos — listado con ps aux y terminación de procesos, distinguiendo kill de kill -9.
  • Directorios — operaciones básicas de creación, borrado y navegación.
    Ficheros — creación con touch y concatenación con cat.
  • Usuarios — cambio de contraseña, creación de usuarios, bloqueo de cuentas (passwd -l).
  • Operaciones del sistema — reinicio y apagado.

1) Comprobar sistema y versión de Debian

cat /etc/os-release

Versión específica:

cat /etc/debian_version

2) Actualizar paquetes y sistema

Actualizar listas de paquetes:

sudo apt update

Actualizar paquetes instalados (sin cambios agresivos):

sudo apt upgrade

Actualizar incluyendo dependencias que puedan requerir cambios/remociones (remociones se refiere a desinstalar algunos paquetes que ya no encajan con las nuevas dependencias, o que no se pueden mantener mientras el sistema queda consistente) si es necesario:

sudo apt full-upgrade

Si necesitas limpiar caché:

sudo apt autoremove
sudo apt clean

3) Configurar la red

Ver interfaces y direcciones

ip link
ip addr

Ver la ruta (por dónde sale el tráfico):

ip route

Configuración temporal de IP (para probar)

Asignar IP a una interfaz (temporal, hasta reiniciar o cambiar la configuración persistente):

sudo ip addr add 192.168.1.49/24 dev eth0

Eliminar esa IP:

sudo ip addr del 192.168.1.49/24 dev eth0

Añadir gateway por defecto (si aplica):

sudo ip route add default via 192.168.1.1

Quitar gateway por defecto:

sudo ip route del default via 192.168.1.1

DNS (nameservers)

Editar el fichero de resolución:

sudo nano /etc/resolv.conf

Añadir líneas como:

nameserver 192.168.0.1
nameserver 87.216.1.65

Nota práctica: en algunas instalaciones, /etc/resolv.conf lo gestiona NetworkManager o systemd-resolved. Si al editar “se revierte”, hay que ajustar la configuración en el gestor de red.

4) Historial de comandos

history

Mostrar los últimos 10:

history 10

Borrar historial:

history -c

Borrar una línea concreta (índice del historial):

history -d 342

Borrar la pantalla:

clear

5) Discos y particiones

Listar dispositivos/particiones:

lsblk

Ver particiones con detalle:

sudo fdisk -l

Ver espacio libre y puntos de montaje:

df -h

6) Procesos

Ver procesos en ejecución:

ps aux

Matar un proceso (por PID):

sudo kill -9 <PID>

(Para matar sin -9 cuando sea posible):

sudo kill <PID>

7) Directorios

Crear directorios:

mkdir directorio1 directorio2

Borrar directorio vacío:

rmdir directorio

Borrar directorio no vacío (con cuidado):

rm -r directorio

Mostrar directorio actual:

pwd

Listar contenido:

ls

Listar con permisos y propietarios:

ls -l

Volver al home:

cd ~

8) Ficheros

Crear un archivo vacío:

touch nombrearchivo

Crear un archivo concatenando dos archivos:

cat archivo1 archivo2 > suma

9) Usuarios

Cambiar contraseña del usuario actual:

passwd

Crear un usuario:

sudo useradd pruebas

Establecer contraseña del usuario:

sudo passwd pruebas

Bloquear el acceso por contraseña (bloquear cuenta):

sudo passwd -l pruebas

Mostrar usuarios (lista de /etc/passwd):

cat /etc/passwd

10) Operaciones básicas del sistema

Reiniciar:

sudo reboot

Apagar:

sudo shutdown -h now

Cómo crear un tema hijo en WordPress: el caso de Twenty Seventeen

Child Theme

Si mantienes un sitio en WordPress durante años, tarde o temprano te enfrentas a un problema clásico: has personalizado el CSS, quizás también el header.php, y cada actualización del tema te obliga a repetir esos cambios desde cero. La solución habitual es un tema hijo (o child theme), y en este artículo repaso el proceso completo que he seguido en Indaga.net, incluyendo las dudas que me han surgido por el camino (hacía mucho tiempo que no hacía esto…).

Comentar que todo el proceso sirve para cualquier tema o theme de WordPress, no solo para Twenty Seventeen.

¿Qué es un tema hijo y por qué usarlo?

Un tema hijo es un tema que hereda toda la funcionalidad y las plantillas de otro tema, el «padre», pero permite sobreescribir archivos concretos sin tocar el original. La gran ventaja es que las actualizaciones del tema padre no borran tus personalizaciones, siempre que estén en el sitio correcto.

En mi caso, el tema padre es Twenty Seventeen, y el objetivo principal era mantener un CSS personalizado sin perderlo cada vez que WordPress actualiza el tema.

Estructura mínima necesaria

Contra lo que podría parecer, no hace falta replicar toda la estructura de carpetas del tema padre. Con dos archivos en la raíz ya es suficiente para tener un tema hijo funcional:

wp-content/themes/tema-hijo/
├── style.css
└── functions.php

El stylee.css necesita una cabecera específica que le indica a WordPress cuál es el tema padre:

/*
 Theme Name:   Indaga Child
 Template:     twentyseventeen
 Version:      1.0.0
*/

Y el functions.php se encarga de encolar primero el CSS del padre y después el propio, para que las reglas personalizadas puedan sobreescribir las originales:

<?php
add_action( 'wp_enqueue_scripts', 'indaga_child_enqueue_styles' );
function indaga_child_enqueue_styles() {
    wp_enqueue_style( 'twentyseventeen-parent-style', get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'indaga-child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array( 'twentyseventeen-parent-style' ),
        wp_get_theme()->get('Version')
    );
}

Con esto ya se puede activar el tema hijo desde Apariencia → Temas.

Carpetas opcionales

Solo tiene sentido crearlas si de verdad se van a usar:

  • /assets/css/: para separar el CSS en varios archivos en lugar de amontonarlo todo en style.css.
  • /assets/js/: si se añade JavaScript propio.
  • /inc/: para dividir functions.php en varios archivos PHP si crece mucho.
  • /template-parts/: solo si se van a sobreescribir plantillas concretas del padre (la ruta y el nombre de archivo deben coincidir exactamente con los del tema original para que WordPress detecte la sustitución).
  • /languages/: si se traducen cadenas propias del tema hijo.

La duda del «AdSense desaparecido»

Al activar el tema hijo, me surgió una duda: si tuviera código de AdSense no aparecía en el sitio, y mi primer instinto fue pensar que si lo tuviera, tendría que copiar el header.php del padre al hijo para «recuperarlo».

Aquí está el matiz importante: WordPress hereda automáticamente los archivos de plantilla que el hijo no tiene. Si el tema hijo no incluye su propio header.php, WordPress usa sin más el header.php del tema padre, con todo su contenido, incluyendo cualquier código insertado directamente en él. Así que, en teoría, no debería haber ninguna pérdida solo por activar el hijo.

Antes de tocar nada, conviene descartar por orden:

  1. Caché activa. Con un plugin de caché como WP Fastest Cache, es fácil estar viendo una versión antigua de la página. Vaciar la caché y probar en incógnito resuelve muchos falsos problemas de este tipo
  2. Que el tema activo sea realmente el hijo
  3. Ver el código fuente de la página (Ctrl+U) para comprobar si el fragmento está presente en el HTML aunque no se vea (podría ser un bloqueador de anuncios del propio navegador, no un problema de plantilla)

En este caso concreto, el sitio todavía estaba en fase de revisión y por eso no se mostraban anuncios: no era un problema del tema hijo en absoluto.

¿Qué pasa si actualizo el tema padre?

Esta es probablemente la pregunta más importante de todo el proceso, y la respuesta no es igual para todos los archivos:

  • functions.php del tema hijo: totalmente a salvo. Es un archivo propio, en su propia carpeta, y una actualización del tema padre jamás lo toca.
  • header.php / footer.php editados directamente en el tema padre: aquí está el riesgo real. Si el código de AdSense (o cualquier otra personalización) se editó directamente en el header.php de Twenty Seventeen, una actualización del tema sustituye ese archivo por el original del repositorio, y esos cambios se pierden.

La solución es sencilla: copiar el header.php (y cualquier otro archivo modificado directamente en el padre) a la carpeta del tema hijo, manteniendo el mismo nombre. A partir de ese momento, la herencia de plantillas hace que WordPress use la versión del hijo en lugar de la del padre, y esos archivos quedan protegidos frente a futuras actualizaciones.

El detalle estético: la miniatura en blanco

Un último detalle menor pero visible: al crear el tema hijo desde cero, la miniatura que aparece en Apariencia → Temas queda en blanco. Esto es simplemente porque falta el archivo screenshot.png en la raíz del tema; WordPress no lo genera automáticamente.

Basta con subir una imagen (idealmente en proporción 4:3, por ejemplo 1200×900 px) con ese nombre exacto a la raíz del tema hijo. No requiere ninguna declaración adicional en style.css ni en functions.php; WordPress la detecta solo por estar ahí.

Así es como queda el mío:

child-theme-indaga

Resumen del proceso

  1. Crear style.css y functions.php en wp-content/themes/tema-hijo/ (en mi caso wp-content/themes/indaga/ al haber llamado así al tema hijo o child theme.
  2. Activar el tema hijo desde el escritorio de WordPress.
  3. Antes de dar por buena cualquier «desaparición» de contenido, descartar caché y confirmar el tema activo.
  4. Copiar a la carpeta del hijo cualquier archivo de plantilla (header.php, footer.php, etc.) que se haya editado directamente en el tema padre, para blindarlo frente a actualizaciones.
  5. Añadir un screenshot.png para que la miniatura del tema deje de aparecer en blanco.

Con estos pasos, el sitio queda preparado para recibir actualizaciones de Twenty Seventeen sin sobresaltos, manteniendo intactas todas las personalizaciones (que son bastantes…).

Cómo avisar a tus lectores de que un artículo es antiguo (sin plugins abandonados)

plugin aviso contenido antiguo

Valencia, 13/08/2026, G.B.
Necesitaba un plugin para Indaga.net que avisara a los posibles lectores en el caso de acceder a un artículo con más de 5 años de antigüedad. Busqué en el repositorio de WordPress y encontré alguna opción, pero o llevaba tiempo sin actualizarse o no se ajustaba del todo a lo que quería (control por artículo, umbral configurable, sin dependencias). Así que decidí crear mi propio plugin: Aviso de Contenido Antiguo.

Se trata de un plugin independiente, sin dependencias externas y con estándares de seguridad (nonces, current_user_can, sanitización).

Continuar leyendo «Cómo avisar a tus lectores de que un artículo es antiguo (sin plugins abandonados)»

Qué es un archivo .har y por qué a veces te lo piden cuando algo falla en tu web

archivo .har

Valencia, 12/08/2026, G.B.
Seguro que alguna vez te ha pasado: una página tarda una eternidad en cargar, un formulario no envía los datos o una web se queda a medias, y cuando pides ayuda a un desarrollador, la primera respuesta es: «¿me puedes mandar un archivo .har?»

Si esa pregunta te ha dejado con cara de póker, no eres el único. Vamos a explicarlo con calma, sin tecnicismos innecesarios, porque en el fondo es una herramienta bastante sencilla una vez que entiendes la idea que hay detrás.

La idea, en una frase

Un archivo .har es como la caja negra de un avión, pero de tu navegador. Guarda un registro de absolutamente todo lo que ha pasado mientras cargabas una página web: qué ha pedido el navegador, qué le ha respondido el servidor y cuánto ha tardado cada cosa.

Cada vez que entras en una web, tu navegador no descarga «una página», descarga decenas o incluso cientos de piezas por separado: el texto, las imágenes, las hojas de estilo que le dan color y forma, los scripts que hacen que los botones funcionen, las fuentes tipográficas, los datos que vienen de una base de datos… Un archivo .har apunta cada una de esas idas y venidas, como si fuera el diario de a bordo de esa conversación entre tu navegador y los servidores.

De hecho, el nombre lo dice todo: HAR son las siglas de HTTP Archive, es decir, «archivo de HTTP», el protocolo que usan los navegadores para hablar con los servidores web.

Qué información guarda exactamente

Dentro de un .har puedes encontrar, entre otras cosas:

  • Cada petición que hace el navegador: cuando pide una imagen, un script, una hoja de estilos o unos datos.
  • Cada respuesta que da el servidor a esas peticiones.
  • Los encabezados técnicos de esas peticiones y respuestas, que llevan información sobre el tipo de contenido, el navegador usado, etc.
  • Los tiempos: cuánto ha tardado en cargarse cada elemento, lo que resulta clave para saber dónde está el cuello de botella.
  • El contenido transmitido, a veces incluso el texto o los datos exactos que se han enviado y recibido.
  • Cookies y sesiones, es decir, la información que identifica que has iniciado sesión en un sitio.

Todo esto se guarda en un archivo de texto con formato JSON, así que si lo abres con un editor de texto verás un bloque enorme de datos estructurados. No es para leerlo a simple vista, sino para que lo analicen herramientas específicas o un desarrollador con experiencia.

Cómo se genera, paso a paso

Generar un archivo .har es más fácil de lo que parece, y se puede hacer desde cualquier navegador moderno:

  1. Abre las Herramientas de desarrollador (con la tecla F12 o haciendo clic derecho sobre la página y eligiendo «Inspeccionar»).
  2. Ve a la pestaña Red (o Network, si el navegador está en inglés).
  3. Con esa pestaña abierta, recarga la página para que empiece a registrar toda la actividad desde cero.
  4. Espera a que la página termine de cargar por completo.
  5. Haz clic derecho sobre cualquiera de las peticiones que aparecen en la lista y selecciona una opción similar a «Guardar todo como HAR con contenido».

El nombre exacto de esa opción cambia ligeramente según el navegador, pero la idea es siempre la misma: exportar todo lo que se ha registrado en un único archivo.

Para qué sirve realmente

Puede parecer un archivo muy técnico y, sin embargo, es una de las herramientas más prácticas cuando algo no funciona como debería:

  • Depuración: ayuda a averiguar por qué una página carga despacio o por qué una parte de ella falla directamente.
  • Análisis de rendimiento: permite ver qué elemento concreto es el que más pesa o el que más tarda, ya sea una imagen enorme, un script mal optimizado o una petición que se repite sin necesidad.
  • Diagnóstico compartido: cuando le envías un .har a un desarrollador, no tiene que confiar solo en tu descripción de «se queda cargando» o «me da un error». Puede ver exactamente qué ha pasado en tu navegador, con datos concretos.
  • Optimización: sirve para detectar peticiones innecesarias, rutas ineficientes o recursos que se están cargando más veces de las que deberían.

Un consejo (y una advertencia) antes de compartirlo

Aquí está probablemente el motivo por el que más se usa en el día a día: cuando reportas un problema a un desarrollador, un archivo .har vale más que mil palabras. En vez de intentar describir con precisión qué ha ocurrido, le entregas una prueba objetiva de lo que ha vivido tu navegador.

Ahora bien, precisamente porque registra tanto detalle, conviene tener cuidado con quién comparte ese archivo. Como hemos visto, el .har puede incluir cookies de sesión y otra información que identifica tu cuenta en un sitio web. Antes de enviarlo a alguien, merece la pena revisar que no contenga datos sensibles, o asegurarse de que se lo mandas únicamente a una persona de confianza, como el desarrollador que va a solucionar el problema.

En resumen: la próxima vez que algo falle en una web y te pidan un .har, ya sabes que no es nada del otro mundo. Es, simplemente, el registro fiel de lo que tu navegador ha vivido en esos segundos, convertido en una herramienta que ahorra tiempo, malentendidos y muchas idas y venidas de correos intentando explicar lo inexplicable.

Travel Planner – Comunitat Valenciana

travel planner comunitat valenciana

Travel Planner – Comunitat Valenciana es una herramienta digital interactiva para planificar itinerarios de viaje personalizados en la Comunidad Valenciana. Se trata de un planificador de viajes completamente funcional que permite a los usuarios diseñar sus propias rutas y experiencias turísticas.

Características principales

  • Tipo de herramienta: Planificador de itinerarios interactivo y gratuito
  • Idiomas: Español, Valenciano, Inglés, Francés, Alemán y Chino Simplificado
  • Cobertura geográfica: Toda la Comunidad Valenciana (provincias de Alicante, Castellón y Valencia, con acceso a más de 540 municipios)
  • Búsqueda y filtrado: Avanzados filtros por provincia, municipio, tipo de atracción y subtipo
  • Generación de contenido: Permite crear itinerarios personalizados de múltiples días
  • Exportación de datos: Descarga en formatos PDF, GPX y KML
  • Funciones sociales: Compartir en Facebook, X (Twitter) y WhatsApp
  • Gestión de planes: Visualización de planes públicos, guardado de itinerarios sin registro

Categorías de búsqueda

El planificador permite filtrar por categorías muy diversas:

  • Alojamientos: hoteles, apartamentos, campings, casas rurales, albergues
  • Actividades: turismo activo, deportes acuáticos, senderismo, ciclismo, golf, buceo
  • Naturaleza: playas, espacios naturales, piscinas naturales, observación de aves, astroturismo
  • Cultura: museos, monumentos, patrimonio UNESCO, rutas culturales, arte rupestre
  • Gastronomía: experiencias gastronómicas, enoturismo, restaurantes Michelin
  • Ocio: festivales, parques temáticos, compras
  • Otros: transportes, oficinas de turismo, eventos
  • Público objetivo: Turistas nacionales e internacionales que planean visitar la Comunidad Valenciana

Ventajas principales:

  • Herramienta completamente funcional y gratuita
  • No requiere registro obligatorio para usar
  • Permite organizar automáticamente paradas siguiendo la ruta más corta
  • Acceso a información exhaustiva de más de 540 municipios
  • Multilingüe y accesible desde cualquier dispositivo
  • Utilidad: Ideal para viajeros que desean crear itinerarios personalizados antes de viajar, optimizar rutas y descubrir atractivos por categorías de interés.

https://www.comunitatvalenciana.com/es/travel-planner

Comprehensive guide to .htaccess

Tutorial en inglés del archivo .htaccess. Como esta web ya no está disponible, dejo el enlace de Wayback Machine.

Tutorial written and contributed by Feyd, moderator of the JK Forum, with additions by JavaScriptKit.com. Please see tutorial footnote for additional/bio info on author. Last updated: Nov 28th, 17′

I am sure that most of you have heard of htaccess, if just vaguely, and that you may think you have a fair idea of what can be done with an htaccess file. You are more than likely mistaken about that, however. Regardless, even if you have never heard of htaccess and what it can do for you, the intention of this tutorial is to get you two moving along nicely together.

If you have heard of htaccess, chances are that it has been in relation to implementing custom error pages or password protected directories. But there is much more available to you through the marvelously simple .htaccess file.

https://web.archive.org/web/20200203072928/http://www.javascriptkit.com/howto/htaccess.shtml

Una actualización de «Record of Consent Extension for Complianz» provoca un error crítico en WordPress

Valencia, 11/08/2026, G.B.
Una actualización reciente del plugin Record of Consent Extension for Complianz, el complemento gratuito que añade registro de consentimientos al plugin Complianz, ha dejado inaccesibles varios paneles de administración de WordPress tras instalarse. El fallo se ha detectado en varios sitios, incluidos algunos que gestiono, donde el escritorio de WordPress quedó bloqueado por un error crítico inmediatamente después de la actualización automática del plugin, mientras que la parte pública de las webs siguió funcionando con normalidad.

Cómo se detectó el problema

El síntoma es el clásico «error crítico» de WordPress, pero limitado al escritorio: el acceso a wp-admin se interrumpía por completo, sin más detalle visible para el usuario salvo que ha ocurrido un problema técnico, mientras que la web pública seguía cargando sin incidencias. Al revisar por SFTP la carpeta wp-content/plugins, el plugin con la fecha de modificación más reciente —coincidiendo con el día anterior a la incidencia— resultó ser precisamente esta extensión de Complianz. Renombrar su carpeta (lo que equivale a desactivarlo a la fuerza, ya que WordPress no puede cargar un plugin cuya ruta ha cambiado) restableció el acceso al instante, confirmando que el origen del fallo estaba ahí. Tras verificarlo, se optó por eliminar el plugin directamente en lugar de reactivarlo.

Qué dice el registro de cambios oficial

El historial de versiones publicado en el repositorio de WordPress.org confirma que este no es el primer episodio de errores fatales en el plugin: versiones anteriores tuvieron que corregir expresamente una llamada a un método inexistente que provocaba un error fatal en el almacenamiento de consentimientos, así como un fallo por el que la tabla de base de datos no se creaba durante el asistente de configuración inicial, lo que impedía guardar los registros de consentimiento. Es decir, se trata de un complemento con antecedentes de regresiones críticas entre versiones, algo a tener en cuenta por quienes lo usan en producción.

En el momento de escribir estas líneas, el repositorio oficial de WordPress.org señala la versión 2.1 como la más reciente publicada, sin que se haya localizado en foros o canales públicos un reporte específico que documente esta incidencia concreta con fecha de ayer; es posible que se trate de un problema de compatibilidad puntual con la configuración de PHP, caché o el propio Complianz en los servidores afectados, y no de un fallo generalizado reportado aún por la comunidad.

Qué hacer si os ha pasado lo mismo

Si una web deja de responder justo después de que WordPress actualice automáticamente un plugin, el primer paso es siempre identificar por SFTP o FTP qué carpeta de wp-content/plugins tiene la fecha de modificación más reciente y renombrarla temporalmente (añadiendo, por ejemplo, _OLD al nombre de la carpeta); esto basta para que WordPress lo desactive sin poder acceder al panel, y suele restaurar el acceso en segundos si el plugin es efectivamente el causante. Conviene además revisar los logs de error de PHP del hosting (error_log o el panel de errores que ofrezca el proveedor) para confirmar la causa exacta antes de decidir si se reinstala una versión anterior, se contacta con el soporte del desarrollador o, como en este caso, se opta por eliminarlo y buscar una alternativa.

Import Excel to Table: un plugin de WordPress sin dependencias para convertir un Excel (o una hoja de cálculo) en una tabla con shortcode

NOTA: De los 3 sitios en los que he probado este plugin, solo en Indaga.net (aquí) se recarga la página del plugin después de la importación. No obstante, funciona en todos. Puede que sea un conflicto entre plugins o que los otros sitios utilizan Gutenberg e Indaga,net no; lo veré más adelante…

Lo actualizo a la versión 1.4.1. Ahora también está la opción de mostrar todos los registros.

Valencia, 10/08/2026, G.B.
Hay una necesidad que se repite mucho en sitios WordPress pequeños y medianos: alguien tiene un listado en Excel o en LibreOffice Calc (un directorio de contactos, un catálogo, una lista de recursos) y quiere que aparezca como una tabla navegable en una página web, sin tener que copiar y pegar HTML cada vez que cambian los datos. Para cubrir ese caso he desarrollado Import Excel to Table, un plugin de WordPress que importa archivos .xlsx o .ods a una tabla propia de la base de datos y los muestra mediante shortcode, con ordenación por columna, paginación y enlaces automáticos.

Un ejemplo

TítuloAutorEditorialURL reseña
¡Guardias! ¡Guardias!Terry PratchettRandom House Mondadori, 2008.http://unlibrojuntoalfuego.blogspot.com/2016/01/guardias-guardias-mundodisco-pratchett.html
¡Voto a Bríos! (Jingo)Terry Pratchetthttps://mundodisco.fandom.com/es/wiki/Voto_a_bros!
A la sombra del granado .Tariq Alí.Círculo de lectores
A Stroke of the Pen. The lost StoriesTerry Pratchetthttps://en.wikipedia.org/wiki/A_Stroke_of_the_Pen:_The_Lost_Stories
Abdul Bashur, soñador de navíosÁlvaro Mutis.Círculo de Lectores.https://a7side.com/book/abdul-bashur-sonador-de-navios/
África lloraAlberto Vázquez-Figueroa.Círculo de lectoreshttps://www.casadellibro.com/libro-africa-llora/9788497931700/943432
Al oeste de BabiloniaEduardo Garrigues.Círculo de lectores.https://www.casadellibro.com/libro-al-oeste-de-babilonia/9788401327506/639724
Alexandros I: El hijo del sueño .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-i3a-el-hijo-del-sueno/9788497594400/884139
Alexandros II: Las Arenas de Amón .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-ii-las-arenas-de-amon/9788497594417/884141
Alexandros III: Los Confines del Mundo .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-iii-el-confin-del-mundo/9788497594394/884142
Alí en el país de las maravillasAlberto Vázquez-Figueroa.Plaza & Janéshttps://www.lecturalia.com/libro/5348/ali-en-el-pais-de-las-maravillas
Alice in Wonderland and Through the Looking-Glass and What alice Found thereLewis Carrollhttps://www.goodreads.com/work/quotes/2375385-alice-s-adventures-in-wonderland-through-the-looking-glass-and-what-a
AzazelIsaac Asimov.Cículo de lectores.http://www.lecturalia.com/libro/67454/azazel
Bella y oscuraRosa Monterohttps://www.lecturalia.com/libro/4527/bella-y-oscura
BrujeríasTerry Pratchett.Ver reseña:https://www.casadellibro.com/libro-brujerias-mundodisco-6--las-brujas-2/9788497593182/873695
Buenos días, pereza (Estrategias para sobrevivir en el trabajo )Corinne Maier.Círculo de lectores.http://www.lecturalia.com/libro/49083/buenos-dias-pereza
Cachito (Un asunto de honor)Arturo Pérez-Reverte.Alfaguara de bolsillohttps://www.perezreverte.com/libro/51/un-asunto-de-honor-cachito/
Caperucita en ManhattanCarmen Martín Gaite.Siruela.https://www.actualidadliteratura.com/caperucita-en-manhattan/
Carpe Diem: confesiones de un pollo de barraAlfonso Ussía.S.A. Ediciones B Castellanohttps://www.casadellibro.com/libro-carpe-diem-confesiones-de-un-pollo-de-barra/9788466609753/831217
Carpe Diem: Confesiones de un pollo de barraAlfonso Usía.Círculo de lectoreshttps://www.casadellibro.com/libro-carpe-diem-confesiones-de-un-pollo-de-barra/9788466609753/831217
Carta del fin del mundo - Jose Manuel Fajardo - Ediciones B - 1996.http://www.lecturalia.com/libro/30952/carta-del-fin-del-mundo
CavadoresTerry Pratchett.ebooks#3
CienfuegosAlberto Vázquez-Figueroa.(ver)https://www.casadellibro.com/libro-cienfuegosvol-i/9788497595766/901015
Cienfuegos 2Alberto Vázquez-Figueroa.Círculo de Lectoreshttps://www.casadellibro.com/libro-cienfuegos-2--caribes/mkt0006157410/12058110
Creative Personal BrandingJulen Salenbacherhttps://www.casadellibro.com/libro-creative-personal-branding-la-estrategia-de-marcar-tendencia/9788416583874/5228635

Total de registros: 234

El problema de partida: nada de dependencias externas

La primera versión se apoyaba en PhpSpreadsheet, la librería PHP de referencia para leer hojas de cálculo. Funciona muy bien, pero arrastra una carpeta vendor/ de varios megabytes y miles de archivos pequeños, que hay que generar con Composer e instalar en el servidor. En un hosting compartido con límite de número de archivos —como suele pasar cuando alojas varias webs en el mismo plan— eso puede ser un problema real, y además complica el despliegue si solo tienes acceso por SFTP, sin terminal.

La solución fue reescribir el lector de hojas de cálculo desde cero, apoyándome únicamente en extensiones que ya vienen integradas en PHP: ZipArchive, SimpleXML y DOM. Un archivo .xlsx o .ods no es más que un ZIP con XML dentro, así que se puede leer directamente sin ninguna librería externa. El resultado: cero dependencias, ninguna carpeta que subir aparte del propio plugin, y una copia por SFTP es suficiente para desplegarlo.

Qué hace

  • Importa .xlsx y .ods desde el panel de administración, usando la primera fila del archivo como encabezados de columna.
  • Admite varias importaciones independientes, cada una con su propio identificador. Un directorio de contactos, un catálogo de productos y una lista de recursos pueden convivir en el mismo sitio sin pisarse: reimportar uno de ellos no afecta a los demás.
  • Sustituye los datos de forma transaccional: si la importación falla a mitad de proceso, no se pierden ni los datos antiguos ni se queda la tabla a medias.
  • Muestra cada importación con su propio shortcode, indicando su identificador:

    No hay datos para mostrar (identificador: contactos).

    ,

    No hay datos para mostrar (identificador: catalogo).

    , etc. Pueden convivir varios en la misma página, cada uno con su propio control de orden y paginación, sin interferir entre sí. Con estas funciones:
    • Ordenación por columna (ascendente/descendente).
    • Paginación (25 registros por página por defecto, configurable).
    • Enlaces automáticos: si una celda contiene un correo o una URL —ya sea porque LibreOffice/Excel la convirtió en hipervínculo al escribirla, o simplemente porque el texto tiene forma de email o dirección web—, se muestra como un enlace clicable.
    • Fechas y horas con formato español (DD/MM/AAAA, HH:MM), en lugar del formato ISO interno que usan estos archivos por dentro.
  • Panel de administración con listado de importaciones: identificador, número de registros, fecha de la última importación, el shortcode ya escrito para copiar, vista previa de los datos y borrado individual (o de todas a la vez).
  • Control de acceso opcional: si los datos son sensibles, se puede restringir la visualización a usuarios con sesión iniciada.

Seguridad

Al ser un plugin que acepta subida de archivos y muestra datos en el frontend, se ha cuidado especialmente:

  • Solo usuarios con capacidad manage_options pueden importar o borrar datos, con verificación de nonce (CSRF) en cada acción.
  • El archivo subido se valida por extensión y por tipo MIME real (no basta con renombrar un archivo a .xlsx), con un límite de tamaño de 5 MB.
  • Todo el HTML de salida se escapa correctamente, y tanto los parámetros de ordenación como el identificador de cada importación se validan contra listas seguras antes de usarse en ninguna consulta.
  • Cada registro guardado lleva un hash de integridad que se comprueba al leerlo, como salvaguarda frente a manipulaciones directas de la base de datos.

Compatibilidad

  • WordPress: declarado a partir de la versión 5.0, aunque en la práctica solo usa funciones muy estables de la API ($wpdb, dbDelta(), wp_nonce_field(), add_shortcode()…) disponibles desde mucho antes. Funciona igual con el editor de bloques o con Classic Editor, ya que no depende de Gutenberg.
  • PHP: declarado a partir de 7.4, pero el código en sí no usa ninguna sintaxis exclusiva de PHP 8.x (nada de match(), propiedades readonly, operador nullsafe…), así que en la práctica sería compatible desde PHP 7.0. Probado sin avisos de deprecación hasta PHP 8.3.
  • Extensiones PHP necesarias: zip, SimpleXML, DOM y fileinfo — las cuatro vienen activadas por defecto en la gran mayoría de hostings. Si alguna faltara, el plugin lo detecta y avisa en el panel de administración en vez de fallar en silencio.
  • Actualización sin fricción: si ya tenías datos importados con una versión anterior del plugin (de cuando solo existía una tabla), al actualizar por SFTP se conservan automáticamente bajo el identificador default, y el shortcode

    No hay datos para mostrar (identificador: default).

    sin atributo sigue funcionando exactamente igual que antes.

Plugins similares en el repositorio

Antes de escribir el plugin conviene mirar qué hay ya disponible. En el ecosistema de WordPress existen varias alternativas con un planteamiento parecido, aunque ninguna comparte exactamente el mismo enfoque:

  • wpDataTables — el más completo y establecido del mercado. Importa .xls, .ods y .xlsx y genera tablas totalmente personalizables, con filtros avanzados, gráficos y edición tipo Excel en el frontend. Es mucho más potente que Import Excel to Table, pero también mucho más pesado: es de pago (el plan gratuito es limitado) y no está pensado para minimizar dependencias.
  • WP Convert Excel Data To Table And DB — es el que más se parece en planteamiento: importa el Excel a la base de datos de WordPress, gestiona los registros desde un menú propio y permite editarlos manualmente. No es posible comprobar cómo está construido por dentro, pero conceptualmente es el competidor más cercano.
  • Excel Tables (de WP Missing) — más sencillo: se sube el archivo a la biblioteca de medios, se convierte automáticamente en tabla y se inserta con shortcode. Gratuito y minimalista, pero sin ordenación ni paginación configurables.
  • WP Table Manager — apuesta por sincronizar la tabla de forma continua con el archivo Excel de origen, en vez de hacer una importación puntual.

Ninguno de ellos presume de estar construido sin dependencias externas: lo habitual es que usen PhpSpreadsheet u otra librería similar por debajo. Esa es la principal diferencia de Import Excel to Table frente a las alternativas: mismo resultado funcional que herramientas mucho más grandes, pero sin carpeta vendor/ que instalar, pensado explícitamente para hostings con límite de archivos y despliegue solo por SFTP.

Limitaciones a tener en cuenta

Por ser un lector escrito a mano en lugar de una librería completa, hay algunos casos que no cubre: solo lee la primera hoja del libro, no evalúa fórmulas (toma el último valor calculado guardado en el archivo), y no procesa celdas combinadas ni archivos .xls del formato binario antiguo (hay que convertirlos antes a .xlsx). Para el caso de uso habitual —una o varias tablas de datos simples que se actualizan de vez en cuando— no supone ningún problema.

Un ejemplo insertando el shortcode

TítuloAutorEditorialURL reseña
¡Guardias! ¡Guardias!Terry PratchettRandom House Mondadori, 2008.http://unlibrojuntoalfuego.blogspot.com/2016/01/guardias-guardias-mundodisco-pratchett.html
¡Voto a Bríos! (Jingo)Terry Pratchetthttps://mundodisco.fandom.com/es/wiki/Voto_a_bros!
A la sombra del granado .Tariq Alí.Círculo de lectores
A Stroke of the Pen. The lost StoriesTerry Pratchetthttps://en.wikipedia.org/wiki/A_Stroke_of_the_Pen:_The_Lost_Stories
Abdul Bashur, soñador de navíosÁlvaro Mutis.Círculo de Lectores.https://a7side.com/book/abdul-bashur-sonador-de-navios/
África lloraAlberto Vázquez-Figueroa.Círculo de lectoreshttps://www.casadellibro.com/libro-africa-llora/9788497931700/943432
Al oeste de BabiloniaEduardo Garrigues.Círculo de lectores.https://www.casadellibro.com/libro-al-oeste-de-babilonia/9788401327506/639724
Alexandros I: El hijo del sueño .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-i3a-el-hijo-del-sueno/9788497594400/884139
Alexandros II: Las Arenas de Amón .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-ii-las-arenas-de-amon/9788497594417/884141
Alexandros III: Los Confines del Mundo .Valerio Massimo Manfredi.(ebook).https://www.casadellibro.com/libro-alexandros-iii-el-confin-del-mundo/9788497594394/884142
Alí en el país de las maravillasAlberto Vázquez-Figueroa.Plaza & Janéshttps://www.lecturalia.com/libro/5348/ali-en-el-pais-de-las-maravillas
Alice in Wonderland and Through the Looking-Glass and What alice Found thereLewis Carrollhttps://www.goodreads.com/work/quotes/2375385-alice-s-adventures-in-wonderland-through-the-looking-glass-and-what-a
AzazelIsaac Asimov.Cículo de lectores.http://www.lecturalia.com/libro/67454/azazel
Bella y oscuraRosa Monterohttps://www.lecturalia.com/libro/4527/bella-y-oscura
BrujeríasTerry Pratchett.Ver reseña:https://www.casadellibro.com/libro-brujerias-mundodisco-6--las-brujas-2/9788497593182/873695
Buenos días, pereza (Estrategias para sobrevivir en el trabajo )Corinne Maier.Círculo de lectores.http://www.lecturalia.com/libro/49083/buenos-dias-pereza
Cachito (Un asunto de honor)Arturo Pérez-Reverte.Alfaguara de bolsillohttps://www.perezreverte.com/libro/51/un-asunto-de-honor-cachito/
Caperucita en ManhattanCarmen Martín Gaite.Siruela.https://www.actualidadliteratura.com/caperucita-en-manhattan/
Carpe Diem: confesiones de un pollo de barraAlfonso Ussía.S.A. Ediciones B Castellanohttps://www.casadellibro.com/libro-carpe-diem-confesiones-de-un-pollo-de-barra/9788466609753/831217
Carpe Diem: Confesiones de un pollo de barraAlfonso Usía.Círculo de lectoreshttps://www.casadellibro.com/libro-carpe-diem-confesiones-de-un-pollo-de-barra/9788466609753/831217
Carta del fin del mundo - Jose Manuel Fajardo - Ediciones B - 1996.http://www.lecturalia.com/libro/30952/carta-del-fin-del-mundo
CavadoresTerry Pratchett.ebooks#3
CienfuegosAlberto Vázquez-Figueroa.(ver)https://www.casadellibro.com/libro-cienfuegosvol-i/9788497595766/901015
Cienfuegos 2Alberto Vázquez-Figueroa.Círculo de Lectoreshttps://www.casadellibro.com/libro-cienfuegos-2--caribes/mkt0006157410/12058110
Creative Personal BrandingJulen Salenbacherhttps://www.casadellibro.com/libro-creative-personal-branding-la-estrategia-de-marcar-tendencia/9788416583874/5228635

Total de registros: 234

NOTA: Import Excel to Table nació como una prueba en este mismo sitio, indaga.net, antes de valorar su uso en otros proyectos con necesidades de datos tabulares más específicas.

Descargar archivo .zip que he subido y compartido en mi cuenta de pCloud. Aunque pCloud es seguro, comprueba siempre que los archivos que descargues estén limpios de virus: import-excel-to-table.zip

De la búsqueda semántica a la IA: cómo ha evolucionado Google y qué significa para el SEO

Durante años, el posicionamiento web giró en torno a las palabras clave. Bastaba con identificar los términos que utilizaban los usuarios y optimizar una página para que el buscador la considerara relevante. Sin embargo, la forma en que Google entiende las búsquedas ha cambiado radicalmente.

Hoy, el objetivo ya no es encontrar páginas que contengan determinadas palabras, sino ofrecer la mejor respuesta posible a la necesidad del usuario. En esta evolución, la búsqueda semántica supuso un punto de inflexión y la inteligencia artificial (IA) ha llevado ese concepto un paso más allá.

¿Qué es la búsqueda semántica?

La búsqueda semántica es la capacidad de un motor de búsqueda para interpretar el significado de una consulta, teniendo en cuenta el contexto, la relación entre conceptos y la intención del usuario, en lugar de limitarse a buscar coincidencias exactas entre palabras.

Por ejemplo, si una persona busca «mejor portátil para teletrabajar», Google entiende que probablemente no quiere una definición de «portátil», sino una comparativa, recomendaciones de compra o análisis de equipos adecuados para trabajar desde casa.

Este cambio permitió que los resultados fueran mucho más precisos y útiles, especialmente en consultas formuladas en lenguaje natural.

El contexto es más importante que las palabras

Las personas interpretamos el significado de una conversación gracias al contexto. Sabemos cuándo una palabra tiene varios significados y somos capaces de deducir qué quiere decir nuestro interlocutor.

Los motores de búsqueda han ido desarrollando esa misma capacidad mediante algoritmos capaces de analizar millones de consultas, identificar relaciones entre entidades y comprender cómo se conectan personas, lugares, productos y conceptos.

Gracias a ello, Google puede distinguir entre consultas aparentemente similares y ofrecer resultados adaptados a la intención real del usuario.

La evolución de Google: de las palabras a la comprensión

La transformación de los motores de búsqueda puede resumirse en cuatro grandes etapas.

1. La era de las palabras clave (hasta aproximadamente 2013)

En los primeros años del SEO, el algoritmo se basaba principalmente en la coincidencia entre las palabras escritas por el usuario y las presentes en una página web.

Esto dio lugar a técnicas de optimización que abusaban de la repetición de palabras clave, muchas veces en detrimento de la calidad del contenido.

2. La llegada de la búsqueda semántica (2013-2018)

Con la incorporación de tecnologías capaces de interpretar relaciones entre conceptos, Google empezó a comprender que una misma intención podía expresarse de muchas formas diferentes.

Ya no era imprescindible utilizar exactamente la misma palabra clave para aparecer en los resultados. Lo importante pasó a ser desarrollar un tema de forma coherente y responder adecuadamente a la intención de búsqueda.

3. La inteligencia artificial mejora la comprensión (2019-2022)

Posteriormente, la incorporación de modelos de procesamiento del lenguaje natural permitió a Google entender mucho mejor el contexto completo de una frase.

El buscador dejó de analizar únicamente palabras aisladas para interpretar oraciones completas, matices del lenguaje e incluso consultas conversacionales.

Esto mejoró significativamente la calidad de los resultados para preguntas largas y búsquedas realizadas mediante asistentes de voz.

4. La era de la IA generativa (2023-actualidad)

La llegada de los modelos de lenguaje de gran tamaño (LLM) ha supuesto un nuevo salto evolutivo.

Actualmente, los motores de búsqueda no solo interpretan la consulta, sino que también pueden sintetizar información procedente de múltiples fuentes para generar respuestas directas.

La búsqueda ya no consiste únicamente en mostrar enlaces: cada vez es más frecuente que el usuario obtenga una respuesta elaborada por la IA antes incluso de acceder a una página web.

¿Ha desaparecido la búsqueda semántica?

En absoluto.

La búsqueda semántica sigue siendo la base sobre la que trabajan los sistemas actuales. La inteligencia artificial no la sustituye, sino que amplía sus capacidades.

Mientras que la búsqueda semántica permite comprender:

  • el significado de las palabras;
  • la relación entre conceptos;
  • las entidades (personas, empresas, lugares o productos);
  • la intención del usuario.

La IA añade nuevas funciones como:

  • comprender conversaciones complejas;
  • razonar sobre preguntas con múltiples matices;
  • sintetizar información de distintas fuentes;
  • generar respuestas en lenguaje natural;
  • interpretar conjuntamente texto, imágenes, audio y vídeo.

En otras palabras, la IA utiliza los principios de la búsqueda semántica como punto de partida para ofrecer una experiencia mucho más completa.

¿Qué implica para el SEO?

La evolución de Google ha transformado también la manera de crear contenidos.

Durante años se recomendó optimizar las páginas para determinadas palabras clave. Hoy ese enfoque resulta insuficiente.

Un contenido bien posicionado debe responder con claridad a las necesidades reales del usuario y demostrar conocimiento sobre el tema tratado.

Entre las prácticas que siguen siendo esenciales destacan:

  • escribir pensando en resolver la intención de búsqueda;
  • utilizar un lenguaje natural;
  • desarrollar un tema de forma completa;
  • estructurar correctamente la información mediante encabezados;
  • aportar contenido original y útil;
  • facilitar la comprensión tanto a los usuarios como a los motores de búsqueda.

Además, los datos estructurados y un marcado HTML correcto continúan ayudando a los buscadores a interpretar mejor el contenido y, en determinados casos, a mostrar resultados enriquecidos.

Del SEO al GEO: optimizar para los motores de IA

La aparición de respuestas generadas por inteligencia artificial está dando lugar a nuevos enfoques dentro del posicionamiento web.

Cada vez se habla más de conceptos como Generative Engine Optimization (GEO) o LLM Optimization (LLMO), que buscan optimizar los contenidos para que puedan ser comprendidos, citados y utilizados por los modelos de IA en sus respuestas.

Aunque la terminología todavía está evolucionando, la idea de fondo es clara: el contenido debe estar pensado no solo para ser indexado, sino también para ser interpretado, resumido y referenciado por sistemas de inteligencia artificial.

Esto hace que factores como la claridad, la profundidad, la autoridad de la información y la estructura del contenido adquieran aún más importancia.

Conclusión

La búsqueda semántica no ha desaparecido; simplemente ha evolucionado. Lo que comenzó como un sistema para comprender mejor el significado de las consultas se ha convertido en la base sobre la que trabajan los modernos modelos de inteligencia artificial.

Para quienes crean contenido, el cambio de paradigma es evidente: ya no basta con posicionar palabras clave. El verdadero objetivo consiste en ofrecer la respuesta más útil, fiable y completa posible para cada intención de búsqueda.

En un entorno donde la IA es capaz de generar respuestas directamente en la página de resultados, el contenido de calidad, bien estructurado y respaldado por conocimiento experto seguirá siendo el principal factor diferencial. Las tecnologías cambian, pero la utilidad para el usuario continúa siendo el criterio que guía la evolución de los motores de búsqueda.