[P1] 36 cartas traducidas en 500 tras el cutover: url_to_postid() se traía las 32.311 entradas #191
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Estado: código arreglado y desplegado. Queda una acción manual para Inma: purgar la caché de Cloudflare.
Salió al repasar los logs del día siguiente al cutover (#180), no en la verificación en caliente.
El síntoma
36 URLs devolvían 500: las mismas 9 «cartas de otras semanas» en los 4 idiomas traducidos. En español las 9 iban bien.
Era una regresión nuestra, no algo heredado: las mismas URLs contra CDMON respondían 200. Comprobado una a una contra las dos IPs.
Impacto real bajo para las personas —el 3-ago solo hubo 3 visitas a esas URLs, las tres de bingbot— pero Bing y Google están recorriendo el sitio y se llevaban 36 páginas en 500.
La causa
fea-homepage.phpreescribe los enlaces internos al idioma activo, y para eso llamaba aurl_to_postid()una vez por enlace. Estas cartas traen unos 40.url_to_postid()acaba construyendo unaWP_Querya partir de las reglas de reescritura. Cuando la URL no encaja en ninguna, la query se queda sin cláusula que la acote:Las 32.311 entradas con su contenido entero, dos veces por petición. Los 256 MB de PHP se agotaban en
class-wpdb.php:2322y Apache devolvía el 500.Encaja con el patrón: el filtro se salta el español (
if (!$lang || $lang === 'es') return), que es justo el idioma que no fallaba, y solo actúa enis_singular().El arreglo
Commit
78879aeenfeat/mu-plugins-no-versionados. Documento:docs/cutover/500-cartas-traducidas-url-to-postid.md.Se sustituye
url_to_postid()porfea_href_a_post_id(): la estructura es/%postname%/, así que basta el último segmento del path y una consulta conLIMIT 1, que no puede degenerar por rara que sea la URL. Cacheado por petición.El
ORDER BYno es cosmético, reproduce a quién sirve WordPress esa misma URL:post_datemás recienteEl primer intento ordenaba por
ID ASCy en esos 58 casos habría traducido el enlace equivocado, sin dar ningún error.Verificación
fea_href_a_post_id()vsurl_to_postid()— 61 slugs repetidos + 400 al azarperformance_schemaLos enlaces se siguen reescribiendo, y algunos más que antes:
url_to_postid()fallaba en URLs que sí resuelven bien por slug. Verificado contra CDMON que los pares nuevos son de verdad la misma entrada (mismo grupo de traducción de Polylang):como-bendecir-la-mesa→comment-benir-la-table,felices-6→heureux,3-temario→programme, y tres más.Centinelas
carta-trad-itycarta-trad-frañadidas atools/e2e/sites/www.json.🔴 Pendiente: purgar la caché de Cloudflare (Inma)
No lo puedo hacer yo: el token
FEA_CF_API_TOKENsolo tiene permiso de DNS.POST /zones/{id}/purge_cachedevuelve10000 Authentication error. (El token además caduca el 15-ago-2026.)Tampoco puedo comprobar si de verdad hace falta: Cloudflare devuelve 403 a nuestras IPs para cualquier hostname de feadulta, así que no podemos leer la cabecera
cf-cache-statusdesde aquí. Lo que sí sabemos es que el plan es Free, donde Cloudflare no cachea HTML por defecto y no cachea respuestas 5xx, así que lo más probable es que no haya nada cacheado. Purgar es inocuo de todos modos y quita la duda.Cómo hacerlo: panel de Cloudflare → zona
feadulta.com→ Caching → Configuration → Purge Cache → Custom Purge → URL. Cabe un máximo de 30 URLs por operación, así que van en dos tandas.Las 36 URLs
Si te resulta más cómodo, «Purge Everything» también vale: en este sitio la caché son estáticos y se rehace sola.
⚠️ Para la próxima
url_to_postid()no es seguro con URLs arbitrarias en un sitio grande. El comentario que ya había en el fichero decía que en los listados agotaba memoria, y por eso se había acotado ais_singular(). La cura se quedó corta: el problema no era el listado, era la función.Y una trampa de método: esto no se reproduce con wp-cli. Polylang no instancia su clase de frontend en CLI, así que el filtro sale antes de tiempo y no pasa nada. Se cazó mirando
performance_schema.events_statements_history_longen MySQL mientras se pedía la página por HTTP, que da la secuencia real de sentencias de la petición.Caché de Cloudflare purgada — verificado desde fuera
Hecha la acción manual que quedaba pendiente (Inma, 11-ago). Purga completa de la zona
feadulta.comdesde el panel.Verificación de la purga: el mismo asset pedido dos veces devuelve
cf-cache-status: MISSy luegoHIT— caché vaciada y repoblándose desde el origen.Las URLs del incidente ya responden 200, comprobadas con sus enlaces reales siguiendo redirecciones:
También 200 en el cluster de «El tesoro está ya en nosotros» (en/fr/it/pt). Ni un 500.
De paso, sanidad general tras la purga: portada, la carta en curso («Vemos fantasmas y son personas») y
/numeros/responden 200.Por nuestra parte se puede cerrar.