seo json endDate und price tag angepasst
This commit is contained in:
+34
-2
@@ -105,13 +105,16 @@ function handle_image_upload(?array $file): ?string {
|
|||||||
function render_event_jsonld_graph(array $events): string {
|
function render_event_jsonld_graph(array $events): string {
|
||||||
$graph = [];
|
$graph = [];
|
||||||
foreach ($events as $e) {
|
foreach ($events as $e) {
|
||||||
$start = $e['date'] . 'T' . ($e['time'] ?? '19:30') . ':00+02:00'; // Berlin Zeit im Sommer; vereinfacht
|
$startTime = $e['time'] ?? '19:30';
|
||||||
|
$start = $e['date'] . 'T' . $startTime . ':00+02:00'; // Berlin Zeit im Sommer; vereinfacht
|
||||||
$price = $e['price'] ?? '';
|
$price = $e['price'] ?? '';
|
||||||
|
$priceValue = normalize_price_value($price);
|
||||||
$validFrom = $e['created_at'] ?? $e['updated_at'] ?? null;
|
$validFrom = $e['created_at'] ?? $e['updated_at'] ?? null;
|
||||||
|
$endDate = build_event_end_date($e, $startTime);
|
||||||
$offers = $price !== '' ? array_filter([
|
$offers = $price !== '' ? array_filter([
|
||||||
"@type" => "Offer",
|
"@type" => "Offer",
|
||||||
"url" => event_url($e),
|
"url" => event_url($e),
|
||||||
"price" => preg_replace('/[^\d,\.]/', '', $price),
|
"price" => $priceValue,
|
||||||
"priceCurrency" => "EUR",
|
"priceCurrency" => "EUR",
|
||||||
"availability" => "https://schema.org/InStock",
|
"availability" => "https://schema.org/InStock",
|
||||||
"validFrom" => $validFrom
|
"validFrom" => $validFrom
|
||||||
@@ -122,6 +125,7 @@ function render_event_jsonld_graph(array $events): string {
|
|||||||
"name" => $e['title'],
|
"name" => $e['title'],
|
||||||
"url" => event_url($e),
|
"url" => event_url($e),
|
||||||
"startDate" => $start,
|
"startDate" => $start,
|
||||||
|
"endDate" => $endDate,
|
||||||
"eventStatus" => "https://schema.org/EventScheduled",
|
"eventStatus" => "https://schema.org/EventScheduled",
|
||||||
"eventAttendanceMode" => "https://schema.org/OfflineEventAttendanceMode",
|
"eventAttendanceMode" => "https://schema.org/OfflineEventAttendanceMode",
|
||||||
"performer" => !empty($e['speaker']) ? [
|
"performer" => !empty($e['speaker']) ? [
|
||||||
@@ -159,6 +163,34 @@ function h(?string $s): string {
|
|||||||
return htmlspecialchars($s ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
return htmlspecialchars($s ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalize_price_value(string $price): ?string {
|
||||||
|
$value = preg_replace('/[^\d,\.]/', '', $price);
|
||||||
|
if ($value === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (substr_count($value, ',') > 0 && substr_count($value, '.') > 0) {
|
||||||
|
$value = str_replace('.', '', $value);
|
||||||
|
$value = str_replace(',', '.', $value);
|
||||||
|
} else {
|
||||||
|
$value = str_replace(',', '.', $value);
|
||||||
|
}
|
||||||
|
return rtrim($value, '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_event_end_date(array $event, string $fallbackTime): ?string {
|
||||||
|
$endDate = trim((string)($event['end_date'] ?? ''));
|
||||||
|
$endTime = trim((string)($event['end_time'] ?? ''));
|
||||||
|
$time = $endTime !== '' ? $endTime : $fallbackTime;
|
||||||
|
if ($endDate !== '') {
|
||||||
|
return $endDate . 'T' . $time . ':00+02:00';
|
||||||
|
}
|
||||||
|
// Falls keine Endzeit gepflegt ist, nehmen wir das Startdatum, damit Schema-Validatoren zufrieden sind.
|
||||||
|
if (!empty($event['date'])) {
|
||||||
|
return $event['date'] . 'T' . $time . ':00+02:00';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Erkennt, ob HTML-Tags enthalten sind.
|
* Erkennt, ob HTML-Tags enthalten sind.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user