Files
feadulta/scripts/generate_k2_redirects.php
T

198 lines
6.6 KiB
PHP

<?php
/**
* generate_k2_redirects.php
*
* Populates wp_fg_redirect table with 301 redirect entries for all K2 items
* migrated to WordPress.
*
* Joomla K2 URL pattern: /es/[menu]/NNN-alias.html
* Stored in wp_fg_redirect as: NNN-alias.html
* FG plugin matches via LIKE '%NNN-alias.html' fallback.
*
* Also adds redirects for K2 categories → WP categories.
*
* Usage: php generate_k2_redirects.php [--dry-run]
*/
$dry_run = in_array('--dry-run', $argv ?? []);
// DB config - WordPress
$wp_host = 'wordpress-mysql';
$wp_db = 'wordpress_db';
$wp_user = 'wordpress_user';
$wp_pass = 'wordpress_pass';
// DB config - Joomla
$jm_host = 'joomla-mysql';
$jm_db = 'joomla_db';
$jm_user = 'joomla_user';
$jm_pass = 'joomla_pass';
$wp_pdo = new PDO("mysql:host=$wp_host;dbname=$wp_db;charset=utf8mb4", $wp_user, $wp_pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$jm_pdo = new PDO("mysql:host=$jm_host;dbname=$jm_db;charset=utf8mb4", $jm_user, $jm_pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
echo "=== Generate K2 Redirects → wp_fg_redirect ===\n";
echo $dry_run ? "[DRY RUN]\n\n" : "[LIVE RUN]\n\n";
// -------------------------------------------------------------------------
// Step 1: Build K2 ID → alias map from Joomla
// -------------------------------------------------------------------------
echo "Loading K2 items from Joomla...\n";
$stmt = $jm_pdo->query("SELECT id, alias FROM ew4r_k2_items WHERE alias != '' AND alias IS NOT NULL");
$k2_aliases = [];
foreach ($stmt as $row) {
$k2_aliases[(int)$row['id']] = $row['alias'];
}
echo " K2 items loaded: " . count($k2_aliases) . "\n";
// -------------------------------------------------------------------------
// Step 2: Load WP postmeta: K2 ID → WP post ID
// -------------------------------------------------------------------------
echo "Loading WP postmeta (_fgj2wp_old_k2_id)...\n";
$stmt = $wp_pdo->query("
SELECT pm.meta_value AS k2_id, pm.post_id AS wp_id
FROM wp_postmeta pm
JOIN wp_posts p ON pm.post_id = p.ID
WHERE pm.meta_key = '_fgj2wp_old_k2_id'
AND p.post_type = 'post'
");
$k2_to_wp = [];
foreach ($stmt as $row) {
$k2_to_wp[(int)$row['k2_id']] = (int)$row['wp_id'];
}
echo " WP posts with K2 ID: " . count($k2_to_wp) . "\n\n";
// -------------------------------------------------------------------------
// Step 3: Check existing redirects to avoid duplicates
// -------------------------------------------------------------------------
echo "Loading existing redirects...\n";
$existing = [];
$stmt = $wp_pdo->query("SELECT old_url FROM wp_fg_redirect");
foreach ($stmt as $row) {
$existing[$row['old_url']] = true;
}
echo " Existing entries: " . count($existing) . "\n\n";
// -------------------------------------------------------------------------
// Step 4: Build and insert K2 item redirects
// -------------------------------------------------------------------------
echo "Building K2 item redirects...\n";
$insert = $wp_pdo->prepare("
INSERT IGNORE INTO wp_fg_redirect (old_url, id, type, activated)
VALUES (?, ?, 'post', 1)
");
$stats = ['inserted' => 0, 'skipped_no_alias' => 0, 'skipped_no_wp' => 0, 'skipped_exists' => 0];
// Process in batches
$batch = [];
foreach ($k2_to_wp as $k2_id => $wp_id) {
if (!isset($k2_aliases[$k2_id])) {
$stats['skipped_no_alias']++;
continue;
}
$alias = $k2_aliases[$k2_id];
$old_url = $k2_id . '-' . $alias . '.html';
if (isset($existing[$old_url])) {
$stats['skipped_exists']++;
continue;
}
$batch[] = [$old_url, $wp_id];
}
echo " Redirects to insert: " . count($batch) . "\n";
if (!$dry_run) {
$wp_pdo->beginTransaction();
try {
foreach ($batch as [$old_url, $wp_id]) {
$insert->execute([$old_url, $wp_id]);
$stats['inserted']++;
if ($stats['inserted'] % 1000 === 0) {
echo " ... {$stats['inserted']} inserted\n";
$wp_pdo->commit();
$wp_pdo->beginTransaction();
}
}
$wp_pdo->commit();
} catch (Exception $e) {
$wp_pdo->rollBack();
echo "ERROR: " . $e->getMessage() . "\n";
exit(1);
}
} else {
$stats['inserted'] = count($batch);
// Show first 5 samples
echo "\n Sample entries:\n";
foreach (array_slice($batch, 0, 5) as [$old_url, $wp_id]) {
echo " $old_url → post ID $wp_id\n";
}
}
// -------------------------------------------------------------------------
// Step 5: K2 category redirects
// -------------------------------------------------------------------------
echo "\nBuilding K2 category redirects...\n";
// Load K2 categories from Joomla
$stmt = $jm_pdo->query("SELECT id, alias FROM ew4r_k2_categories WHERE published=1");
$k2_cats = [];
foreach ($stmt as $row) {
$k2_cats[(int)$row['id']] = $row['alias'];
}
echo " K2 categories: " . count($k2_cats) . "\n";
// Load WP term IDs for K2 categories via postmeta equivalent
// FG plugin stores category mapping in wp_term_meta or wp_termmeta
$stmt = $wp_pdo->query("
SELECT tm.term_id, tm.meta_value AS k2_cat_id
FROM wp_termmeta tm
WHERE tm.meta_key = '_fgj2wp_old_k2_category_id'
");
$k2_cat_to_wp = [];
foreach ($stmt as $row) {
$k2_cat_to_wp[(int)$row['k2_cat_id']] = (int)$row['term_id'];
}
echo " WP categories with K2 ID: " . count($k2_cat_to_wp) . "\n";
$insert_cat = $wp_pdo->prepare("
INSERT IGNORE INTO wp_fg_redirect (old_url, id, type, activated)
VALUES (?, ?, 'category', 1)
");
$cat_inserted = 0;
foreach ($k2_cat_to_wp as $k2_cat_id => $wp_term_id) {
if (!isset($k2_cats[$k2_cat_id])) continue;
$alias = $k2_cats[$k2_cat_id];
// K2 category URL: /es/[alias] or /es/k2-items/[alias]
$old_url = $alias . '.html';
if (isset($existing[$old_url])) continue;
if (!$dry_run) {
$insert_cat->execute([$old_url, $wp_term_id]);
}
$cat_inserted++;
}
echo " Category redirects: $cat_inserted\n";
// -------------------------------------------------------------------------
// Summary
// -------------------------------------------------------------------------
echo "\n=== Results ===\n";
echo "K2 item redirects inserted: {$stats['inserted']}\n";
echo "Skipped (no alias): {$stats['skipped_no_alias']}\n";
echo "Skipped (no WP post): {$stats['skipped_no_wp']}\n";
echo "Skipped (already exists): {$stats['skipped_exists']}\n";
echo "Category redirects: $cat_inserted\n";
echo "\nTotal in wp_fg_redirect now:\n";
if (!$dry_run) {
$count = $wp_pdo->query("SELECT COUNT(*) FROM wp_fg_redirect")->fetchColumn();
echo " $count entries\n";
}
echo "\nDone.\n";