hreflang: Grusch apuntaba al artículo equivocado, y el tool no sabía retirar
La pareja decía que «David Grusch at the Capitol» (el acto del 9 de junio de 2026) y «El testimonio de David Grusch» (la comparecencia jurada de julio de 2023) son el mismo artículo en otro idioma. Son dos hechos con tres años de diferencia. El espejo real es grusch-capitolio-9-junio-2026, publicado un día después del acto y con extensión pareja. Se coló porque las 16 parejas se validaron por firma de título, y con casos históricos el año identifica el hecho, pero con NOTICIAS el mismo protagonista vuelve. Revisadas a fondo las otras 15 con ese criterio —abriendo los dos artículos, no comparando títulos—: correctas. Las dos de noticia que quedaban (222 archivos y la segunda desclasificación) se publicaron el MISMO DÍA en los dos sitios y con extensión casi idéntica, que es la firma de una pareja real. Y el arreglo destapó un agujero: `cambios()` solo escribía las parejas del fichero, así que repuntar una dejaba la anterior declarada por su lado. Se habría quedado el ES de 2023 señalando a un EN que ya no le señala a él. `huerfanos()` recorre ahora todo el corpus y retira nuestro bloque de quien ha dejado de estar en la lista; `desmarca()` quita solo lo nuestro. Aplicado y verificado en la web pública: 3 posts, las dos páginas de la pareja nueva declaran las dos versiones y el ES de 2023 se queda sin hreflang, que es lo correcto porque no hay artículo inglés sobre esa comparecencia. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+34
-2
@@ -104,7 +104,39 @@ def trae(site, slugs):
|
||||
posts = json.load(open(path))["posts"]
|
||||
finally:
|
||||
os.unlink(path)
|
||||
return {p["slug"]: p for p in posts if p["slug"] in slugs}
|
||||
return {p["slug"]: p for p in posts if slugs is None or p["slug"] in slugs}
|
||||
|
||||
|
||||
def desmarca(actual):
|
||||
"""Quita NUESTRO bloque y deja intacto lo demás. Devuelve None si no había."""
|
||||
actual = actual or ""
|
||||
if INICIO not in actual or FIN not in actual:
|
||||
return None
|
||||
limpio = re.sub(re.escape(INICIO) + r".*?" + re.escape(FIN), "", actual, flags=re.S)
|
||||
return re.sub(r"\n{3,}", "\n\n", limpio).strip()
|
||||
|
||||
|
||||
def huerfanos(parejas):
|
||||
"""Posts que llevan nuestro bloque y YA NO están en ninguna pareja SI.
|
||||
|
||||
Sin esto, repuntar una pareja deja media declaración viva. Pasó con Grusch
|
||||
el 2026-07-29: el ES de la comparecencia de 2023 estaba emparejado por error
|
||||
con el EN del acto de 2026, y al corregirlo el ES viejo se habría quedado
|
||||
señalando a un artículo que ya no le señala a él. Un hreflang que no es
|
||||
recíproco Google lo ignora, pero el que sobra sigue afirmando algo falso.
|
||||
|
||||
Se busca en TODO el corpus, no solo en los slugs de las parejas: el que hay
|
||||
que limpiar es justamente el que ha dejado de estar en la lista.
|
||||
"""
|
||||
fuera = []
|
||||
for site, dentro in (("en", {a for a, _ in parejas}), ("es", {b for _, b in parejas})):
|
||||
for slug, p in trae(site, None).items():
|
||||
if slug in dentro:
|
||||
continue
|
||||
limpio = desmarca(p.get("codeinjection_head"))
|
||||
if limpio is not None:
|
||||
fuera.append((site, p, limpio))
|
||||
return fuera
|
||||
|
||||
|
||||
def cambios():
|
||||
@@ -126,7 +158,7 @@ def cambios():
|
||||
nuevo = fusiona(p.get("codeinjection_head"), blq)
|
||||
if nuevo != (p.get("codeinjection_head") or ""):
|
||||
plan.append((site, p, nuevo))
|
||||
return plan, avisos, parejas
|
||||
return plan + huerfanos(parejas), avisos, parejas
|
||||
|
||||
|
||||
def violaciones(post, site, parejas=None):
|
||||
|
||||
Reference in New Issue
Block a user