Ziel: Ein Termine-„Modul“ mit Feldern, die die üblichen Verdächtigen Plugins nicht anbieten.
Plugins installieren:
- Advanced Custom Fields
- Advanced Custom Fields Date + Time Picker (direkt aus dem ersten Plugin heraus möglich)
Post-Type generieren:
https://generatewp.com/post-type/
Code in functions.php übernehmen. Die Daten unterschiedlicher post-types werden in der Datenbanktabelle wp_posts gespeichert.
Im Backend dann die „eigenen Felder“ erstellen und dem Post-Type „termin“ zuordnen. Diese Daten werden dann später in der Datenbanktabelle wp_postmeta hinterlegt.
Darstellung aller „Termine“: Erstellen der Theme-Datei: archive-post-type.php (hier also archive-termin.php)
Darstellung eines einzelnen „Termins“: Erstellen der Theme-Datei: single-post-type.php
Weitere Darstellung:
Anzahl X kommender Termine sollen per Shortcode in eine Seite eingebunden werden.
Der Shortcode dazu lässt sich auch fix bei https://generatewp.com/shortcodes/ zusammenklicken.
Anpassung der CSS-Klassen in der entsprechenden CSS-Datei. In meinem Fall werden CSS-Klassen mit voranstehendem „kk_“ genutzt um Konflikte zu vermeiden.
Das eher schwierige ist dann den entsprechenden Query zusammenzubauen um möglichst wenige unnütze Einträge aus der Datenbank zu erhalten. Ein wenig boolsche Algebra hilft da fix weiter und für mich hat sich folgender Query bewährt:
// MetaQuery greift auf wp_postmeta zu
// Termine ausgeben, bei denen entw. kein "termin_ausblenden_datum" gesetzt ist ODER das "termin_ausblende_datum" in der Zukunft liegt.
$meta_query_args = array(
'relation' => 'OR',
array(
'key' => 'termin_ausblenden_ab',
'value' => mktime(0, 0, 0),
'compare' => '>=',
),
array(
'key' => 'termin_ausblenden_ab',
'value' => 0,
'compare' => '==',
)
);
//Query auf wp_posts
// "Posts" ausgeben, deren Post-Type "termin" ist und schon veröffentlicht sind.
$query_args = array(
'numberposts' => 10,
'offset' => 0,
'orderby' => 'meta_value',
'meta_key' => 'Startdatum',
'order' => 'ASC',
'post_status' => 'publish',
'post_type' => 'termin',
'meta-query' => $meta_query_args,
);
// Damit werden alle veröffentlichten und nicht ausgeblendeten Termine ausgegeben.
Nun will ich mir aber nur Termine anzeigen lassen, die entweder „im Moment“ stattfinden oder in Zukunft erst beginnen.
Dazu überprüfe ich Start- und Enddatum des Termins:
if ($start >= $heute || $ende >= $heute) {
//Termin ausgeben
}
Für alles Weitere hat die Doku der Advanced Custom Types und der WordPress-Codex hergehalten.
Auf diese Weise lassen sich auch vorhandene Post-Types wie der „normale“ Blogpost erweitern oder gänzlich neue Post-Types erstellen.
Auf jeden Fall eine sinnvolle Erweiterung.