chore(verify): recuperar enum_urls.php y commitear tooling de verificación #121

El enumerador de URLs no se había commiteado y se perdió. Recuperado
reproduciendo la composición de la corrida previa (menús×5 idiomas +
categorías con contenido + contenido no-ES). Se añade también
classify_gaps.py (clasifica huecos: traducir vs descargar) y run_all.sh.
Outputs y .venv quedan en .gitignore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 08:30:18 -04:00
parent 863a3c6677
commit 66ee943da4
10 changed files with 582 additions and 0 deletions
+88
View File
@@ -0,0 +1,88 @@
<?php
/**
* enum_urls.php — Enumera las URLs del sitio para el crawler de verificación (#121).
*
* Recuperado 2026-06-22 (el original no se había commiteado y se perdió). Reproduce
* la composición de la corrida previa: menús×5 idiomas + categorías con contenido +
* todo el contenido no-ES (el ES masivo ~24k se omite por volumen).
*
* Uso (dentro del contenedor, carga wp-load):
* docker cp enum_urls.php wordpress-web:/tmp/ && \
* docker exec wordpress-web php /tmp/enum_urls.php && \
* docker cp wordpress-web:/tmp/verify_urls.json urls.json
*
* Salida: /tmp/verify_urls.json — array de {url, lang, kind, id}.
*/
require_once '/var/www/html/wp-load.php';
$LANGS = ['es', 'en', 'fr', 'it', 'pt'];
$out = [];
$seen = [];
function add(&$out, &$seen, $url, $lang, $kind, $id) {
$url = trailingslashit($url);
$k = $lang . '|' . $url;
if (isset($seen[$k])) return;
$seen[$k] = true;
$out[] = ['url' => $url, 'lang' => $lang, 'kind' => $kind, 'id' => (int) $id];
}
// ── 1) MENÚ: 31 rutas base × 5 idiomas ───────────────────────────────────────
// Rutas del menú principal (wp_navigation ID 1). Para no-ES se prefija /{lang}/;
// el crawler sigue redirecciones cross-idioma y las marca.
$menu_paths = [
'', 'colaboradores', 'portal', 'paraponeraldialafe', 'category/cartasemana',
'category/carta-semana-pasada', 'category/cartas-de-otras-semanas',
'nueva-politica-de-privacidad', 'contactar', 'alta', 'alta-en-effa', 'escuela',
'category/cartas-que-nos-llegan', 'category/tablon-de-anuncios',
'category/asociacion-feadulta', 'numeros', 'category/comunidades-cristianas',
'evangelio-diario-2024', 'category/indice-cronologico',
'category/evangelios-y-comentarios', 'oraciones-eucaristicas', 'a-modo-de-salmo',
'preces-y-oraciones-varias', 'te-creia-un-capricho-mas', 'autores-lista', 'temas',
'multimedia', 'pensamientos', 'indice-cantoral', 'peliculas', 'in-memoriam',
];
$home = home_url('/'); // .../fea/
foreach ($LANGS as $lang) {
$prefix = ($lang === 'es') ? $home : $home . $lang . '/';
foreach ($menu_paths as $p) {
add($out, $seen, $p === '' ? $prefix : $prefix . $p, $lang, 'menu', 0);
}
}
// ── 2) CATEGORÍAS con contenido ──────────────────────────────────────────────
// ES: todas las categorías hide_empty. no-ES: solo las que tienen traducción.
$terms = get_terms(['taxonomy' => 'category', 'hide_empty' => true]);
foreach ($terms as $t) {
$link = get_term_link($t);
if (!is_wp_error($link)) add($out, $seen, $link, 'es', 'category', $t->term_id);
if (function_exists('pll_get_term')) {
foreach (['en', 'fr', 'it', 'pt'] as $lang) {
$tr = pll_get_term($t->term_id, $lang);
if ($tr) {
$l = get_term_link((int) $tr, 'category');
if (!is_wp_error($l)) add($out, $seen, $l, $lang, 'category', $tr);
}
}
}
}
// ── 3) CONTENIDO no-ES (posts publicados en en/fr/it/pt) ─────────────────────
foreach (['en', 'fr', 'it', 'pt'] as $lang) {
$q = new WP_Query([
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'lang' => $lang,
'no_found_rows' => true,
]);
foreach ($q->posts as $pid) {
add($out, $seen, get_permalink($pid), $lang, 'content', $pid);
}
}
file_put_contents('/tmp/verify_urls.json', json_encode($out, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
$by = [];
foreach ($out as $r) { $by[$r['kind']] = ($by[$r['kind']] ?? 0) + 1; }
fwrite(STDERR, 'enum: ' . count($out) . ' URLs ' . json_encode($by) . "\n");