From 1b72e65a1d6149423023fa6bf0d608447ed4a28d Mon Sep 17 00:00:00 2001 From: Oliver Rasche Date: Wed, 11 Nov 2026 10:56:43 +0100 Subject: [PATCH] 301 fuer die /products-Gruppenordner auf /products (Entscheidung Harry 11.11.) Die 11 Gruppenseiten des Produktbaums wurden am 10.11. im Backend zu Ordnern (doktype 254) und antworteten seitdem 404 (Seobility-Crawl 3: 8 'technische Probleme'). Harry: Absicht -> Migration folder_pages_redirects_20261111 (angewendet) legt 301 auf /products an (mit und ohne Slash) und biegt aeltere Redirects, die auf einen dieser Ordner zeigten, ebenfalls auf /products um. Inhalte auf den Ordnern bleiben unangetastet. Co-Authored-By: Claude Fable 5.1 --- .../folder_pages_redirects_20261111.php | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 migrations/folder_pages_redirects_20261111.php diff --git a/migrations/folder_pages_redirects_20261111.php b/migrations/folder_pages_redirects_20261111.php new file mode 100644 index 0000000..a90ddb3 --- /dev/null +++ b/migrations/folder_pages_redirects_20261111.php @@ -0,0 +1,71 @@ + PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] +); + +echo $apply ? "== APPLY ==\n" : "== DRY RUN (add --apply to write) ==\n"; + +$hasRedirect = $pdo->prepare("SELECT uid, target FROM sys_redirect WHERE deleted = 0 AND source_path = ? LIMIT 1"); +$insertRedirect = $pdo->prepare( + "INSERT INTO sys_redirect (pid, createdon, updatedon, source_host, source_path, target, target_statuscode) + VALUES (0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '*', ?, ?, 301)" +); +$target = '/products'; +$paths = []; +$n = 0; +foreach ($pdo->query("SELECT uid, slug, title, doktype FROM pages WHERE deleted = 0 AND hidden = 0 AND doktype = 254 AND slug LIKE '/products/%' ORDER BY slug") as $p) { + $ce = (int)$pdo->query("SELECT COUNT(*) FROM tt_content WHERE deleted = 0 AND hidden = 0 AND pid = {$p['uid']}")->fetchColumn(); + foreach ([$p['slug'], $p['slug'] . '/'] as $source) { + $hasRedirect->execute([$source]); + $existing = $hasRedirect->fetch(); + if ($existing) { + printf(" #%-4d %-55s (%2d CEs) %s: Redirect existiert -> %s\n", $p['uid'], $source, $ce, $p['title'], $existing['target']); + continue; + } + printf(" #%-4d %-55s (%2d CEs) %s -> %s\n", $p['uid'], $source, $ce, $p['title'], $target); + $n++; + if ($apply) { $insertRedirect->execute([$source, $target]); } + } + $paths[] = $p['slug']; + // Older redirects that point AT this folder (t3://page?uid=… or its slug) + // would now end in a 404 chain: send them to /products as well. + $st = $pdo->prepare("SELECT uid, source_path, target FROM sys_redirect WHERE deleted = 0 AND (target = ? OR target = ? OR target LIKE ?)"); + $st->execute(['t3://page?uid=' . $p['uid'], $p['slug'], 't3://page?uid=' . $p['uid'] . '&%']); + foreach ($st->fetchAll() as $r) { + printf(" redirect #%d %s: Ziel %s -> %s\n", $r['uid'], $r['source_path'], $r['target'], $target); + if ($apply) { $pdo->prepare("UPDATE sys_redirect SET target = ?, updatedon = UNIX_TIMESTAMP() WHERE uid = ?")->execute([$target, (int)$r['uid']]); } + } +} +echo "\n$n Redirect(s) " . ($apply ? 'angelegt' : 'wuerden angelegt') . ".\n"; +echo "SSR-Pfade:\n " . implode("\n ", $paths) . "\n";