Verwenden von benutzerdefinierten Feldern in WordPress

3. Februar 2018 Keller-H 0 Kommentare

Benutzerdefinierte Felder anlegen

Benutzerdefinierte Felder können in WordPress sowohl in Artikeln als auch in Seiten verwendet werden. Im Backend ist dazu lediglich rechts oben im Tab „Ansicht anpassen“ im Kästchen „Benutzerdefinierte Felder“ ein Häkchen zu setzen.

Wie in dem dann sichtbaren Bereich unterhalb des Editors zu sehen ist, besteht ein Feld lediglich aus seinem Namen und dem Inhalt. Damit ist das Erstellen eines benutzerdefinierten Feldes auch schon erledigt. Allerdings ist der Inhalt nur noch nirgends zu sehen.

Es gibt nun verschiedene Möglichkeiten ein Feld zu nutzen. Neben dem Anzeigen des Inhalts innerhalb oder auch außerhalb der Loop, kann auch nach Artikeln mit einem bestimmten Feld bzw. dessen Inhalt gesucht werden.

Anzeigen innerhalb der Loop

Der einfachste Fall besteht darin ein Feld und dessen Inhalt innerhalb der Loop anzuzeigen. Hierzu muss nur die folgende Codezeile in das entsprechende Template eingefügt werden.

get_post_meta($post_id, $key, $single);

Die Variable $key steht für den Namen des Feldes. $single ist ein boolscher Wert. Bei „true“ wird nur der erste Wert als String zurückgegeben. Wird der Parameter weggelassen oder steht „false“ enthält die  Rückgabe ein Array der betreffenden benutzerdefinierten Felder.
Die Möglichkeit der Array-Rückgabe ist besonders dann sinnvoll, wenn ein Feldname innerhalb eines Artikels mehrfach verwendet wird.

Außerhalb der Loop anzeigen

Soll ein benutzerdefiniertes Feld außerhalb der Loop angezeigt werden, muss zunächst die post-ID des aktuellen Artikels ermittelt werden. Der folgende Codeabschnitt tut genau dies.

global $wp_query;
$post_id = $wp_query->post->ID;

Anschließend kann die Variable $post_id in der Funktion get_post_meta verwendet werden.

Artikel mit bestimmten Feldinhalten suchen

Sollen nun Artikel mit bestimmten Feldinhalten angezeigt werden, kann hierfür die Klasse WP_Meta_Query genutzt werden.

Zum Beispiel liefert der folgende Code eine Auflistung aller Artikel, die die benutzerdefinierten Felder „field1“ und „feld2“ enthalten, wobei der Wert von „feld1“ mit „inhalt“ übereinstimmen und „feld2“ lediglich vorhanden sein muss.

$result = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'feld1_bedingung' => array(
            'key' => 'feld1',
            'value' => 'inhalt',
        ),
        'feld2_bedingung' => array(
            'key' => 'feld2',
            'compare' => 'EXISTS',
        ),
    ),
    'orderby' => array(
        'feld1_bedingung' => 'ASC',
        'feld2_bedingung' => 'DESC',>
    ),
) );

Mögliche Werte für „compare“ sind
'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE'.

Mit „EXISTS“ bzw. „NOT EXISTS“ erhält man alle Artikel, die ein bestimmtes Feld enthalten bzw. nicht enthalten. Der „value“-Parameter ist in diesem Fall nicht notwendig. Das zurückgegebene WP_Query-Objekt kann dann wie üblich in der Loop behandelt werden.

Aussehen eines Artikels durch benutzerdefinierte Felder beeinflussen

Eine interessante Anwendung benutzerdefinierter Felder besteht in der Möglichkeit das Artikeldesign durch ein Feld zu modifizieren.

Die Funktion post_class liefert hierzu die Möglichkeit. Dazu muss zunächst ein Feld angelegt werden, dessen Inhalt ein CSS-Klassenname ist. Diese Klasse kann dann z.B. in einem div-Tag verwendet werden, der den Artikelinhalt umschließt. Dazu muss nur der folgende Code als Klassenname in diesen div-Tag eingefügt werden.

class = "<?php post_class(my_theme_post_class()); ?>"

Die Funktion my_theme_post_class ist eine benutzerdefinierte Funktion, die den Klassennamen, also den Inhalt des betreffenden Feldes zurückgibt. Diese wird in der function.php wie folgt definiert, wobei post-class der Name des Feldes ist.

function my_theme_post_class($classes) {
   global $post;
   $sn_post_class_array = array (
      get_the_author_meta('display_name'),
      get_post_meta($post->ID, 'post-class', true)
   );
   $classes[] = implode(" ", $sn_post_class_array);
   return $classes;
}

Der Codabschnitt stammt aus smashing magazine. Hier sind auch noch mehr Tipps zu benutzerdefinierten Felder zu finden.

Eine sehr schöne ausführliche Beschreibung anhand eines Beispiels gibt’s hier: Perishable Press.