This commit is contained in:
Jürgen Mummert
2025-12-27 21:44:00 +01:00
parent c0c83f2e66
commit 952f2472c4
@@ -21,7 +21,7 @@ class MeilisearchPageMarkerListener
/* /*
* ===================== * =====================
* PAGE (Basisdaten) * PAGE
* ===================== * =====================
*/ */
$pageImageUuid = null; $pageImageUuid = null;
@@ -40,38 +40,41 @@ class MeilisearchPageMarkerListener
} }
if (!empty($page->searchimage)) { if (!empty($page->searchimage)) {
$raw = (string) $page->searchimage;
if (preg_match('/^[a-f0-9-]{36}$/i', $raw)) {
$pageImageUuid = $raw;
} else {
try { try {
$pageImageUuid = StringUtil::binToUuid($raw); $pageImageUuid = StringUtil::binToUuid((string) $page->searchimage);
} catch (\Throwable) { } catch (\Throwable) {}
// ignorieren
}
}
} }
} }
/* /*
* ===================== * =====================
* SCHEMA.ORG JSON-LD * JSON-LD (SAUBER!)
* ===================== * =====================
*/ */
preg_match_all( preg_match_all(
'#<script type="application/ld\+json">\s*(\{.*?\})\s*</script>#s', '#<script type="application/ld\+json">\s*(.*?)\s*</script>#s',
$buffer, $buffer,
$jsonBlocks $matches
); );
foreach ($jsonBlocks[1] as $json) { foreach ($matches[1] as $jsonRaw) {
$json = json_decode($jsonRaw, true);
if (!is_array($json)) {
continue;
}
$graph = $json['@graph'] ?? [];
if (!is_array($graph)) {
continue;
}
foreach ($graph as $entry) {
/* /*
* EVENT * EVENT
*/ */
if (preg_match('#"@type"\s*:\s*"Event"#', $json)) { if (($entry['@type'] ?? null) === 'Event' && !empty($entry['@id'])) {
if (preg_match('#\\/schema\\/events\\/(\\d+)#', $json, $m)) { if (preg_match('#/schema/events/(\d+)#', $entry['@id'], $m)) {
$event = CalendarEventsModel::findByPk((int) $m[1]); $event = CalendarEventsModel::findByPk((int) $m[1]);
if ($event !== null) { if ($event !== null) {
@@ -89,7 +92,6 @@ class MeilisearchPageMarkerListener
$data['event']['searchimage'] = StringUtil::binToUuid($event->singleSRC); $data['event']['searchimage'] = StringUtil::binToUuid($event->singleSRC);
} }
// ✅ START / END DATE (Unix Timestamp)
if (!empty($event->startDate)) { if (!empty($event->startDate)) {
$data['event']['startDate'] = (int) $event->startDate; $data['event']['startDate'] = (int) $event->startDate;
} }
@@ -104,8 +106,8 @@ class MeilisearchPageMarkerListener
/* /*
* NEWS * NEWS
*/ */
if (preg_match('#"@type"\s*:\s*"NewsArticle"#', $json)) { if (($entry['@type'] ?? null) === 'NewsArticle' && !empty($entry['@id'])) {
if (preg_match('#\\/schema\\/news\\/(\\d+)#', $json, $m)) { if (preg_match('#/schema/news/(\d+)#', $entry['@id'], $m)) {
$news = NewsModel::findByPk((int) $m[1]); $news = NewsModel::findByPk((int) $m[1]);
if ($news !== null) { if ($news !== null) {
@@ -126,45 +128,20 @@ class MeilisearchPageMarkerListener
} }
} }
} }
}
/* /*
* ===================== * =====================
* FINALE SEARCHIMAGE-ENTSCHEIDUNG * SEARCHIMAGE
* ===================== * =====================
*/ */
$finalSearchImageUuid = null; $finalSearchImageUuid =
$data['event']['searchimage']
?? $data['news']['searchimage']
?? $pageImageUuid
?? Config::get('meilisearch_fallback_image');
// 1) EVENT > NEWS if ($finalSearchImageUuid) {
if (!empty($data['event']['searchimage'])) {
$finalSearchImageUuid = $data['event']['searchimage'];
} elseif (!empty($data['news']['searchimage'])) {
$finalSearchImageUuid = $data['news']['searchimage'];
}
// 2) CUSTOM SEARCHIMAGE (Markup)
if (
$finalSearchImageUuid === null
&& preg_match('#data-searchimage-uuid="([a-f0-9\-]{36})"#i', $buffer, $m)
&& FilesModel::findByUuid($m[1]) !== null
) {
$finalSearchImageUuid = $m[1];
}
// 3) PAGE SEARCHIMAGE
if ($finalSearchImageUuid === null && $pageImageUuid) {
$finalSearchImageUuid = $pageImageUuid;
}
// 4) FALLBACK (tl_settings)
if ($finalSearchImageUuid === null) {
$fallback = Config::get('meilisearch_fallback_image');
if ($fallback) {
$finalSearchImageUuid = $fallback;
}
}
if ($finalSearchImageUuid !== null) {
$data['page'] ??= [];
$data['page']['searchimage'] = $finalSearchImageUuid; $data['page']['searchimage'] = $finalSearchImageUuid;
} }
@@ -174,57 +151,28 @@ class MeilisearchPageMarkerListener
/* /*
* ===================== * =====================
* META-SPAN (Checksum-relevant!) * META-SPAN (Checksum!)
* ===================== * =====================
*/ */
$metaParts = []; $meta = [];
// PAGE
if (isset($data['page']['priority'])) {
$metaParts[] = 'page_priority=' . (int) $data['page']['priority'];
}
if (!empty($data['page']['keywords'])) {
$metaParts[] = 'page_keywords=' . (string) $data['page']['keywords'];
}
if (!empty($data['page']['searchimage'])) {
$metaParts[] = 'page_searchimage=' . (string) $data['page']['searchimage'];
}
// EVENT
if (!empty($data['event']['startDate'])) { if (!empty($data['event']['startDate'])) {
$metaParts[] = 'event_startDate=' . (int) $data['event']['startDate']; $meta[] = 'event_startDate=' . $data['event']['startDate'];
} }
if (!empty($data['event']['endDate'])) { if (!empty($data['event']['endDate'])) {
$metaParts[] = 'event_endDate=' . (int) $data['event']['endDate']; $meta[] = 'event_endDate=' . $data['event']['endDate'];
}
if (!empty($data['event']['priority'])) {
$metaParts[] = 'event_priority=' . (int) $data['event']['priority'];
}
if (!empty($data['event']['keywords'])) {
$metaParts[] = 'event_keywords=' . (string) $data['event']['keywords'];
} }
$metaText = 'MEILISEARCH_META ' . ($metaParts ? implode(' | ', $metaParts) : 'present'); $hidden =
$hiddenMeta =
"\n<span class=\"meilisearch-meta\" style=\"display:none !important\">" . "\n<span class=\"meilisearch-meta\" style=\"display:none !important\">" .
htmlspecialchars($metaText, ENT_QUOTES) . 'MEILISEARCH_META ' . implode(' | ', $meta) .
"</span>\n"; "</span>\n";
/*
* =====================
* JSON-MARKER
* =====================
*/
$marker = $marker =
"\n<!--\nMEILISEARCH_JSON\n" . "\n<!--\nMEILISEARCH_JSON\n" .
json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) .
"\n-->\n"; "\n-->\n";
$injection = $hiddenMeta . $marker; return str_replace('</body>', $hidden . $marker . '</body>', $buffer);
return str_contains($buffer, '</body>')
? str_replace('</body>', $injection . '</body>', $buffer)
: $buffer . $injection;
} }
} }