WordPress bietet ja seit einiger Zeit verschiedene Post Types an, z. B. Video oder Kurzmitteilung. Dazu können weitete Typen definiert werden, wenn man Bedarf hat. Genau das machen sich einige Plugins zunutze.
Jetzt nutze ich auf der Homepage unseres Tischtennisvereins „The Event Calendar“ für die Erfassung und Anzeige der Spieltermine unserer Mannschaften und weitere für den Verein wichtige Termine. Das Plugin eignet sich dafür hervorragend, da es neben der üblichen Kalenderansicht auch eine Listenansicht bietet und zudem einfach zu bedienen ist. Die Termine werden als einfache Beiträge gespeichert, die den benutzerdefinierten Post Type „tribe-events“ erhalten.
Der Nachteil dieser Art zu speichern ist, dass die Termine auch auf Archivseiten wie Kategorie- oder Tag-Archiven und in den Suchergebnissen auftauchen, und zwar auch dann, wenn die Termine bereits vergangen sind. Dass Besucher davon irritiert sind, muss man nicht extra erwähnen, also suchte ich nach einer Möglichkeit, Termine aus Archiven und Suchergebnissen auszublenden.
Die Kategorien sind kein Problem, da die Events und normale Beiträge unterschiedliche Kategorien verwenden. Bei den Tags sieht es anders aus, da greifen beide auf den selben Speicher zu, so dass in Tag-Archiven auch die Termine auftauchen. Dabei ist es uninteressant, ob die Termine bereits vergangen sind, oder nicht. Das Gleiche in den Suchergebnisseiten. In der eigentlichen Terminübersicht werden vergangene Termine ausgeblendet, wie man es von einem Termin-Plugin erwartet.
Ich habe mehrere Ansätze gefunden, die nicht oder nur unbefriedigend funktionieren. Da werden dann die Termine einfach nur ausgeblendet, ohne die Seite mit entsprechend vielen Beiträgen aufzufüllen, sofern vorhanden. Hat eine Archivseite beispielsweise sechs Termine und vier Beiträge, so werden einfach die sechs Termine ausgeblendet. Unter den verbleibenden vier Beiträgen erscheint dann die Seitennavigation, anstatt erst mal weitere Beiträge auf die erste Seite zu holen. Finde ich persönlich schon sehr irritierend.
Letztlich bin ich auf eine Lösung gestoßen, die zufriedenstellend funktioniert. Dafür wird der Hook „pre_get_posts
“ genutzt:
/* Exclude events from archive pages */ function exclude_events( $query ) { if( ( is_category() || is_tag() || is_search() ) && $query->is_main_query() ) { $query->set( 'post_type', array( 'post', 'nav_menu_item', 'your_custom_post_type' )); return $query; } } add_action( 'pre_get_posts', 'exclude_events' );
In Zeile 3 selektiere ich, auf welche Archive ich die Funktion anwenden will, im Beispiel Kategorien, Tags und Suchergebnisse. In Zeile 5 definiere ich die Beitragstypen, die ich anzeigen will. „post“ ist der Typ für normale Beiträge, „nav_menu_item“ lädt dann die Einträge des Navigationsmenü. Die würden ansonsten auf den Archivseiten auch fehlen, was natürlich so nicht gewünscht ist. Zudem lassen sich in diesem Array auch weitete Post Types angeben, die ihr vielleicht anzeigen möchtet. In Zeile 10 wird letztlich die Filterfunktion an den Hook übergeben. Der Filter wird dann auf die Datenbank-Abfrage angewandt und das Ergebnis entsprechend ausgegeben. Das Codeschnipsel kommt dann in die functions.php
des verwendeten Themes.
Ahhh, super vielen Dank für den Code. Ich kam dabei irgendwie nicht weiter, aber konnte das Problem mit deiner Hilfe lösen. Vielen Dank!
Sehr gerne.