WP – Tutorial, wir schreiben ein WordPress Plugin – Teil 3

Die Aufgabe unseres kleinen Tutorials bestand ja darin, die „benutzerdefinerten Felder“ für den Bereich Meta Keywords oder Description im Header deines Blogs zu nutzen. Dazu müssen wir die Daten außerhalb von the_loop bereitstellen. Übergeben wir Daten innerhalb von the_loop, ist das alles ein wenig einfacher, da hier alle Zugriffe, die WP benutzt, breit stehen und damit kann sie auch jedes Plugin nutzen.
In diesem Teil wollen wir nun die Daten aus dem Feld ‚description’ in den Header bringen.

Die Aufgabe unseres kleinen Tutorials bestand ja darin, die „benutzerdefinierten Felder“ für den Bereich Meta Keywords oder Description im Header deines Blogs zu nutzen. Dazu müssen wir die Daten außerhalb von the_loop bereitstellen. Übergeben wir Daten innerhalb von the_loop, ist das alles ein wenig einfacher, da hier alle Zugriffe, die WP benutzt, breit stehen und damit kann sie auch jedes Plugin nutzen.

In diesem Teil wollen wir nun die Daten aus dem Feld „description“ in den Header bringen. Erinnert euch dazu an Teil 1 dieser Serie, in der wir die kleine hauseigene Funktion von WP in ein Plugin integriert hatten und nur die Möglichkeit geschaffen haben, dass man das eigentliche Feld, welches wir auslesen wollen, definieren kann. Diese Routine tasten wir nicht an, somit können wir später immer wieder darauf zugreifen und die Daten holen wir nun eigens aus der Datenbank. Dazu sind einige Kenntnisse in der mySQL-Abfrage sehr hilfreich - als Tipp dient die Manuel von mySQL oder das Buch „DSP“ von Christoph Reeg (Online oder als PDF verfügbar).

Im folgenden ist der Code zu finden, den ich mir gebaut habe, um das Feld aus der Datenbank zu lesen. Hinweise und Erläuterungen habe ich direkt in den Code geschrieben, so könnt ihr diese auch in eurem Lieblingseditor lesen, wenn ihr am Plugin arbeitet. Auch hier noch mal der Hinweis, die PHP-Routine soll nicht perfekt sein, sie soll verdeutlichen, wie wir zu einer Lösung kommen. Wer mit diesem Plugin arbeiten will, der kann gerne den Code optimieren.


// ausserhalb von the_loop
function fb_meta_description_outside($field) {
	global $wpdb;
	
	if (empty($between)) $limit = 1;
	if ($order != 'ASC') $order = 'DESC';
	$aktuellesDatum = current_time('mysql');

	/** unsere SQL-Anweisung:
	 SELECT meta_value FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta 
	 WHERE posts.ID = postmeta.post_id 
	 AND postmeta.meta_key = '$field' 
	 AND posts.post_date < '$aktuellesDatum' 
	 ORDER BY posts.post_date $order 
	 LIMIT $limit
	*/
	$sql  = "SELECT "; //waehlt eine bestimmte Spalte, mehrere Spalten oder abgeleitete Spaltenwerte
	$sql .= "meta_value FROM $wpdb->posts AS posts, $wpdb->postmeta AS postmeta "; //Tabelle _posts und _postmetadata
	$sql .= "WHERE posts.ID = postmeta.post_id "; //wenn ID in _posts und post_id in _postmeta gleich sind
	$sql .= "AND postmeta.meta_key = '$field' "; //waehlt bestimmte Zeilen - meta_key in _postmeta von Variable $field
	$sql .= "AND posts.post_date < '$aktuellesDatum' "; //kleiner als aktuelles Datum
	$sql .= "ORDER BY posts.post_date $order LIMIT $limit"; //sortiert die Ausgabe,sonst bekommen wir immer die erste
	
	$results = array(); 
	$values = array();
	$results = $wpdb->prepare( $wpdb->get_results($sql) );
	if (!empty($results))
		foreach ($results as $result) { $values[] = $result->meta_value; };
	return fb_meta_description_value($field, $values);
}

function fb_meta_description_value($field, $meta_values) {

	if (empty($between)) $meta_values = array_slice($meta_values,0,1);
	if (!empty($meta_values))
		foreach ($meta_values as $meta) {
			$values[] = apply_filters('the_meta', $meta);
		}

	if (empty($values)) $value = '';
	else {
		$values = array_map('trim', $values);

			switch ($size = sizeof($values)) {
				case 1:
					$value = $values[0];
					break;
				case 2:
					$value = $values[0] . $values[1];
					break;
				default:
					$value = implode(array_slice($values,0,$size-1)) . $values[$size-1];
			}
	}
	return $value;
}

Einbau im Blog

Bauen wir nun unsere neue Funktion in die header.php unseres Blogs ein. In meinem Beispiel wähle ich das Feld „description“ aus und will die Daten aus diesem Feld im Meta-Tag des Headers ausgeben. Folgende Zeile schmückt nun die header.php .


<meta name="description" content="<?php echo fb_meta_description_outside('description'); ?>" /></meta>

Schaut euch nun die Seite an - nicht viel zu sehen, dann schau in den Quellcode der Seite. Hier finden wir nun den „Wert“, den wir zum Feld ‚description’ gepflegt haben. Somit könnten wir nun zu jedem einzelnen Beitrag oder Seite eine eigene Beschreibung ausgeben. Die Seite ist dann wesentlich optimierter für Suchmaschinen, da eine genaue Beschreibung im Bereich Meta zum Inhalt existiert. Das Gleiche kann man mit anderen Feldern machen, denn die entstandene Funktion ist ja von der Übergabe der Parameter abhängig. wir könnten also auch in unserem Beispiel noch zusätzlich die „keywords“, denn dazu haben wir eingangs ein Feld erstellt, abfragen und diese in den Header schreiben. Das sieht dann in der header.php so aus:


<meta name="keywords" content="<?php echo fb_meta_description_outside('keywords'); ?>" />
</meta><meta name="description" content="<?php echo fb_meta_description_outside('description'); ?>" /></meta>

Schaue ich mir dann wieder meine Seite an und öffne den Quellcode, habe ich saubere Keywords und eine Description zum Thema, falls sie inhaltlich besser gepflegt ist, als in unserem Tutorial.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>Test FB  &raquo; Blog Archiv   &raquo; Tutorial, wir schreiben ein WP-Plugin</title>

<meta name="generator" content="WordPress 2.0.2" /> <!-- leave this for stats -->

<meta name="keywords" content="Test keywords" />
<meta name="description" content="Test description" />
...</head></html>

Optionsseite und Funktion

Nun gilt es eigentlich nur noch, dass wir die entstandenen Lösungen aus Teil 2 und dem hiesigen Abschnitt zusammen fügen. Damit haben wir einmal die Möglichkeit ein Feld innerhalb von the Loop abzufragen, mit einer eigenen Optionsseite und wir haben die Möglichkeit die Daten außerhalb von the_loop einzubinden. Und auch dort können wir jedes Feld abfragen.

Motivation

Natürlich kann man mit diesen benutzerdefinierten Feldern viel mehr machen, als nur die descriptions oder keywords einer Seite zu speichern. Genau deshalb sind sie ja auch in WordPress vorhanden. Zum Beispiel könnt man so in jedem Beitrag seine gegenwärtige Verfassung durch einen Wert wiedergeben, oder diesen Wert dann wieder durch ein Bild ersetzen.
Was ich damit sagen will - probiere, tüftele - es macht Spaß etwas zu versuchen und dazu zu lernen.

Danke !

Meinen Dank möchte ich schon jetzt allen Lesern aussprechen, die dieses Tutorial aufmerksam verfolgt haben und mich vielleicht auf diverse Fehler hinweisen. Wichtig ist mir, dass es verständlich ist und das ihr ein wenig Spass dabei habt, euren eigenen Blog zu erweitern oder einfach nur mit diversen Gimmicks zu gestallten.
Wie immer gilt - wenn du Fragen hast, keine Angst - her damit (Nur um ein wenig Geduld bitte ich.) Und wenn es dir besonders gut gefallen hat, dass schau auf meine Wunschliste und Spende in einer der vielen Möglichkeiten - Danke.

Download:

Außerhalb von the_loop:

Download als phps-DateiDownload als phps-Datei: fb_meta_description_3.phps - 3 KByte

Download als phps-Datei

Die Abschlussdatei:

Download als phps-Datei: fb_meta_description_31.phps - 3 KByte


24 Comments

  1. Hey,
    wirklich eine klasse Tutorial Reihe. Habe nun alle 4 durch und blicke nun ein bisschen durch. Habe sogar schon an einem eigenen Plugin angefangen. Allerdings möchte ich dafür eine DB Table erstellen. Das klappt noch nicht so ganz. Vielleicht kennst du da ja noch einen guten hinweis. Ansonsten gucke ich fleißig in andere Plugins und schaue mir deren Lösungen an. =)

    Viele Grüße
    Benedict Ernst

  2. wie kann ich die reihenfolge der zu ladenen plugins ändern? ich möchte ein plugin an erster stelle laden, so dass der html ordentlich aussieht und die metadaten als erstes stehen.

Comments are closed.