), garantindo que a declaracao XML seja o primeiro byte. ob_start(); require_once __DIR__ . '/config.php'; require_once __DIR__ . '/functions.php'; $base = defined('URL_BASE') ? URL_BASE : ''; /** @var array $urls */ $urls = [ ['loc' => $base . '/', 'freq' => 'weekly', 'pri' => '1.0'], ['loc' => $base . '/jogos/', 'freq' => 'weekly', 'pri' => '0.9'], ['loc' => $base . '/ferramentas/', 'freq' => 'weekly', 'pri' => '0.8'], ['loc' => $base . '/blog/', 'freq' => 'weekly', 'pri' => '0.8'], ['loc' => $base . '/sobre/', 'freq' => 'monthly', 'pri' => '0.7'], ['loc' => $base . '/politicas/', 'freq' => 'monthly', 'pri' => '0.5'], ]; try { $pdo = conectarBD(); // Jogos com pagina publica $stmt = $pdo->query("SELECT slug, data_atualizacao, data_criacao FROM jogos WHERE status IN ('disponivel','em_breve') ORDER BY slug"); foreach ($stmt->fetchAll() as $j) { $urls[] = [ 'loc' => $base . '/jogos/?slug=' . rawurlencode($j['slug']), 'freq' => 'weekly', 'pri' => '0.7', 'lastmod' => $j['data_atualizacao'] ?: $j['data_criacao'], ]; } // Ferramentas online (tem pagina propria) $stmt = $pdo->query("SELECT slug, data_criacao FROM ferramentas WHERE status='disponivel' AND tipo='online' ORDER BY slug"); foreach ($stmt->fetchAll() as $f) { $urls[] = [ 'loc' => $base . '/ferramentas/arquivos/' . rawurlencode($f['slug']) . '/', 'freq' => 'monthly', 'pri' => '0.6', 'lastmod' => $f['data_criacao'], ]; } // Posts do blog publicados (um por slug) $stmt = $pdo->query("SELECT slug, MAX(data_publicacao) AS dt FROM blog_posts WHERE publicado = 1 GROUP BY slug ORDER BY dt DESC"); foreach ($stmt->fetchAll() as $p) { $urls[] = [ 'loc' => $base . '/blog/post.php?slug=' . rawurlencode($p['slug']), 'freq' => 'monthly', 'pri' => '0.6', 'lastmod' => $p['dt'], ]; } // Documentos de politicas/EULAs publicados (um por slug) $stmt = $pdo->query("SELECT slug, MAX(data_atualizacao) AS dt FROM politicas_documentos WHERE publicado = 1 GROUP BY slug ORDER BY slug"); foreach ($stmt->fetchAll() as $d) { $urls[] = [ 'loc' => $base . '/politicas/documento.php?slug=' . rawurlencode($d['slug']), 'freq' => 'monthly', 'pri' => '0.5', 'lastmod' => $d['dt'], ]; } } catch (Throwable $e) { // Se o banco falhar, ainda servimos as paginas estaticas. error_log('Erro ao gerar sitemap: ' . $e->getMessage()); } // Descarta saida acidental dos includes e emite XML limpo. while (ob_get_level() > 0) { ob_end_clean(); } if (!headers_sent()) { header('Content-Type: application/xml; charset=utf-8'); header('X-Robots-Tag: noindex'); // o sitemap em si nao deve ser indexado } echo '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' . "\n"; echo '' . "\n"; foreach ($urls as $u) { echo " \n"; echo " " . htmlspecialchars($u['loc'], ENT_XML1, 'UTF-8') . "\n"; if (!empty($u['lastmod'])) { $ts = strtotime((string)$u['lastmod']); if ($ts) { echo " " . date('Y-m-d', $ts) . "\n"; } } echo " " . $u['freq'] . "\n"; echo " " . $u['pri'] . "\n"; echo " \n"; } echo '' . "\n";