Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco

Este repo local tenia origin apuntando al Gitea local (localhost:3000), que Rafa
declaro archivado el 2026-06-28 (commit 962f33a, desarrollo movido a
gitea.feadulta.com). Ese memo nunca llego a este checkout: main quedo congelado
y todo el trabajo real de las ultimas 3+ semanas se fue commiteando solo en la
rama fix/multiidioma-portada-132 (ya fusionada a main sin perdida, commit
2504666), mientras que ademas se acumulaban 78 cambios sin commitear en el
working tree que nunca llegaron a NINGUN historial de git.

Este commit consolida esos cambios sueltos: TTS multi-voz (tts_*.py), scripts
de traduccion (translate_haiku.py, pretranslate_en_haiku.py, sync_translations_to_prod.py),
mu-plugins nuevos desplegados a prod (fea-beta-feedback, fea-cloudflare-realip,
fea-legacy-redirect, fea-gsc-verification, fea-support-campaign, fea-ui, etc.),
scripts de mantenimiento de enlaces/cartas, capturas E2E (tools/e2e/shot_*.cjs)
y documentacion de sesiones recientes.

Excluido deliberadamente (no es codigo versionable): tts-voices/ (3.3GB de
muestras de audio para clonacion de voz, anadido a .gitignore), logs/ (logs de
ejecucion, anadido a .gitignore), y 2 ficheros vacios accidentales + 2 copias
duplicadas sueltas en la raiz que ya existen en su ubicacion correcta.
This commit is contained in:
2026-07-15 20:03:21 -04:00
parent 250466696b
commit 69e849d38e
72 changed files with 5413 additions and 220 deletions
+44
View File
@@ -0,0 +1,44 @@
<?php
/**
* Convierte los enlaces internos `...?p=<id>` de las cartas (grupo Polylang) a
* su permalink "bonito" por slug. Necesario cuando se arreglaron los enlaces de
* la carta con los artículos en DRAFT: get_permalink() devolvía `?p=<id>`, que
* el parser de portada (fea_url_to_post_id, resuelve por slug) NO reconoce → los
* artículos no salían en sus secciones. Con los posts ya en publish, get_permalink
* da el slug. Solo datos, sin tocar mu-plugins. Dry-run por defecto.
*
* Uso: CARTA=<es_id> php prettify_carta_links.php (dry-run)
* APPLY=1 CARTA=<es_id> php prettify_carta_links.php
*/
require getenv('FEA_WP_LOAD') ?: '/var/www/html/wp-load.php';
$APPLY = getenv('APPLY') === '1';
$CARTA = (int)(getenv('CARTA') ?: 0);
if (!$CARTA) { fwrite(STDERR, "Falta CARTA=<es_id>\n"); exit(1); }
$BAK = "/tmp/prettify_carta_bak"; if ($APPLY) @mkdir($BAK, 0777, true);
$tot = 0;
foreach (pll_get_post_translations($CARTA) as $lang => $pid) {
$post = get_post($pid); if (!$post) continue;
$chg = 0;
$new = preg_replace_callback('~href="([^"]*[?&]p=(\d+)[^"]*)"~i', function($m) use (&$chg) {
$id = (int) $m[2];
$url = get_permalink($id);
if (!$url || strpos($url, '?p=') !== false) return $m[0]; // sigue feo → dejar
$chg++;
return 'href="' . esc_url($url) . '"';
}, $post->post_content);
echo sprintf("#%d [%s] «%s» — %d enlaces ?p= → slug\n", $pid, $lang, mb_substr($post->post_title,0,28), $chg);
$tot += $chg;
if ($APPLY && $chg) {
file_put_contents("$BAK/$pid.html", $post->post_content);
wp_update_post(['ID'=>$pid, 'post_content'=>$new]);
clean_post_cache($pid);
}
}
// Invalida los transients de secciones de la portada para que recoja los cambios.
if ($APPLY) {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_fea_carta_sections_%'");
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_fea_carta_sections_%'");
}
echo ($APPLY ? "APLICADO" : "DRY-RUN") . ": $tot enlaces.\n";