getHost(); $base = rtrim($request->getSchemeAndHttpHost(), '/'); $isHub = str_contains($host, 'pressekonto'); $xml = Cache::remember('web.sitemap-news.'.$host, self::CACHE_TTL_SECONDS, function () use ($base, $isHub): string { $entries = $isHub ? [] : $this->entries($base); return view('web.sitemap-news', ['entries' => $entries])->render(); }); return response($xml, 200, ['Content-Type' => 'application/xml; charset=UTF-8']); } /** * @return list */ private function entries(string $base): array { $context = WebPortalContext::fromRequest(); $publication = (string) StructuredData::publisher($base)['name']; // Bei Doppelveröffentlichung nur die Erstquelle (Anhang 2, 1c.8) — // Google News spielt ohnehin nur eine Fassung aus. $assigner = app(CanonicalAssigner::class); $releases = PressRelease::query() ->withoutGlobalScope(PortalScope::class) ->visibleInArchive() ->forPortalValues($context->portalValues) ->when($assigner->enabled(), fn ($query) => $query->whereNull('canonical_press_release_id')) ->where('published_at', '>=', now()->subHours(self::WINDOW_HOURS)) ->orderByDesc('published_at') ->limit(self::MAX_URLS) ->get(['id', 'slug', 'title', 'portal', 'language', 'category_id', 'canonical_press_release_id', 'published_at']); $entries = []; foreach ($releases as $release) { if (! $assigner->isCanonicalOn($release, $context->portal)) { continue; } $edition = in_array($release->language, SetEdition::EDITIONS, true) ? $release->language : SetEdition::DEFAULT_EDITION; $entries[] = [ 'loc' => $base.'/'.$edition.'/press-release/'.$release->slug, 'publication' => $publication, 'language' => $edition, 'published_at' => (string) $release->published_at?->toAtomString(), 'title' => (string) $release->title, ]; } return $entries; } }