Mitmachen: Ehrenamtsseite mit Stellen-Filter
Neue Seite /mitmachen, die offene Ehrenamtsstellen aus data/mitmachen.json als position-card-Komponente listet, mit clientseitigem Bereichsfilter (position-filter.js, progressive enhancement) und JobPosting-Schema (job_posting_schema(), employmentType VOLUNTEER). Route ergänzt. Enthält zudem kleine person-card__contact-Stilanpassungen (gleiche CSS-Sektion). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HGzc6GhWhmLJt1jC2q1SRZ
This commit is contained in:
@@ -324,3 +324,51 @@ function sportsevent_nodes(array $upcoming): array
|
||||
}
|
||||
return $nodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* JobPosting-Knoten für eine Ehrenamtsstelle (Seite /mitmachen). $job: Eintrag aus
|
||||
* data/mitmachen.json → positions[]; $pageSlug: Seiten-Slug für die Anker-URL.
|
||||
* employmentType VOLUNTEER; hiringOrganization verweist via #club auf den Org-Knoten;
|
||||
* jobLocation = Vereinsadresse aus club.json (Single Source). validThrough bewusst
|
||||
* optional — ein abgelaufenes Datum entfernt die Anzeige aktiv aus den Ergebnissen,
|
||||
* deshalb nur bei echt befristeten Stellen setzen. Ohne title → leerer Array (Aufrufer filtert).
|
||||
*/
|
||||
function job_posting_schema(array $job, string $pageSlug): array
|
||||
{
|
||||
if (empty($job['title'])) {
|
||||
return [];
|
||||
}
|
||||
$club = json_load('club');
|
||||
$node = [
|
||||
'@type' => 'JobPosting',
|
||||
'title' => $job['title'],
|
||||
'description' => $job['description'] ?? ($job['summary'] ?? $job['title']),
|
||||
'employmentType' => 'VOLUNTEER',
|
||||
'hiringOrganization' => ['@id' => abs_url() . '#club'],
|
||||
'jobLocation' => [
|
||||
'@type' => 'Place',
|
||||
'address' => [
|
||||
'@type' => 'PostalAddress',
|
||||
'streetAddress' => $club['address']['street'],
|
||||
'postalCode' => $club['address']['zip'],
|
||||
'addressLocality' => $club['address']['city'],
|
||||
'addressCountry' => $club['address']['country'],
|
||||
],
|
||||
],
|
||||
];
|
||||
if (!empty($job['id'])) {
|
||||
$node['identifier'] = [
|
||||
'@type' => 'PropertyValue',
|
||||
'name' => $club['name'],
|
||||
'value' => $job['id'],
|
||||
];
|
||||
$node['url'] = abs_url($pageSlug) . '#' . $job['id'];
|
||||
}
|
||||
if (!empty($job['posted'])) {
|
||||
$node['datePosted'] = $job['posted'];
|
||||
}
|
||||
if (!empty($job['valid_through'])) {
|
||||
$node['validThrough'] = $job['valid_through'];
|
||||
}
|
||||
return $node;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user