Im ersten Teil haben wie erreicht, dass unser Plugin eine Funktion enthält, mit der wir innerhalb von „the loop“ ein bestimmtes Feld aus den „Benutzerdefinierte Feldern“ auslesen können.
Nun möchte ich ein wenig mehr darauf eingehen, wie man Abfragen in den Adminbereich von WordPress bringt. Ich denke, dass dies doch des öfteren benötigt wird und somit muss der Teil 3 dieser Serie sich mit dem Ausführen der Funktion außerhalb von „the loop“ beschäftigen.
Ich hoffe, dass mir die jenigen verzeihen, die darauf gewartet haben - Teil 3 kommt bestimmt.
Optionsseite erstellen
Bringen wir nun eine neue Seite in unseren Adminbereich, in dem Fall bringen wir die Seite in den Punkt „Optionen“. Dazu ist nicht viel Code notwendig. Die nötigen Mittel dazu bekommen wir von WP, das durch seine Pluginfunktion sehr gute Mittel dafür mitbringt.
function fb_meta_description_option_page() {
} // Ende Funktion fb_meta_description_option_page()
// Adminmenu Optionen erweitern
function fb_meta_description_add_menu() {
add_options_page('WP Tutorial-Plugin', 'WP Tutorial', 9, __FILE__, 'fb_meta_description_option_page'); //optionenseite hinzufügen
}
// Registrieren der WordPress-Hooks
add_action('admin_menu', 'fb_meta_description_add_menu');
?>
Mehr Erläuterungen zu den Hooks findet ihr im Artikel „WP - Hinweise für das Schreiben eines WordPress-Plugins“ und im Teil 0 dieses Tutorials.
Wenn ihr nun wieder in euer WP-System geht und das Plugin ist hoffentlich noch aktiv, dann schaut mal unter dem Punkt „Optionen“. Dort sollte es nun den Punkt „WP Tutorial“ geben. Anklicken - sollte ohne Fehler passieren und eine leere Seite zeigen
Das nützt uns natürlich nicht sonderlich viel. Versuchen wir nun unseren Bereich auszubauen und in diesem Feld den Namen für unsere Funktion zu übergeben. Damit könnten wir uns das direkte Ändern der Funktion im Code ersparen, denn jetzt muss man ja das Feld, z.B. description immer direkt in der Funktion ändern und das ist nicht sonderlich komfortabel.
Optionsseite mit Inhalt erstellen
Den obigen Code bauen wir nun aus. Auf der Seite haben wir eine Kontainer mit der CSS-class wrap, diese wird vom Adminbereich genutzt. Weiterhin haben wir ein Formular, welches die Daten dann aktualisiert. Um diese Daten zu aktualisieren, gibt es im WordPress den Hook add_option, damit können wir ein Feld in die Datenbank der Tabelle TABLEPRÄFIX_options schreiben. In unserem Beispiel fügen wir das Feld fb_meta_field hinzu und füllen es mit dem Wert description.
function fb_meta_description_option_page() {
?>
<!-- Start Optionen im Adminbereich (xhtml, außerhalb php) -->
<div class="wrap">
<h2>WP Tutorial Optionen</h2>
<form name="form1" method="post" action="<?=$location ?>">
<input name="fb_meta_field" value="<?php echo get_option('fb_meta_field'); ?>" type="text" />
<input type="submit" value="Speichern" />
<input name="action" value="insert" type="hidden" />
</form>
</div>
<?php
} // Ende Funktion fb_meta_description_option_page()
// Adminmenu Optionen erweitern
function fb_meta_description_add_menu() {
add_option( 'fb_meta_field', 'description' ); // optionsfield in Tabelle TABLEPRÄFIX_options
add_options_page( 'WP Tutorial-Plugin', 'WP Tutorial', 9, __FILE__, 'fb_meta_description_option_page' ); //optionenseite hinzufügen
}
// Registrieren der WordPress-Hooks
add_action( 'admin_menu', 'fb_meta_description_add_menu' );
?>
Nun haben wir die Seite zwar in WP und wir können auch Daten eingeben, die Daten werden aber noch nicht an die Datenbank übermittelt. Dazu benötigen wir noch die Abfrage des Formulars, was soll also passieren, wenn der Button „Speichern“ geklickt wird. Dazu folgende Zeilen hinzufügen.
$fb_meta_field = get_option('fb_meta_field');
if ('insert' == $HTTP_POST_VARS['action']) {
update_option( 'fb_meta_field', esc_html( $HTTP_POST_VARS['fb_meta_field'] ) );
}
Wenn wir nun in das Feld einen Wert eintragen, dann wird dieser auch in der Datenbank abgelegt.

Wenn ihr aber nun euren Beitrag mit der Funktion (aus Teil 1) anseht, dann werdet ihr sicher merken, dass sich nichts ändert, obwohl ihr im Adminbereich den Feldnamen ändert - nun das ist normal, denn wir haben das Feld nicht in unsere Abfrage eingebunden. Das machen wir nun noch.
if ( $key == $fb_meta_field ) {
Insgesamt sieht der Code bei mir nun so aus. Achtung, die Werte im Feld müssen natürlich dem entsprechen, die es auch als benutzerdefiniertes Feld gibt.

<?php
/*
Plugin Name: Meta Description
Plugin URI: http://bueltge.de/
Description: Benutzerdefiniertes Feld Description auslesen
Version: 1.2
Author: Frank Bueltge
Author URI: http://bueltge.de/
*/
$fb_meta_field = get_option('fb_meta_field');
if ('insert' == $HTTP_POST_VARS['action']) {
update_option( 'fb_meta_field', esc_html( $HTTP_POST_VARS['fb_meta_field'] ) );
}
// Innerhalb von the_loop reicht das
function fb_meta_description() {
global $id, $post_meta_cache, $fb_meta_field; // globale Variablen
if ( $keys = get_post_custom_keys() ) {
foreach ( $keys as $key ) {
$values = array_map( 'trim', get_post_custom_values($key) );
$value = implode( $values, ', ' );
if ( $key == $fb_meta_field ) {
echo "$value";
}
}
}
} // Ende Funktion fb_meta_description()
function fb_meta_description_option_page() {
?>
<!-- Start Optionen im Adminbereich (xhtml) -->
<div class="wrap">
<h2>WP Tutorial Optionen</h2>
<form name="form1" method="post" action="<?=$location ?>">
<input name="fb_meta_field" value="<?=get_option("fb_meta_field");?/>" type="text" />
<input type="submit" value="Speichern" />
<input name="action" value="insert" type="hidden" />
</form>
</div>
<?php
} // Ende Funktion fb_meta_description_option_page()
// Adminmenu Optionen erweitern
function fb_meta_description_add_menu() {
add_option("fb_meta_field","description"); // optionsfield in Tabelle TABLEPRÄFIX_options
add_options_page('WP Tutorial-Plugin', 'WP Tutorial', 9, __FILE__, 'fb_meta_description_option_page'); //optionenseite hinzufügen
}
// Registrieren der WordPress-Hooks
add_action('admin_menu', 'fb_meta_description_add_menu');
?>
Download:
Ist die Arbeit nicht 1 Euro wert?
Jede Spende wird dankbar angenommen und ermöglicht das weitere Arbeiten an freier Software.
Möchtest du mehr oder anders spenden, so besuche meine Wunschliste.
Download als phps-Datei: fb_meta_description_2.phps - 680 byte
Hallo,
ich habe auf die schnelle probiert mich in die Plugins einzuarbeiten, um herauszufinden in welchen Passagen die Rechte im Admin-Bereich (für Role-Manager) deklariert werden. Leider erfolglos.
Bei den meisten Plug-Ins läuft die Zusammenarbeit mit Role-Manager wunderbar. Doch bei Einem möchte ich dies nachträglich auch optimieren, damit auch Laien ihr (leichteres) Backend bedienen können.
Ist dies schwierig?
Wäre für jede Hilfe/ Link/ Tipp sehr dankbar.
Grüße, Nicolas
Dazu steht natürlich auch eine Funktion zur Verfügung: current_user_can, Erläuterung in einem Beitrag "WP - Plugin Tipp - Userlevel abfragen" von mir und ein aktueller Linktipp
Wunderbare Tutorials! Bin echt begeistert... habe bisher immer alle Funktionen ausgelagert, aber ist ja echt einfach das ganze ins WP-Backend zu integrieren.
Gruß Chukki
hallo, ich schon wieder...will ja nicht nerven
habe dein tutorial einmal durchgemacht, um aus dem backend variablen zu setzen.
funktioniert auch soweit. das form wird richtig dargestellt.
aber: er frisst die variable =$location nicht.
lasse ich das "=" weg, wird die seite angezeit ohne inhalt unter "action".
wie muss die variable heissen das er sie richtig herholt? oder kann ich z.b. auch fix "options.php" eintragen?!
kann ich die geschriebene variable auch aus dem template wieder herholen?
danke
fehler gefunden!
die variable nimmt er aber $HTTP_POST_VARS muss $_POST sein...
dann übernimmt er endlich den neuen eingabewert!
wozu is jetzt die
function fb_meta_description()
{ ...}
da?! wenn ich die befehle darin auskommentiere, geht es ja trotzdem.
und sie wird ja nirgens aufgerufen...
Ich habe ein Plugin, das aus den Daten aus der form eine neue Webseite präsentiert.
Wenn ich diese Ausgebe, dann wird die allerdings nicht im admin Bereich, sondern komplett oberhalb ausgegeben (noch vor html und head!).
Kannst du ein Beispiel geben, wie man mit forms nicht nur Variablen setzt, sondern auch eine webseite / html Code danach ausgibt?
@Matthias: Dazu muss man anders vorgehen, du musst im Content etwas ersetzen. Dazu muss auf den Inhalt zugegriffen werden. So kann man zum Beispiel einen Schlüssel oder Shortcode im Content absetzen, der dann den Inhalt von deinem Form setzt.
Ich habe es jetzt gelöst, aber denke nicht, dass es eine saubere Lösung ist. Imwesentlichen prüfen ich in einer "pluginname_main()" auf alle POST Variablen, und führe den eigentlichen main code nur aus, wenn keine davon zutraf.
Klasse Tutorial, das ist ja tatsächlich garnicht soo schwierig. Werd mich am Wochenende wohl auch mal an einem eigenen Plugin versuchen. Meine PHP-Kenntnisse lassen allerdings zu wünschen übrig, ich hoffe es klappt trotzdem.
Klasse Artikel.
Habe bis jetzt meine selbstgestrickten Plugins meist aus anderen abgeleitet.
Aber jetzt brauche ich mal einen richtig "Von-Grund-Auf-Schnellanleitung".
Danke, bekommt auch einen Tweet.
Jürgen
Vielen Dank für eine gute Einleitung! Vor allem Teil 0 und 1 sind sehr hilfreich. Wenn man die verstanden hat, so kann man schon einfache Plugins schreiben. Ich ich habe gerade meinen ersten WordPress Plugin geschrieben =)
http://www.virtual-maxim.de/projekte/aktuelle/piwiksearchenginekeywords/
Gruß, Maxim
Hmmmm..., bin ich zu doof oder warum klappt das nicht so richtig.
Folgender Code scheint bei mir nicht richtig zu funktionieren:
Hier wird bei mir im HTML-Code unter "action" wörtlich -?$location ?- angezeigt und kein Wert aus der Variable $location übergeben.
und auch
zeigt mir im Textfeld nicht den Meta-Wert vom Key "description", sondern wird auch wörtlich (-?=get_option( 'fb_meta_field' ); ?-) angezeigt.
Nebenbei: In meiner WordPress-Version (3.0.2) hat sich die Funktion "the_meta()" stark verändert (z.B. stehen bei mir nicht die globalen Variablen "$id", "$post_meta_cache", "$fb_meta_field" drin)
Hängt das Problem vielleicht damit zusammen? Ich wäre für Hilfe sehr dankbar.
Grüße
gundi
Sorry, ich habe noch vergessen:
Überall, wo ich ein "-" (Bindestrich) gesetzt habe steht bei mir ein "" im Code. Ich konnte es komischerweise nicht hier rein schreiben, weil versucht wurde als HTML-Code darzustellen (und es somit nicht sichtbar war).
@gundi: Code muss maskiert sein, dann wird er auch dargestellt und ich kann ihn lesen.
Gundis Fehler hatte ich auch, Problem ist vermutlich die PHP-Version bei XAMPP o.ä., bei mir muß die Zeile wie folgt lauten:
<form name="form1" method="post" action="<?php echo $location; ?>">D.h. Shortcuts funktionieren nicht und es muss zwingend das "php" ergänzt werden.
@Cognac: dies ist eine Einstellung von PHP, wenn man auf dem Server die Kurzschreibweise nicht zulässt, dann ist dies nicht möglich. Aber nach Codex und PHP Regeln sollte man diese Schreibweise eh nicht anwenden, was ich nicht mehr tue; aber der Beitrag ist schon etwas älter.
@Frank
Vielen Dank für die, wie ich meine, einzige deutsche Einführung in das Schreiben eines WP-Plugins, die etwas gebracht hat.
Nachdem ich nun vor ca. 1 Monat ein einfaches Plugin geschrieben hatte, ist dies inzwischen umfangreicher geworden. Seit ich nun 5 weitere Optionsmöglichkeiten in die Optionseite integriert habe, verursacht das Plugin leider einen Fehler.
Will man beim Schreiben eines Artikels eine Grafik über den Mediabutton einfügen, geht zwar das Fenster auf, aber es wird folgende Meldung gezeigt:
Klickt man auf: "Bitte nochmal versuchen" wird die ganze Adminseite mit der derzeitigen Artikelseite in das Fenster geladen.
Deaktiviere ich das Plugin, kann ich wieder Bilder einfügen.
Ich poste das hier, weil ich im Netz bisher viele, aber keine passende Anwort gefunden habe (weder englisch noch deutsch) und weil ich glaube, dass dies irgendein Anfängerfehler ist.
Vielleicht hast Du ja mal so ein Ding gehabt und eine Lösung gefunden oder einen Ansatz, wo ich suchen sollte?
@Frank und Interessierte:
Habe den Fehler gefunden. Ich hatte die DB-Einträge, also so etwas hier:
//Dings UID$dings_uid = get_option('dings_uid');
if(isset($_POST['action'])){
if ('insert' == $_POST['action']) {
update_option( 'dings_uid', esc_html( $_POST['dings_uid'] ) );
}
}
vor die Funktion (Definition) Optionpage gesetzt. Damit funktionierte zwar das Plugin, nicht aber der Upload von Mediendateien in Artikel oder Seiten.
Vielleicht hilft das ja mal dem einen oder anderen mit ähnlichen Problemen.