Caso real 01 · SEO técnico · multilingüe

Google mostraba otra página en lugar de la home: SEO técnico en un WordPress multilingüe

Cinco señales contradictorias —schema, hreflang, enlaces a staging, buscador y llms.txt— que hacían que Google entendiera mal la arquitectura del sitio. Diagnóstico y corrección desde el código, sin añadir un solo plugin.

Caso real, cliente anonimizado. El nombre del cliente, las personas y los datos internos se omiten por confidencialidad. Las cifras salen de logs, Search Console, GA4 y del propio código. Si un dato de negocio no se midió, no aparece.
5señales técnicas corregidas
555 → 1coincidencias vs. filas reales a tocar
0plugins nuevos
100 %del sitio con x-default correcto
Contexto

El punto de partida.

Sitio corporativo con varios idiomas, un plugin de traducción, Rank Math como plugin de SEO y Elementor como page builder. Todo aparentemente en orden: sitemaps limpios, sin errores graves en Search Console y buen rendimiento.

El detonante fue algo que cualquiera nota: al buscar la marca, Google mostraba como resultado principal una página de producto en lugar de la home. Tomé ese síntoma como punto de partida para auditar todas las señales que el sitio le enviaba a Google sobre su propia estructura.

Síntomas observados

  • En búsquedas de marca, una página de producto aparecía en el lugar de la home.
  • La prueba de resultados enriquecidos mostraba un BreadcrumbList en la home con dos niveles: «Inicio → Producto».
  • El hreflang x-default no apuntaba de forma consistente a la versión por defecto en todas las plantillas.
  • Algunas páginas publicadas enlazaban al entorno de staging.
  • El buscador interno devolvía páginas de agradecimiento, variantes de formularios y landings marcadas como noindex.
Diagnóstico

Hipótesis descartadas antes de tocar nada.

Lo que parecía obvio y no era. Descartar bien ahorra días de trabajo en la dirección equivocada.

Penalización o acción manual

Search Console no mostraba acciones manuales y el resto de páginas mantenía posiciones.

Canonical mal configurado

La home tenía un canonical autorreferenciado correcto. El problema no estaba ahí.

Contenido duplicado entre home y producto

Los textos eran distintos y la página de producto no competía por la marca en su contenido.

Implementación

Qué hice, paso a paso.

Leer lo que el sitio declara

Revisé el JSON-LD real de la home, no el configurado en el plugin. Convivían dos grafos: el de Rank Math y un BreadcrumbList a medida que situaba la home dentro de la sección de producto.

Breadcrumb de una sola miga

La home queda como raíz con un único ListItem, y anulé el grafo paralelo del plugin solo en la portada, sin tocar el resto del sitio.

Hreflang en el punto correcto

En lugar de parchear plantillas, corregí el x-default con el filtro que expone el propio plugin de traducción. Un cambio, todo el sitio.

Enlaces a staging con bisturí

El dry-run del search-replace encontró 555 coincidencias; 554 estaban en logs de seguridad y de correo, que son históricos y no se tocan. Solo una fila de contenido tenía los 4 enlaces rotos, dentro del JSON escapado de Elementor.

Buscador interno propio

Sustituí la búsqueda nativa por un mu-plugin con puntuación de relevancia, más tipos de contenido y exclusión de todo lo marcado como noindex (11 entradas en ese momento).

llms.txt curado

Reemplacé el archivo virtual autogenerado por uno estático: resumen del producto, jerarquía de páginas y unos 55 enlaces priorizados en lugar de un volcado de URLs.

Bajo el capó

El código que importa.

Fragmentos simplificados y sin datos del cliente, para que se vea el enfoque técnico real.

Anular el schema del plugin solo en la homephp
add_filter( 'rank_math/json_ld', function ( $data, $jsonld ) {
    if ( is_front_page() ) {
        return array(); // la home emite un único BreadcrumbList propio
    }
    return $data;
}, 99, 2 );
Reemplazo acotado a tablas de contenidobash
# 1. Medir sin tocar nada
wp search-replace 'staging.example' 'www.example' --all-tables --dry-run --report-changed-only
# 2. Ejecutar solo donde vive el contenido
wp search-replace 'staging.example' 'www.example' wp_posts wp_postmeta --precise
wp elementor flush_css && wp cache flush
Decisiones

Por qué así y no de otra forma.

No usar --all-tables en el reemplazo

Los logs de seguridad y de correo son registros de auditoría. Reescribirlos falsea el historial y no aporta nada.

Buscador propio en vez de un plugin de búsqueda

El requisito era concreto (relevancia + exclusión de noindex) y un plugin genérico añadía tablas, índices y mantenimiento.

llms.txt estático

El archivo generado listaba URLs sin jerarquía. Uno curado a mano comunica mejor qué es el producto y qué páginas importan.

Resultado

Qué cambió, con datos verificables.

IndicadorAntesDespuésContexto
Breadcrumb de la homeInicio → ProductoSolo Inicioreindexación solicitada
Hreflang x-defaultInconsistenteTodo el sitioun filtro, no parches
Enlaces a staging4 en 1 página0sin tocar 554 filas de logs
Noindex en el buscador11 visibles0regla general
llms.txtVolcado automático~55 enlaces curadosarchivo estático

Cómo lo validé

  • Rich Results Test sobre la home: un único BreadcrumbList válido.
  • Inspección de URL en Search Console y solicitud de reindexación.
  • Revisión del hreflang renderizado en cada idioma.
  • Dry-run del reemplazo con resultado esperado: 1 fila.
Lo que me llevo

Cuando Google «elige» una página rara, casi siempre se lo está diciendo el propio sitio. Antes de tocar contenido, reviso qué declaran el schema, el canonical y el hreflang tal y como se renderizan.

  • WordPress
  • Elementor
  • Plugin de traducción
  • Rank Math
  • WP-CLI
  • Search Console
Para tu web

Checklist rápida: ¿te está pasando lo mismo?

  • ¿Cuántos grafos JSON-LD emite realmente cada plantilla?
  • ¿El breadcrumb de la home tiene un solo nivel?
  • ¿El x-default apunta a la versión por defecto en todas las plantillas?
  • ¿Hay URLs de staging dentro del JSON de page builders?
  • ¿El buscador interno respeta el noindex?
¿Te suena?

¿Tienes un problema parecido?

Preguntas frecuentes

Dudas habituales sobre este tipo de problema.

¿Un error de schema puede hacer que Google muestre otra página en lugar de la home?

Sí. El marcado estructurado no posiciona por sí solo, pero Google lo usa para entender la jerarquía. Un breadcrumb que coloca la home dentro de otra sección es una señal contradictoria.

¿Por qué no usar un search-replace sobre todas las tablas?

Porque también reescribe logs, sesiones y datos serializados que no son contenido. Medir primero y acotar después es más seguro y más limpio.

¿Sirve de algo el llms.txt?

No sustituye al SEO, pero un archivo curado ayuda a los asistentes de IA a entender qué es el producto. Un volcado automático de URLs aporta muy poco.

WordPress · SEO técnico · IA

Cuéntame qué está frenando tu web.

Si ya tienes un WordPress en producción, reviso el contexto y te digo con honestidad si lo que necesitas es desarrollo, SEO técnico, rendimiento o automatización.