Benutzerdefinierte Felder in WordPress für Queries nutzen

Lesezeit: Weniger als 1 Minute

Zugegeben, die Überschrift des Artikels ist etwas abstrakt. Benutzerdefinierte Felder in Wordpress sind aber ziemlich praktisch, wenn es darum geht, Artikel automatisiert auszugeben und dabei zu filtern und zu sortieren. Dieser Beitrag zeigt dir am Beispiel meines Blogs japanliteratur.net, was man mit solchen individuellen Abfragen anfangen kann.

Das Fallbeispiel

In WordPress lassen sich Artikel in Kategorien einordnen oder verschlagworten. Alle Artikel einer Kategorie oder mit einem bestimmten Schlagwort werden dann von WordPress automatisch in einer Abfrage ausgegeben, bei japanliteratur.net zum Beispiel:

Diese Abfrage funktioniert bei WordPress immer gleich: Geordnet werden die Rezensionen beziehungsweise Bücher nach dem Veröffentlichungsdatum, beginnend beim neuesten und endend mit dem ältesten. Das ist die typische Sortierreihenfolge in einem Blogsystem.

Ich möchte nun aber eine Abfrage nutzen, in der nur Neuerscheinungen des Jahres 2019 auftauchen – und das meint Bücher, die 2019 erschienen sind, nicht Bücher, die 2019 rezensiert wurden! Zugleich sollen aber die Standardsortierungen so, wie sie bei den Kategorien und Schlagworten bestehen, erhalten bleiben.

Ich nehme an dieser Stelle das Ergebnis einmal vorweg:

Bücher nach Erscheinungsjahr geordnet
Bücher nach Erscheinungsjahr geordnet Bild Vergrößern

Auf dieser Seite sind alle Neuerscheinungen aufgelistet und zudem noch nach Monaten geordnet. Zu den Büchern gibt es jeweils ein paar bibliografische Informationen sowie einen Link zur Rezension. Umsetzen lässt sich dies mit einer Seite beziehungsweise Page, einem neu erstellten Seitentemplate und benutzerdefinierten Feldern.

Benutzerdefinierte Felder einrichten

An jedem Artikel in WordPress können benutzerdefinierte Felder hinterlegt werden. Wie das im Detail geht, erklärt dir dieser Artikel.

Für japanliteratur.net speichere ich bibliografische Angaben wie die ISBN, die Seitenzahl oder das Erscheinungsjahr in einem eigenen Feld. So kann ich die Informationen an beliebigen Stellen ausgeben und auch danach sortieren. Für die Neuerscheinungen sind zwei Felder wichtig: Erscheinungsjahr (Format JJJJ) und Monat (Format MM). Diese Felder müssen bei allen Büchern, die später in der Abfrage landen sollen ausgefüllt werden – also bei allen Büchern, die 2019 erschienen sind. Für ein Buch, das beispielsweise im Januar erschienen ist, trage ich als erscheinungsjahrs 2019 und als monat 01 ein.

Benutzerdefinierte ausgefüllte Felder
So sehen die im klassischen Editor ausgefüllten benutzerdefinierten Felder aus. Die Felder Erscheinungsjahr und Monat verwende ich später für die Sotierung und Ausgabe der Bücher. Bild Vergrößern

Ein Seitentemplate und eine Seite einrichten

Die Neuerscheinungen sollen nun auf einer WordPress-Seite präsentiert werden. Dazu richte ich als erstes ein neues Seitentemplate ein. Hierzu erstelle ich eine Seite mit der Benennung neuerscheinungen.php und lege diese in den Hauptordner des Templates unter /wp-content/upload/themes/BEISPIEL-THEME.

Das neue Template enthält folgenden Code als Grundgerüst:

<?php
/*
Template Name: Neuerscheinungen
*/
get_header(); ?>

// Hier kommt nachher die Abfrage hin

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Ich erstelle nun eine neue Seite und ordne dieser das Template zu. Anschließen richte ich auch hier das benutzerdefinierte Feld erscheinungsjahr ein und trage das Jahr ein, aus dem Neuerscheinungen angezeigt werden sollen.

Das Navigationsmenü
Bei den benutzerdefinierten Feldern wird das Erscheinungsjahr eingetragen, das abgefragt werden soll. Für die Seite wähle ich anschließend noch das neue Seiten-Template aus. Bild Vergrößern

Eine Abfrage schreiben

Nun ergänze ich das Seitentemplate neuerscheinungen.php noch um eine Abfrage. Diese funktioniert so, dass immer das Erscheinungsjahr abgefragt wird, das als benutzerdefiniertes Feld zuvor bei der Seite selbst eingetragen wurde. So kann für jedes Jahr eine eigenen Seite erstellt, zugleich aber immer das gleiche Template verwendet werden.

Hier zunächst einmal die gesamte Abfrage im Überblick:

<?php 
   $myQuery = new WP_Query( 
      array(  
         'order' => 'ASC',
         'orderby'   => 'month'
         'meta_query' => array(
            'month' => array(
            		'key' => 'monat',
            		'type' => 'NUMERIC'
            )
         )
         'meta_key' => 'erscheinungsjahr',
         'meta_value' => get_post_meta($post->ID, "erscheinungsjahr", true), 
         'posts_per_page' => -1
      )
   ); 
   while ($myQuery->have_posts()) : $myQuery->the_post(); ?>
			
   // Hier kommt dein Styling rein
   <?php the_title(); ?>
			
<?php endwhile; 
wp_reset_query(); ?>

Das Grundgerüst in Zeile 2, 18, 23 und 24 ist hervorgehoben. Zunächst öffne ich mit $myQuery = new WP_Query in Zeile 2 eine neue Abfrage, die am Ende dann geschlossen wird. while ($myQuery->have_posts())… öffnet eine Schleife. Diese durchsucht die WordPress-Artikel nach bestimmten Kriterien und gibt anschließen jeden Artikel in dem von mir gewählten Styling aus. In dieser Beispielabfrage habe ich das Styling leer gelassen, es wird lediglich der Titel des Artikels beziehungsweise Buches ausgegeben.

Die Kriterien, nach denen die Neuerscheinungen nun konkret gefiltert werden, habe ich in Zeile 3 bis 13 definiert.

Reihenfolge bestimmen

'order' => 'ASC',

Sortiert die Ergebnisse aufsteigend, beginnend beim Sortieren also immer bei 0 und zählt aufwärts. Es wäre auch möglich, die Ergebnisse mit DESC absteigend zu sortieren.

'orderby'   => 'month'

Definiert, nach welchem Feld die Neuerscheinungen sortiert werden. In WordPress wäre das normalerweise in Standard-Abfragen das Erscheinungsdatum des Artikels. In diesem Fall ist es der Erscheinungsmonat der Bücher. Ich benennen dazu das orderby-Kriterium month. Dieses wird dann direkt in den folgenden Zeilen genauer definiert:

'meta_query' => array(
   'month' => array(
      'key' => 'monat',
       'type' => 'NUMERIC'
   )
)

Unter key trage ich den Namen des benutzerdefinierten Feldes ein, nach dem gefiltert werden soll. Zur Filterung verwende ich nämlich ein Feld mit dem Namen Monat, in dem die Zahlen 1 bis 12 eingetragen werden. So werden die Bücher nun von Januar bis Dezember in einer Reihenfolge dargestellt.

Filtern

'meta_key' => 'erscheinungsjahr',
'meta_value' => get_post_meta($post->ID, "erscheinungsjahr", true), 

Da nur Bücher aus dem Erscheinungsjahr X angezeigt werden soll, wird mit ‚meta_key‘ => ‚erscheinungsjahr‘ nach diesem Feld gefiltert. Mit meta_value grenze ich nun ein, dass nur der Wert als Filter verwendet wird, der auf der Seite, die ich zuvor eingerichtet habe, als benutzerdefiniertes Feld angegeben ist. Das heißt noch einmal ausführlich: Steht im benutzerdefinierten Feld der Seite „Neuerscheinungen 2019“ dann tatsächlich auch die Zahl 2019, werden nur Bücher in der Abfrage ausgegeben, die selbst als benutzerdefiniertes Feld 2019 haben.

Anzahl der Ergebnisse definieren

'posts_per_page' => -1

Diese Zeile bewirkt außerdem, dass alle Ergebnisse angezeigt werden, egal wie viele Bücher 2019 erschienen sind. „-1“ steht dabei für unendlich, es kann aber auch eine fest definierte Zahl eingesetzt werden.

Eine Menüstruktur für mehrere Seiten erstellen

Das Navigationsmenü
Das Navigationsmenü. Bild Vergrößern

Da ich für jedes Jahr seit 2010 eine Seite mit Neuerscheinungen habe, gibt es oben auf der Seite ein Navigationsmenü, mit dem man zwischen den Jahren hin- und herspringen kann.

<div class="pagination">
   <?php
      $i = 2010;
      while($i < 2020) {
         if(get_post_meta($post->ID, "erscheinungsjahr", true) != $i){
            echo '<a href="/neuerscheinungen-'.$i.'">'.$i.'</a>';
         } else {
            echo '<span>'.$i.'</span>';
         }
      $i++;
   } ?>
</div>

Mit diesem kleinen Codeschnipsel wird das Menü erstellt. Technisch passiert hier Folgendes: In Zeile 3 wird zunächst die Variable $i = 2010 definiert, das ist das erste Jahr, das abgefragt werden soll. In der nächsten Zeile wird dann eine Schleife mit while($i < 2020) aufgemacht. Diese gibt den Befehl: Wenn die Variabe i kleiner als 2020 ist, dann führe die Aktion aus. Ganz unten in Zeile 10, am Ende der Schleife, wird i um 1 hochgezählt. Das heißt: in der ersten Runde ist i = 2010, in der zweiten Runde = 2011 und so weiter. Die Aktion wird also bis inklusive 2019 ausgeführt und ein Link aufs Archiv für jedes Jahr erstellt.

Nun möchte ich aber beispielsweise, wenn gerade die Neuerscheinungsliste für 2014 aufgerufen ist, diese nicht auf derselben Seite verlinken. Deshalb gibt es innerhalb der Schleife eine Bedingung:

if(get_post_meta($post->ID, "erscheinungsjahr", true) != $i){
   echo '<a href="/neuerscheinungen-'.$i.'">'.$i.'</a>';
} else {
   echo '<span>'.$i.'</span>';
}

Wenn das Erscheinungsjahr ungleich (dafür steht !=) ist, dann zeige einen Link an. Abgefragt wird hier das Metafeld der WordPress Page, die ich weiter oben für die Neuerscheinungen eingerichtet habe. Wenn aber das Erscheinungsjahr gleich ist beziehungsweise in allen anderen Fällen, dann wird kein Link ausgespielt, sondern nur das Erscheinungsjahr angezeigt. Da es sich optisch von den anderen Links automatisch absetzt, ist für den Nutzer so auch gleichzeitig klar, in welchem Jahr er sich gerade innerhalb der Navigation befindet.

Profilbild
Autorin: Friederike

Hallo, ich bin Friederike. Ich entwickle Websites und schreibe auf krempin.it darüber. Außerdem mag ich Japanische Literatur und Retro-Videospiele.