Añadir mu-plugins y scripts de feadulta

This commit is contained in:
2026-06-28 15:10:46 -04:00
parent bce7e42f44
commit b6116b066d
106 changed files with 17600 additions and 2 deletions
+137
View File
@@ -0,0 +1,137 @@
<?php
/**
* fix_image_paths.php
*
* Reescribe rutas relativas Joomla `images/...` en wp_posts.post_content
* a rutas absolutas del site `/fea/wp-content/uploads/...`, pero solo cuando
* el fichero correspondiente existe en /var/www/html/wp-content/uploads/.
*
* Cubre src= y href= con comillas dobles o simples.
* URL-decodifica antes de comprobar el filesystem (mp3 con espacios/tildes).
*
* Issue: rafa/feadulta#34
*
* Usage:
* docker exec wordpress-web php /tmp/fix_image_paths.php --dry-run
* docker exec wordpress-web php /tmp/fix_image_paths.php # live
*/
$dry_run = in_array('--dry-run', $argv ?? []);
$db_host = 'wordpress-mysql';
$db_name = 'wordpress_db';
$db_user = 'wordpress_user';
$db_pass = 'wordpress_pass';
$uploads_fs = '/var/www/html/wp-content/uploads';
$uploads_url = '/fea/wp-content/uploads';
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
echo "=== Fix image paths (Joomla `images/...` → WP uploads) ===\n";
echo $dry_run ? "[DRY RUN]\n\n" : "[LIVE RUN]\n\n";
$stmt = $pdo->query("
SELECT ID, post_title, post_content
FROM wp_posts
WHERE post_status IN ('publish','draft')
AND post_type IN ('post','page')
AND (
post_content LIKE '%src=\"images/%'
OR post_content LIKE \"%src='images/%\"
OR post_content LIKE '%href=\"images/%'
OR post_content LIKE \"%href='images/%\"
)
");
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Posts candidatos: " . count($posts) . "\n\n";
$stats = [
'posts_changed' => 0,
'posts_unchanged' => 0,
'refs_rewritten' => 0,
'refs_missing_file' => 0,
];
$missing = []; // path => count
$missing_per_post = []; // ID => [path,...]
// (src|href)= ( " | ' ) images/... ( " | ' )
$pattern = '/\b(src|href)=("|\')images\/([^"\']+)\2/i';
$update = $pdo->prepare("UPDATE wp_posts SET post_content = ? WHERE ID = ?");
foreach ($posts as $post) {
$original = $post['post_content'];
$pid = (int)$post['ID'];
$content = preg_replace_callback(
$pattern,
function ($m) use ($uploads_fs, $uploads_url, &$stats, &$missing, &$missing_per_post, $pid) {
$attr = $m[1];
$quote = $m[2];
$rel_enc = $m[3]; // tal como aparece en HTML (puede ir URL-encoded)
$rel_dec = urldecode($rel_enc); // para mirar el filesystem
$fs_path = $uploads_fs . '/' . $rel_dec;
if (is_file($fs_path)) {
$stats['refs_rewritten']++;
return $attr . '=' . $quote . $uploads_url . '/' . $rel_enc . $quote;
}
$stats['refs_missing_file']++;
$missing[$rel_dec] = ($missing[$rel_dec] ?? 0) + 1;
$missing_per_post[$pid][] = $rel_dec;
return $m[0]; // dejar sin tocar
},
$original
);
if ($content !== $original) {
$stats['posts_changed']++;
if (!$dry_run) {
$update->execute([$content, $pid]);
}
} else {
$stats['posts_unchanged']++;
}
}
echo "=== Resumen ===\n";
echo "Posts modificados: {$stats['posts_changed']}\n";
echo "Posts sin cambios: {$stats['posts_unchanged']}\n";
echo "Referencias reescritas: {$stats['refs_rewritten']}\n";
echo "Referencias sin fichero: {$stats['refs_missing_file']}\n";
echo "Rutas faltantes únicas: " . count($missing) . "\n";
if (!empty($missing)) {
arsort($missing);
$log_path = '/tmp/fix_image_paths_missing.log';
$lines = [];
foreach ($missing as $path => $n) {
$lines[] = sprintf("%4d %s", $n, $path);
}
file_put_contents($log_path, implode("\n", $lines) . "\n");
echo "\nLog rutas faltantes (orden por #ocurrencias): $log_path\n";
echo "Top 15:\n";
$i = 0;
foreach ($missing as $path => $n) {
echo sprintf(" %4d %s\n", $n, $path);
if (++$i >= 15) break;
}
// breakdown por carpeta raíz (segmento tras `images/`)
$by_root = [];
foreach ($missing as $path => $n) {
$root = explode('/', $path)[0] ?? '?';
$by_root[$root] = ($by_root[$root] ?? 0) + $n;
}
arsort($by_root);
echo "\nFaltantes por carpeta raíz:\n";
foreach ($by_root as $root => $n) {
echo sprintf(" %4d images/%s/\n", $n, $root);
}
}
echo "\nHecho.\n";