WordPress benutzerdefinerte Felder (Custom Fields)

Das ich WordPress für ein flexible und mächtige Applikation halte, ist sicher bekannt. WordPress kann mehr als nur Weblogpublishing. In letzter Zeit kamen vermehrt Fragen bezüglich bestimmter Anwendungswünsche und ob man dafür ein Plugin kennt oder erstellen könnte.

Deshalb auch der Artikel hier. Es gibt innerhalb des Schreibens eines Beitrags/ Seite in WordPress die Möglichkeit benutzerdefinierte Felder anzulegen und mit Werten zu füllen. Mit diesen Werten und Feldern kann man arbeiten und eine Menge an Anforderungen lösen, „ohne Plugin”. Allerdings will ich eines nicht verschweigen, das einfache und unkomplizierte Auslesen eines Wertes zu einem Schlüssel funktioniert nur innerhalb des Loop. Deshalb dazu im Folgenden eine kleine, einfache Lösung zum Anpassen.

Custom Fields

Will man innerhalb des Loop einen Schlüssel auslesen, dann genügt folgender Syntax, innerhalb des Templates. Im ersten Beispiel wird der Link zu einem Bild zum Schlüssel image_des_beitrags gespeichert und nachfolgend mit HTML ausgegeben.


<?php $image = get_post_meta($post->ID, 'image_des_beitrags', true); ?>

<a href="<?php the_permalink() ?>"><img src="<?php echo $image; ?>" alt="<?php the_title(); ?>" /></a>

Will man nicht den kompletten Link als Wert speichern, kann man das natürlich anpassen. Denkbar ist beispielsweise, wenn die Bilder immer im uploads-Ordner von WordPress gespeichert werden, dass man nur den Bildnamen speichert und den Rest immer im Quellcode des Templates hat.


<?php $image = get_post_meta($post->ID, 'image_des_beitrags', true); ?>

<a href="<?php the_permalink() ?>"><img src="<?php get_option('siteurl'); ?>wp-content/uploads/<?php echo $image; ?>" alt="<?php the_title(); ?>" /></a>

Ähnliche Anwendungen kann man natürlich auch mit einer Reihe anderer Inhalte und Anforderungen machen.

Außerhalb des Loop

Möchte man aber an einzelne Felder außerhalb des Loop kommen, so reichen die mitgegebenen Mittel von WordPress nicht aus um ein einzelnes Feld auszulesen. Dazu empfehle ich das Ablegen eines kleinen Plugins, welches das jeweilige Feld ausliest und die Daten in einer Funktion übergibt. Die einfachste Form könnte beispielsweise wie folgt aussehen. Dieses nutze ich, um im PhotoBlogFB Theme die EXIF-Daten der Bilder auszulesen.

<?php
/*
Plugin Name: MetaKey
Plugin URI: https://bueltge.de/
Description: Benutzerdefiniertes Feld auslesen
Version: 1.0
Author: Frank Bueltge
Author URI: https://bueltge.de/
*/


// Meta-Key: image_des_beitrags
function fb_meta_image() {
	global $id, $post_meta_cache;

	if ( $keys = get_post_custom_keys() ) {
		foreach ( $keys as $key ) {
			$values = array_map('trim', get_post_custom_values($key));
			$value = implode($values,', ');
			if ( $key == 'image_des_beitrags' ) {
				return $value;
			}
		}
	}
}

?>

Entscheidend für die Funktion ist die Variable $key, die den Namen des Schlüssels übergeben bekommt und den Wert dann durch die Funktion übergibt.

$image = fb_meta_image();
if ($image != '') {
. . .
}

Der Wert wird im obigen Beispiel an die Variable $image übergeben und die prüfe ich dann, ob sie ungleich leer (ungleich !=) ist. Wenn sie nicht leer ist, dann soll weiteres damit gemacht werden.

Diesen Code legt man sich als php-Datei im Plugin-Verzeichnis von WordPress ab und aktiviert es. Danach steht die Funktion bereit und kann, wie im obigen kleinen Beispiel, genutzt werden.

Sollten keine Kenntnisse im Bereich Plugin vorhanden sein, so habe ich auf einem älteren Artikel schon mal die Funktion und die wichtigen Hintergründe für das Funktionieren von Plugins erläutert - WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 1. Dort werden unter anderem die Kommentare im Code, wozu und warum, erklärt. Auch eine umfangreicher Version des vorgestellten Code entsteht dort, so dass man ein wenig flexibler ist, wenn es sich um mehrere benutzerdefinierte Felder handelt.

Weiterführende Links

57 Kommentare

  1. sehr coole idee die benutzerdefinierten felder zu verwenden! hab die idee das erste mal bei micha gefunden und muss sagen WordPress ist mächtiger als man zuerst denkt.

    kann man so eigentlich auch ein eigenes (etwas grösseres) plugin schreiben? also was sich auf benutzerdefnierte felder bezieht? wenn ja, dann wäre da eventuell die möglichkeit gegeben zu taggen

  2. @Micha: Ich denke, ein Beitrag darüber wäre toll.

    @Jared: Jeromeys Keywords war so aufgebaut, es wurden die Felder zum Taggen genutzt. Ist seit WP 2.3 aber nicht mehr notwendig und dementsprechend auch schneller in der DB.

  3. Ich stimme ein, mit Custom Fields kann man so wahnsinnig viel machen, das wird dem Customizing geradezu gerecht.

    Ich habe mit einem Freund zusammen eine Website erstellt, die zu einem immens großen Teil auf den Custom Fields beruht (detaillierter zu sehen z.B. hier und besonders hier). In den letzten beiden Beispielen sind so gut wie alle Felder auf Custom Fields aufgebaut. Teilweise rufen wir die Values auch über arrays ab, was Such- und Sortierfunktionen helfen kann.

    Sehr hilfreich sind übrigens folgende Plugins: Get Gustom Field Values und Custom Field GUI

Kommentare sind geschlossen.