Seobility-Report 2026-11-10: Backend-Befunde umgesetzt
Crawl nach dem Footer-Fix: 1.094 Seiten (vorher 9). Backend-Anteil:
- Migration seo_report_fixes_20261110: Platzhalter-SEO-Titel auf /solutions
geleert; News mit verdoppeltem Titel/Slug und Slugs mit Slash bereinigt
(+Redirects); 8 Tippfehler; zweite Welle toter Alt-Links (datapath.co.uk-
Absolutlinks, utm-Varianten, /resource-center, /services, /contact-sales,
/aetria-use-cases, /video-wall-solutions ...) in 48 News ersetzt + 101
Redirects; Record-Shells /product, /news/article, /success-stories/story
leiten auf ihre Uebersichten; Meta-Description /datasheets; WordPress-
Reste in den 17 SEO-Artikeln entfernt; 53 News-Zeiger-Records (type=1
auf alte /en/news-Seiten, ohne eigenen Text) bekommen den Seiteninhalt
(Text + Bilder) in den Record und werden normale Artikel - die alten
Seiten leiten per 301 auf die Artikel.
- VitecMetaHandler: kurze Seitentitel ohne SEO-Titel erhalten ihren
Bereich als Kontext ('Aligo | AV over IP & KVM | VITEC').
- ProcessedFileReferenceToArray: Alt-Text-Fallback (Referenz-Titel, dann
Dateititel) fuer Content-Block-Bilder.
- UsecaseListJsonRenderer: Testimonial-Baender liefern nur noch Stories
mit Zitat, aktueller Markt zuerst, max. 12 (vorher alle 70 = 226 kB auf
jeder Markt-/Solution-Unterseite, identische Bloecke auf ~90 Seiten).
- NewsJsonRenderer: paginierte Listen-Payloads 15 Min. im hash-Cache
(USER_INT rendert sonst jede Variante neu; 50 langsame URLs im Report).
- robots.txt host-abhaengig: dev bekommt robots-dev.txt mit der dev-Sitemap
(Seobility fand '0 Sitemaps', weil die Sitemap-Zeile auf www zeigte).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
5121eaa000
commit
8a652063c5
7 files changed
+590
-1
No files matched your search
@@ -430,6 +430,25 @@ final class NewsJsonRenderer
|
||||
$requestedPage = max(1, (int)($queryParams['page'] ?? 1));
|
||||
$requestedCategory = strtolower(trim((string)($queryParams['category'] ?? '')));
|
||||
|
||||
// USER_INT renders on every request; the 12-card page payload (image
|
||||
// processing included) took 1-6 s on cold SSR misses (Seobility: 50
|
||||
// slow URLs, all ?page=N). Keep each page/category variant for 15 min
|
||||
// in the hash cache - cache:flush clears it, news edits are rare.
|
||||
$cache = null;
|
||||
$cacheId = '';
|
||||
try {
|
||||
$cache = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class)->getCache('hash');
|
||||
$cacheId = 'vitec-newslist-' . (int)($contentElement['uid'] ?? 0)
|
||||
. '-' . (int)($contentElement['sys_language_uid'] ?? 0)
|
||||
. '-' . $requestedPage . '-' . md5($requestedCategory);
|
||||
$cached = $cache->get($cacheId);
|
||||
if (is_string($cached) && $cached !== '') {
|
||||
return $cached;
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
$cache = null;
|
||||
}
|
||||
|
||||
// All categories of all entries in ONE query - feeds both the filter
|
||||
// chips (counts over the FULL list, independent of the active filter)
|
||||
// and the per-card category labels.
|
||||
@@ -504,7 +523,16 @@ final class NewsJsonRenderer
|
||||
'settings' => $this->buildSettingsPayload($contentElement, $settings),
|
||||
];
|
||||
|
||||
return json_encode($response) ?: '';
|
||||
$json = json_encode($response) ?: '';
|
||||
if ($cache !== null && $json !== '') {
|
||||
try {
|
||||
$cache->set($cacheId, $json, ['tx_news'], 900);
|
||||
} catch (\Throwable $e) {
|
||||
// caching is best effort
|
||||
}
|
||||
}
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user