Sidebar
ein-/ausblenden

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

Plugin für WordPress SEO

Anzeige

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


15 Kommentare zu „WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 3“

  1. 1
    Pingback von WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 2 - bueltge.de [by:ltge.de]
  2. 2
    Pingback von WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 1 - bueltge.de [by:ltge.de]
  3. 3
    Pingback von WP - Tutorial, wir schreiben ein simples WP-Plugin - Teil 0 - bueltge.de [by:ltge.de]
  4. 4
    Pingback von » by:ltge.de - In Sachen Wordpress mein Favorit - Wochenblog
  5. 5
    Pingback von Wordpress Plugin-Erstellung at Blogschrott
  6. 6
    Pingback von WP - Tutorial, wir schreiben ein simples WP-Plugin - Teil 0 - bueltge.de [by:ltge.de]
  7. 7
    Pingback von WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 1 - bueltge.de [by:ltge.de]
  8. 8
    Pingback von WP - Tutorial, wir schreiben ein WordPress Plugin - Teil 2 - bueltge.de [by:ltge.de]
  9. 9
    Kommentar von Benedict Ernst

    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

  10. 10
    Pingback von Matthias Pospiech » Blog Archive » Development of a Plugin for Wordpress
  11. 11
    Kommentar von seppelb

    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.

  12. 12
    Kommentar von Melanie [Aber Natürlich]

    Das Danke mit extra dickem ! geht zurück. Hab in deutscher Sprache keine vergleichbar gute Anleitung gefunden.

  13. 13
    Kommentar von Andreas

    Danke für das gute Tutorial. Werde die Idee mit den Feldern in meinem Blog einsetzen, da durch die Verwendung des Plugins "qTranslate" bei den Descriptions doppelter Content generiert wird. Man kann zwar auch das Feld "Auszug" verwenden (get_the_excerpt()) aber das geht leider nur für Posts und nicht für Seiten.

  14. 14
    Kommentar von Phil

    Vielen Dank für diese super Artikel-Serie! Aber welches Plugin benutzt du für den Kasten der in den Artikel-Serien immer zu sehen ist? (Wenn ich mal so neugierig fragen darf)

  15. 15
    Kommentar von Frank Bültge

    @Phil: die sind ohne Plugin entstanden, einfaches xHTML und CSS im Beitrag.

  16. 16
    Kommentar von tux.

    Ich habe es inzwischen aufgegeben, ein gutes WP-Plugin zu finden, das es meinen Besuchern erlaubt, ihre Kommentare nachträglich zu ändern, ohne mit komischen Overlay-Popups belästigt zu werden, und will nun selbst aktiv werden. Hierzu müsste ich aber, wenn ich das richtig sehe, die Befugnisse des Besuchers "überschreiben". Gibt es dafür einen Hook? Im Plugin-API konnte ich nichts dergleichen finden.

  17. 17
    Kommentar von Hansi

    hmmm... weiss nicht ob es hier her passt, jedoch suche ich eine ebenso verständliche ;) Anleitung wie ich ein Plugin in das WordPress Repository einfügen kann.
    Denn die Anleitung auf WP.org verwirrt mich ...
    ... vielleicht hat ja jemand brauchbare Tips bzw. Links für mich ;)

    Gracias! :)

  18. 18
    Kommentar von Frank Bültge

    @tux.: nein, dazu ist mir nichts bekannt; du musst direkt in die DB schreiben, bzw. den Hook ansprechen, der die Kommentare ändert und die Berechtigung raus nehmen.

  19. 19
    Kommentar von Driver

    Ich suche nach einer Möglichkeit das aktuelle Datum "innerhalb" eines Posts auszugeben. Allerdings immer an unterschiedlichen Positionen. So dass ich es nicht in die single.php schreiben kann. Habt Ihr eine Ahnung, wie das zu lösen ist? Bzw. gibt es ein Plugin? Google hat mir leider nicht weiter geholfen. Danke. VG Driver

  20. 20
    Kommentar von Frank Bültge

    @Driver: könntest du via Shortcode lösen, ein Shortcode der einfach das Datum des Posts ausgibt.

  21. 21
    Kommentar von Michel Fest

    Hi Frank, auch von mir ein großes Danke für die Artikelreihe. Ich hatte ein Bookmark gesetzt und jetzt endlich mal Zeit, mich damit zu befassen. Wenn man's einmal gemacht hat, scheint das mit den WP-Plugins gar nicht mehr so kompliziert.

    Eine kleine Anmerkung: Die Links "the_loop" im ersten Absatz funktionieren nicht mehr. Wurden wahrscheinlich geändert/umgezogen. Evtl. hab ich da ja mal einen Tipp für dich, um was zurückzugeben ;) Es gibt da ein Plugin, das nennt sich "Broken Link Checker". Nutze ich selbst und bin sehr zufrieden. Da merkt man immer schnell, falls mal ein Link nicht mehr aktuell ist.

  22. 22
    Kommentar von Frank Bültge

    @Michel: viel Spass, auch wenn es schon etwas älter ist, so passt es noch immer; danke für den Link-tip; ist bekannt und lediglich die Zeit sorgt für diese Fehler; habe sie aber direkt korrigiert.

  23. 23
    Kommentar von FibreFoX

    Ich weiß, dass ich ein wenig paranoid bin, aber ich würde bei dem SQL-Statement lieber die Vorteile eines Prepared Statements verwenden (via $wpdb->prepare).

    Es ist ein sehr unwahrscheinlicher Angriffsvektor, aber wenn ein Angreifer ein manipuliertes Template einschleusen kann ins System, wären somit die Tore für SQL-Injection offen.

    (ich hoffe das hier gilt nicht als Leichen-Fledderei :P )

  24. 24
    Kommentar von Frank Bültge

    @FibreFoX: $wpdb->prepare ist defintiv richtig, sage ich immer wieder und sollte ich wohl hier anpassen.

Kommentare sind geschlossen.