PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $map = [ '/products/platforms-and-end-points' => '/products/iptv-and-digital-signage', '/products/ip-video-streaming' => '/products/video-encoding-and-streaming', '/products/control-room-solutions' => '/products/control-room-platforms', '/products/avoip-distribution-kvm' => '/products/av-over-ip-and-kvm', '/products/graphics-multi-display' => '/products/graphics-and-multi-display', '/products/infrastructure-accessories' => '/products/infrastructure-and-accessories', ]; echo ($apply ? "APPLY\n" : "DRY-RUN\n"); foreach ($map as $oldSlug => $newSlug) { $stub = $pdo->prepare('SELECT uid, title FROM pages WHERE deleted = 0 AND slug = ?'); $stub->execute([$oldSlug]); $stub = $stub->fetch(); if (!$stub) { echo " = $oldSlug: already gone\n"; continue; } $uid = (int)$stub['uid']; $children = (int)$pdo->query("SELECT COUNT(*) FROM pages WHERE deleted = 0 AND pid = $uid")->fetchColumn(); $content = (int)$pdo->query("SELECT COUNT(*) FROM tt_content WHERE deleted = 0 AND pid = $uid")->fetchColumn(); if ($children > 0 || $content > 0) { echo " !! #$uid $oldSlug has $children child page(s) / $content element(s) - SKIPPED, decide manually\n"; continue; } $target = $pdo->prepare('SELECT uid FROM pages WHERE deleted = 0 AND slug = ?'); $target->execute([$newSlug]); $targetUid = (int)($target->fetchColumn() ?: 0); if ($targetUid === 0) { echo " !! target $newSlug not found - #$uid skipped\n"; continue; } $stmt = $pdo->prepare('SELECT COUNT(*) FROM sys_redirect WHERE deleted = 0 AND source_path = ?'); $stmt->execute([$oldSlug]); $hasRedirect = (int)$stmt->fetchColumn(); echo " ~ DELETE #$uid \"{$stub['title']}\" ($oldSlug) -> 301 to $newSlug (#$targetUid)" . ($hasRedirect ? ' [redirect exists, kept]' : '') . "\n"; if (!$apply) { continue; } $pdo->prepare('UPDATE pages SET deleted = 1, tstamp = UNIX_TIMESTAMP() WHERE uid = ?')->execute([$uid]); if (!$hasRedirect) { $pdo->prepare( "INSERT INTO sys_redirect (pid, createdon, updatedon, source_host, source_path, target, target_statuscode) VALUES (0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '*', ?, ?, 301)" )->execute([$oldSlug, 't3://page?uid=' . $targetUid]); } } echo $apply ? "Done. Flush the cache (redirects are cached).\n" : "DRY RUN - add --apply to write.\n";