What's in Cabo · SEO
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.
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:
/golf-courses/<slug>/. Con el hub en la raíz de esa carpeta el árbol de URLs queda coherente; con el hub en /golf/ el padre vivía en otra rama que sus hijos.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.
| Señal | Antes | Ahora |
|---|---|---|
/golf/ | 200, index, en el sitemap | 301 de un salto a /golf-courses/, fuera del sitemap |
/golf-courses/ | 200, noindex, sin canónica | 200, index, follow, canónica propia, en el sitemap |
| Breadcrumb de las 18 fichas | 11 decían «Restaurants» → /explore/ (noindex), 7 decían /golf/, 0 el hub real | las 18 dicen «Golf Courses» → /golf-courses/ |
Enlaces internos a /golf/ | 2 en el sitio + 1 visible en Cabo Real | 0 en las 26 páginas del sitemap |
llms.txt | apuntaba a /golf/ | apunta al hub |
| Hallazgo | Qué se midió | Cómo quedó |
|---|---|---|
Foto de cabecera de las fichas sin srcset y con lazyload encima | El 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 lenta | LCP 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 mapa | 383 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 iframes | fuera de las 19 páginas; el mapa que se ve sigue ahí |
| Contraste del rótulo terracota | 2,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 foco | 2,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 era | Los 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 fuera | diálogo de verdad, resto de la página inerte, cerrojo de tabulador, Escape devuelve el foco al azulejo |
| Salto de encabezados | H1 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 enlace | H1 → H2 sin saltos, y las tarjetas se nombran por la acción |
| Error de dato en el párrafo más citable | Anunciaba nueve clubes y enumeraba ocho; llamaba «the two Diamante layouts» a tres trazados que la propia página lista | tres trazados, con el Dunes Course, y el recuento cuadra con lo que produce el directorio |
| Taxonomías de golf sin self-canonical | Las 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ías | noindex, follow + canónica propia, como pide el plan |
| «Map & Directions» duplicado | Dos 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 veces | un solo id y un solo encabezado en las 18; ninguna perdió su mapa |
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.
| Comprobación sobre las 18 fichas | Resultado |
|---|---|
Un solo <h1> | 18 de 18 |
| Un mapa visible | 18 de 18 |
id="wicGolfLocation" repetido | 0 de 18 |
| API JS de Google Maps cargando | 0 de 18 |
Cabecera V3 con srcset | las 6 que la tienen |
| Breadcrumb posición 2 = «Golf Courses» → el hub | 18 de 18 |
| Errores de JavaScript | 0 |
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.