Respuesta corta: los enlaces ocultos son enlaces a casinos, apuestas o farmacia metidos en el pie, el tema, un widget o entradas antiguas, y escondidos con CSS para que el visitante no los vea. Se encuentran mirando el código de la página (o con un pequeño script en la consola del navegador) y buscando en la base de datos. Se quitan en su origen: tema, widgets, entradas o comentarios, y después hay que averiguar cómo llegaron ahí.
Son muy habituales y muy discretos: la web se ve perfecta, pero en el código hay una lista de enlaces que trabaja para otro. Esta guía forma parte de nuestra guía sobre qué hacer con un WordPress hackeado, y complementa la de spam de casinos y farmacia.
Por qué aparecen enlaces ocultos en tu web
Los enlaces desde webs con autoridad ayudan a posicionar. Quien quiere posicionar un casino o una farmacia online los consigue como puede:
- Hackeo: el atacante entra por un plugin vulnerable o una contraseña y añade los enlaces al tema, a un widget o a entradas antiguas.
- Temas o plugins «nulled» o descargados de webs no oficiales, que traen los enlaces de serie en el pie, a veces codificados para que no se lean a simple vista.
- Comentarios aprobados con enlaces a casinos en el texto o en la web del autor.
- Un antiguo proveedor de SEO que vendía enlaces desde las webs de sus clientes.
El problema no es solo de imagen. Google trata los enlaces ocultos como spam según sus políticas (texto y enlaces ocultos, spam de enlaces): puede ignorar los enlaces de tu web, bajarla en resultados o ponerle una acción manual por «enlaces no naturales desde tu sitio».
Cómo saber si te pasa
Cómo se esconden
Los enlaces suelen estar dentro de un bloque con alguno de estos estilos, que es lo que tienes que buscar:
display:noneovisibility:hiddenfont-size:0uopacity:0- Posición fuera de la pantalla:
left:-9999px,text-indent:-9999px height:0conoverflow:hidden, oclip:rect(0…)- Texto del mismo color que el fondo, o un único punto o espacio como texto del enlace
Comprobación 1: la consola del navegador
Abre la web en una ventana privada, sin sesión iniciada, pulsa F12, ve a «Consola» y pega esto. Te lista los enlaces externos que no se ven en pantalla:
const propio = location.hostname.replace(/^www\./, '');
console.table([...document.querySelectorAll('a[href^="http"]')]
.filter(a => !a.hostname.endsWith(propio))
.filter(a => { const s = getComputedStyle(a), r = a.getBoundingClientRect();
return !a.offsetParent || s.visibility === 'hidden' || +s.opacity === 0 || parseFloat(s.fontSize) === 0 || r.right < 0 || r.width * r.height === 0; })
.map(a => ({ destino: a.href, texto: a.textContent.trim().slice(0, 60) })));
No es infalible (un enlace del mismo color que el fondo no lo detecta), pero encuentra la mayoría. Repítelo en la portada y en las páginas que salen en el menú y en el pie.
Comprobación 2: el código, como visitante y como Googlebot
URL="https://tudominio.com/"
GB="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
curl -s "$URL" | grep -oE 'href="https?://[^"]+"' | grep -v "tudominio.com" | sort | uniq -c | sort -rn
curl -s -A "$GB" "$URL" | grep -oE 'href="https?://[^"]+"' | grep -v "tudominio.com" | sort | uniq -c | sort -rn
Revisa cada dominio externo que no reconozcas. Si los enlaces solo aparecen en la versión de Googlebot, además tienes cloaking.
Comprobación 3: la base de datos y los comentarios
wp db query "SELECT ID, post_type, post_title FROM wp_posts WHERE post_status='publish' AND (post_content LIKE '%casino%' OR post_content LIKE '%viagra%' OR post_content LIKE '%apuestas%' OR post_content LIKE '%display:none%')"
wp db query "SELECT comment_ID, comment_post_ID, comment_author_url FROM wp_comments WHERE comment_approved='1' AND (comment_content LIKE '%casino%' OR comment_author_url LIKE '%casino%' OR comment_content LIKE '%viagra%')"
wp db query "SELECT option_name FROM wp_options WHERE (option_name LIKE 'widget_%' OR option_name LIKE 'theme_mods_%') AND option_value LIKE '%href%'"
Cambia wp_ por tu prefijo (wp db prefix). La última consulta te dice qué widgets y ajustes del personalizador del tema contienen enlaces; ábrelos y revisa cuáles son tuyos.
Comprobación 4: los ficheros del tema
grep -rniE "casino|viagra|apuestas|display: ?none|base64_decode" wp-content/themes/ --include=*.php
Mira con especial atención footer.php, header.php y functions.php. Un tema legítimo no tiene enlaces a casinos ni código codificado en el pie.
Cómo quitar los enlaces ocultos paso a paso
- Haz una copia de ficheros y base de datos antes de tocar nada.
- Localiza el origen exacto con las comprobaciones anteriores: tema, widget, ajuste del personalizador, entrada o comentario.
- Si está en el tema, reinstálalo desde la fuente oficial (WordPress.org o la web del fabricante). Si es un tema hijo, edita a mano el fichero afectado. Si el tema es «nulled», cámbialo: no te puedes fiar del resto del código.
- Si está en un widget o en el personalizador, edítalo desde Apariencia y guarda.
- Si está en entradas, edítalas una a una o, si son muchas con el mismo bloque, con una búsqueda y reemplazo controlada (primero en modo prueba).
- Si está en comentarios, márcalos como spam y revisa la moderación.
- Averigua cómo llegaron: si no es un tema pirata ni un comentario, es un hackeo. Sigue la guía general para encontrar la puerta de entrada.
- Comprueba con la consola y con
curlque han desaparecido, también como Googlebot.
wp search-replace '<div style="display:none">BLOQUE-EXACTO</div>' '' wp_posts --include-columns=post_content --dry-run
wp comment spam 123 456
wp option update comment_moderation 1
wp option update comment_previously_approved 1
Sustituye BLOQUE-EXACTO por el HTML real que encontraste y quita --dry-run solo cuando el número de cambios sea el esperado. Los números del segundo comando son los ID de los comentarios.
Si Google te ha puesto una acción manual por enlaces no naturales, cuando estén todos quitados pide la reconsideración en Search Console explicando qué has hecho.
Cómo evitar que vuelva
- Temas y plugins solo de WordPress.org o del fabricante.
- Moderación de comentarios activada y, si no los usas, comentarios cerrados.
- Actualizaciones al día y fuera los plugins que no uses.
- Si contratas SEO, pregunta qué enlaces van a poner y dónde.
- Revisa los enlaces externos de la portada y del pie de vez en cuando, o vigílalos.
Para agencias: vigilar los enlaces de todas tus webs
Un enlace oculto en el pie no lo ve nadie, ni el cliente ni el equipo. Jeffrey revisa cada día los enlaces externos de la portada y de hasta 4 páginas internas (elegidas del menú y del pie), como visitante y como Googlebot. Avisa en estos casos:
- Un enlace a un dominio de casino, apuestas o póquer, o con términos de farmacia en el texto o en el dominio.
- Un enlace oculto con CSS que lleva a casinos, apuestas o juegos online.
- Tres o más dominios externos distintos detrás de contenido oculto, aunque no parezcan spam («Hay enlaces ocultos a otras webs»).
Si algún enlace raro está oculto o es de farmacia, el aviso es crítico; si no, queda como aviso para revisar. Si la web es de verdad de apuestas o de farmacia (el término está en el título o en el dominio), no se marca.
Con el plugin de Jeffrey instalado, además revisa cada 12 horas las entradas y páginas publicadas más recientes y los comentarios aprobados, y avisa si enlazan a casinos o farmacia: crítico si está en entradas, aviso si solo está en comentarios. Jeffrey no analiza los ficheros del servidor en busca de malware; vigila lo que se publica y lo que se ve.
Preguntas frecuentes
¿Por qué no veo los enlaces si están en mi web?
Porque están escondidos con CSS o solo se sirven a Googlebot. El visitante no los ve, pero los buscadores sí los leen y los cuentan como enlaces de tu web.
¿Pueden estar en el tema aunque nunca me hayan hackeado?
Sí. Es muy típico de los temas y plugins de pago descargados gratis de webs no oficiales. A veces el enlace está codificado en functions.php y se genera al cargar la página, así que no lo encuentras buscando el texto.
¿Me penaliza Google por enlaces que no he puesto yo?
Puede ignorar tus enlaces, bajarte en resultados o ponerte una acción manual por enlaces no naturales desde tu sitio. Si los quitas y explicas lo ocurrido en la solicitud de reconsideración, se suele resolver.
¿Basta con poner los enlaces en nofollow?
No. Si los enlaces no son tuyos, hay que quitarlos y cerrar la vía por la que llegaron. Marcarlos como nofollow los deja ahí y no resuelve el hackeo.