What's in Cabo · SEO

Auditoría de golf: los 14 hallazgos, cerrados

De 74 hallazgos, 14 sobrevivieron a la refutación. Los 12 técnicos se corrigieron el 21 de agosto; los 2 que quedaban dependían de una decisión de arquitectura y se cerraron el 22. Todo lo de aquí está medido en la página viva, no deducido del código.

14 / 14hallazgos confirmados, cerrados
5,8 s → 0,36 sLCP de la ficha en móvil
383 KBde Google Maps fuera de 19 páginas
28 → 0enlaces internos al hub retirado

La decisión que faltaba: un solo hub

El vertical estaba partido en dos. /golf-courses/ salía noindex y sin canónica y sin embargo recibía el enlace del menú global desde 25 de las 26 páginas del sitemap. /golf/ era indexable y estaba en el sitemap, pero solo recibía 2 enlaces internos. La puerta que el sitio enseña como vertical de golf estaba fuera del índice, y la que sí era citable se había quedado sin enlaces.

No se podía arreglar a medias: los dos hubs listan los mismos 18 campos, así que dejar ambos en index era canibalización inmediata. Había que elegir uno.

Se unificó en /golf-courses/, y estas son las razones:

El plan nombra /golf/ como hub aprobado, así que esto es una excepción consciente, del mismo tipo que la de /beaches/ (que el plan situaba en /things-to-do/beaches/). Igual que aquella, el hub queda 200, indexable, con canónica propia y en el sitemap. Y es reversible: todo cuelga de una constante en wic-golf-hub-unify.php.

Cómo quedó, medido

SeñalAntesAhora
/golf/200, index, en el sitemap301 de un salto a /golf-courses/, fuera del sitemap
/golf-courses/200, noindex, sin canónica200, index, follow, canónica propia, en el sitemap
Breadcrumb de las 18 fichas11 decían «Restaurants» → /explore/ (noindex), 7 decían /golf/, 0 el hub reallas 18 dicen «Golf Courses» → /golf-courses/
Enlaces internos a /golf/2 en el sitio + 1 visible en Cabo Real0 en las 26 páginas del sitemap
llms.txtapuntaba a /golf/apunta al hub

Lo demás que se cerró

HallazgoQué se midióCómo quedó
Foto de cabecera de las fichas sin srcset y con lazyload encimaEl móvil se bajaba el original de 2048 px y encima esperaba al JavaScript pese al fetchpriority="high". LCP 5,8 s sin frenar la red, 13,1 s con 4G lentaLCP 0,36 s; el navegador pide la variante de 600 px. Las 6 con módulo 3D, Costa Palmas incluida
Google Maps donde no hay mapa383 KB transferidos y 1,35 MB tras descomprimir, el recurso número uno de la página, en el hub y en las 18 fichas. Cero contenedores de mapa JS: los mapas son iframesfuera de las 19 páginas; el mapa que se ve sigue ahí
Contraste del rótulo terracota2,22:1 sobre el bloque verde y 4,21:1 sobre la banda crema (mínimo 4,5:1)5,99:1 sobre el verde y 5,54:1 sobre la banda
Anillo de foco2,26:1 contra la tarjeta blanca, 1,99:1 contra el crema, 1,81:1 contra la banda (mínimo 3:1)indicador de dos tonos: siempre hay uno de los dos que contrasta
El muro de Instagram anunciaba un diálogo que no lo eraLos azulejos decían aria-haspopup="dialog" y el contenedor no tenía ni role ni nombre; dos tabuladores después de abrirlo el foco ya estaba fueradiálogo de verdad, resto de la página inerte, cerrojo de tabulador, Escape devuelve el foco al azulejo
Salto de encabezadosH1 y luego tres H3 antes del primer H2; «Outside-guest tee times» y «Private and member play» existían a la vez como H3 de tarjeta y H2 de sección, con el mismo enlaceH1 → H2 sin saltos, y las tarjetas se nombran por la acción
Error de dato en el párrafo más citableAnunciaba nueve clubes y enumeraba ocho; llamaba «the two Diamante layouts» a tres trazados que la propia página listatres trazados, con el Dunes Course, y el recuento cuadra con lo que produce el directorio
Taxonomías de golf sin self-canonicalLas tres responden 200 con noindex y cero canónica. Rank Math no la emite cuando la URL está en noindex, y el emisor del tema solo cubre SUS taxonomíasnoindex, follow + canónica propia, como pide el plan
«Map & Directions» duplicadoDos copias del mismo bloque con el mismo id —HTML inválido— y dos encabezados iguales. Salen de la configuración del tipo de ficha, donde el bloque está puesto dos vecesun solo id y un solo encabezado en las 18; ninguna perdió su mapa

Dos cosas que solo aparecieron midiendo

Casi borro un mapa visible en 11 páginas. El bloque duplicado parecía markup muerto: en las fichas con módulo 3D las cinco pestañas del tema salen ocultas y solo queda visible Reviews, así que las dos copias son inalcanzables. Pero las 11 fichas sin módulo no funcionan igual: ahí la pestaña Overview sí se ve, y la primera copia vive en su barra lateral — es el único mapa que tienen. Quitar las dos por igual les borraba el mapa. Ahora se retiran las dos solo donde el módulo 3D está activo, y donde no, se conserva la visible y se retira la de la pestaña que nadie puede abrir.

Y una ficha se escapaba de todas las correcciones. El filtro seleccionaba por URL, ^/golf-courses/<slug>/$, y Costa Palmas no está migrada: responde 301 hacia /listing/costa-palmas-golf-club/3232/, así que la ruta nunca casaba. Se quedaba sin srcset, con Google Maps cargando y con el id duplicado. El criterio ahora es el tipo de ficha, que lo llevan las 18, migradas o no.

Barrido final

Comprobación sobre las 18 fichasResultado
Un solo <h1>18 de 18
Un mapa visible18 de 18
id="wicGolfLocation" repetido0 de 18
API JS de Google Maps cargando0 de 18
Cabecera V3 con srcsetlas 6 que la tienen
Breadcrumb posición 2 = «Golf Courses» → el hub18 de 18
Errores de JavaScript0

Lo que queda fuera de esto

Costa Palmas sigue sin migrar a /golf-courses/<slug>/. Las correcciones ya la alcanzan, pero su URL canónica sigue siendo la vieja de /listing/. Es trabajo del carril de fichas, no de este.

La posición 2 del breadcrumb apunta a /explore/ en el resto de verticales. /explore/ es noindex, así que declarar como padre una página fuera del índice es el mismo defecto que tenía golf — solo que en golf estaba confirmado por la auditoría y en los demás no. Son restaurantes, tours, playas, transporte, hoteles y yates. Se arregla igual, con un caso por tipo en wic-breadcrumb-schema.php, pero toca el dato estructurado de 257 fichas y prefiero que lo apruebes antes.