WordPress besitzt die Kommentarfunktion, nichts anderes ist ein Gästebuch und ich möchte kurz am Beispiel des Standard-Theme TwentyTen zeigen, wie leicht und ohne Plugins ein Gästebuch eingerichtet ist. Ich erhoffe mir, dass damit die vielen Mails zu dem Thema weg bleiben und jeder eine einfache, funktionierende und saubere Lösung erstellen kann.
Das folgende Tutorial ist erst mit WordPress 3.0 und höher nutzbar, da seit dem die Funktionen für die Kommentare neu im Core sind. Im Grunde kann man das auf jedes Theme anwenden, man muss den Aufruf der Kommentarfunktion anschauen - wird dieser mit der neuen Funktion comment_form() realisiert.
Der grobe Ablauf
- Kopie der
page.php in guestbook-page.php erstellen
- Inhaltlich einige Veränderungen vornehmen
- Kopie der
comments.php in guestbook.php erstellen
- Inhaltlich den Aufbau ändern
- Templates in den Theme-Ordner kopieren oder Child-Theme erstellen
- Seite im Backend von WordPress erstellen und Template wählen

Die guestbook-page.php
Im neuen Template sind nur wenige Veränderungen vorzunehmen. Im ersten Schritt braucht das Template einen Namen, damit es im backend von WordPress für statische Seiten erkannt wird. Dies geschieht in den Kommentaren am Anfang der Datei.
<?php
/**
* Template Name: Guestbook
*
* A custom page for guestbook function.
*
* The "Template Name:" bit above allows this to be selectable
* from a dropdown menu on the edit page screen.
*
* @package WordPress
* @subpackage Twenty_Ten
* @since Twenty Ten 1.0
*/
Im Anschluss wird im Aufruf der Kommentarfunktion noch der Name der Datei mitgegeben, der sich um die Darstellung der Gästebucheinträge kümmert und das Formular zum Eintragen enthält. Im Grunde könnte man dies auch weglassen, aber dann ist inhaltlich alles auf Kommentare abgeglichen und das Formular für Neueinträge befindet sich am Ende, also nach den Einträgen. Da es bei Gästebüchern aber meist anders ist, legen wir das Formular vor die Liste der Einträge und ändern die Texte.
Daher muss also die Datei an die Funktion übergeben werden.
<?php comments_template( '/guestbook.php' ); ?>
Das Beispieltemplate mit den Änderungen in der kompletten Sicht:
<?php
/**
* Template Name: Guestbook
*
* A custom page for guestbook function.
*
* The "Template Name:" bit above allows this to be selectable
* from a dropdown menu on the edit page screen.
*
* @package WordPress
* @subpackage Twenty_Ten
* @since Twenty Ten 1.0
*/
get_header(); ?>
<div id="container">
<div id="content" role="main">
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php if ( is_front_page() ) { ?>
<h2 class="entry-title"><?php the_title(); ?></h2>
<?php } else { ?>
<h1 class="entry-title"><?php the_title(); ?></h1>
<?php } ?>
<div class="entry-content">
<?php the_content(); ?>
<?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Pages:', 'twentyten' ), 'after' => '</div>' ) ); ?>
<?php edit_post_link( __( 'Edit', 'twentyten' ), '<span class="edit-link">', '</span>' ); ?>
</div><!-- .entry-content -->
</div><!-- #post-## -->
<?php comments_template( '/guestbook.php' ); ?>
<?php endwhile; ?>
</div><!-- #content -->
</div><!-- #container -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Die guestbook-page.php
Auch hier gibt es wenig Verändeurngen. Im ersten Schritt holen wir das Formular vor die Ausgabe der Gästbuch-Einträge. Der folgende Code ist das Original und ruft das Formualr seit WordPress 3.0 auf.
<?php comment_form(); ?>
Diesen Code setzen wir nun vor die Ausgabe der Einträge, also vor
<?php
// You can start editing here -- including this comment!
?>
<?php if ( have_comments() ) : ?>
Um nun aber die Felder richtig anzupassen und entsprechende Texte mitzugeben, müssen einige Paramter der Funktion übergeben werden. Die Funktion comment_form() lässt sehr viele Möglichkeiten zu und alle Parameter werden in einem Array übergeben. Im Codex findet man die einzelnen Felder erläutert.
In meinem Fall sieht der Abschnitt dann wie folgt aus.
<?php
// You can start editing here -- including this comment!
// the form
$attr = array(
'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Guestbook entry', 'noun', 'twentyten' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
'label_submit' => __( 'Post Entry', 'twentyten' ),
'title_reply' => __( 'Leave a Entry', 'twentyten' ),
'title_reply_to' => __( 'Leave a Entry to %s', 'twentyten' ),
'cancel_reply_link' => __( 'Cancel reply', 'twentyten' ),
);
comment_form( $attr );
// list of guestbook entries
if ( have_comments() ) : ?>
Das Beispieltemplate mit den Änderungen in der kompletten Sicht:
<?php
/**
* The template for displaying Comments.
*
* The area of the page that contains both current comments
* and the comment form. The actual display of comments is
* handled by a callback to twentyten_comment which is
* located in the functions.php file.
*
* @package WordPress
* @subpackage Twenty_Ten
* @since Twenty Ten 1.0
*/
?>
<div id="comments">
<?php if ( post_password_required() ) : ?>
<p class="nopassword"><?php _e( 'This post is password protected. Enter the password to view any comments.', 'twentyten' ); ?></p>
</div><!-- #comments -->
<?php
/* Stop the rest of comments.php from being processed,
* but don't kill the script entirely -- we still have
* to fully load the template.
*/
return;
endif;
?>
<?php
// You can start editing here -- including this comment!
// the form
$attr = array(
'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Guestbook entry', 'noun', 'twentyten' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
'label_submit' => __( 'Post Entry', 'twentyten' ),
'title_reply' => __( 'Leave a Entry', 'twentyten' ),
'title_reply_to' => __( 'Leave a Entry to %s', 'twentyten' ),
'cancel_reply_link' => __( 'Cancel reply', 'twentyten' ),
);
comment_form( $attr );
// list of guestbook entries
if ( have_comments() ) : ?>
<h3 id="comments-title"><?php
printf( _n( 'One Entry in %2$s', '%1$s Entries in %2$s', get_comments_number(), 'twentyten' ),
number_format_i18n( get_comments_number() ), '<em>' . get_the_title() . '</em>' );
?></h3>
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Entries', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Entries <span class="meta-nav">→</span>', 'twentyten' ) ); ?></div>
</div> <!-- .navigation -->
<?php endif; // check for comment navigation ?>
<ol class="commentlist">
<?php
/* Loop through and list the comments. Tell wp_list_comments()
* to use twentyten_comment() to format the comments.
* If you want to overload this in a child theme then you can
* define twentyten_comment() and that will be used instead.
* See twentyten_comment() in twentyten/functions.php for more.
* use param reverse_top_level to reverse the order of the guestbook-entries
*/
wp_list_comments( array( 'reverse_top_level' => TRUE, 'callback' => 'twentyten_comment' ) );
?>
</ol>
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous"><?php previous_comments_link( __( '<span class="meta-nav">←</span> Older Entries', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Entries <span class="meta-nav">→</span>', 'twentyten' ) ); ?></div>
</div><!-- .navigation -->
<?php endif; // check for comment navigation ?>
<?php else : // or, if we don't have comments:
/* If there are no comments and comments are closed,
* let's leave a little note, shall we?
*/
if ( ! comments_open() ) :
?>
<p class="nocomments"><?php _e( 'Guestbook are closed.', 'twentyten' ); ?></p>
<?php endif; // end ! comments_open() ?>
<?php endif; // end have_comments() ?>
</div><!-- #comments -->
Die Sprache
Nun müssen die Felder übersetzt werden. Dazu sollte ein Werkzeug genutzt werden - meine Empfehlung das Plugin für WordPress Localization. Damit wird nun die Sprachdatei des TwentyTen Theme neu erstellt und die neuen Sprachschlüssel erkannt, welche dann übersetzt werden können.
Hinweis: Damit wird ein Teil dem Update entnommen - die Sprachdatei. Daher ist es sauberer, wenn man ein Child-Theme anlegt, dort die beiden Templates ablegt und die Sprachdatei dort erzeugt. Hinweise, wie man ein Child-Theme erzeugt, findet ihr im Artikel WordPress Child Themes verstehen. Trotzdem habe ich mal als Beispiel als Child Theme erzeugt. Es enthält die Sprachdateien und die Templates für das Gästebuch, sowie die notwendigen Dateien und Strings um ein Child Theme für diese Funktion zu erzeugen. Damit sollte es einfach möglich sein ein Child Theme mit der Möglichkeit der Erweiterung und einem Gästebuch zu erstellen. Der Download ist in den folgenden Zeilen zu finden.
Abschluss
Nun gilt es die beiden php-Templates und die Sprachdatei in das Theme zu kopieren und eine neue Seite über das Backend zu erstellen. Vergebt einen Namen für das Gästebuch, hinterlasst eventuell einen einführenden Text für die Gäste und wählt das neue Template „Guestbook“ in der Meta-Box dieser Seite.
Wenn alles ok ist, dann steht nun euer Gästebuch und kann genutzt werden. Keine Plugins, keine unnötigen Ressourcen oder Tabellen in der Datenbank. Aber, abhängig von Theme, was auch richtig ist, denn es handelt sich im Themen zum Design - der Inhalt steht in der Datenbank.
Für alle, die sich das Kopieren des Code ersparen wollen, lege ich die beiden Dateien als zip ab, so dass man sie downloaden und nutzen kann.
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.
Viel Freude damit und viel Erfolg beim Verstehen des Code und meiner kurzen Anleitung. Für Hinweise, Verbesserungen und Fehler steht die Kommentarfunktion zur Verfügung - vielen Dank.
Und wie bekommt man es hin, dass die Einträge absteigend sortiert werden? Also der neueste Eintrag ganz oben?
@Tom: dazu den Aufruf in der
guestbook.phpder Liste erweitern, der Template-Tagwp_list_comments()hat einige Parameter.wp_list_comments( array( 'reverse_top_level' => TRUE, 'callback' => 'twentyten_comment' ) );Kann man mit auch komfortabel das Layout des Forms beeinflussen?
Derzeit arbeite ich noch ganz klassisch und definiere die Felder direkt in der comments.php bzw. guestbook.php
Vielleicht kannst Du mir einen Tipp geben, wie ich mit ein zweispaltiges Layout hinbekomme:
Linke Spalte: Name, E-Mail, Website
Rechte Spalte: Kommentar
@Christian: man kann natürlich das Form via CSS formatieren, in dem Fall würde ich die Seite abfragen und dann Stylesheet laden, damit es nur beim Gästebuch geladen wird. Alternativ kannst du via body_class() die Seite als class ansprechen und so für das Form des Gästebuchs ein eigenes Design via CSS erstellen.
Hallo, da mir die Forum Plugins für WordPress alle zu komplex und überfrachtet sind, möchte ich fragen, ob es möglich ist, mit der Kommentarfunktion in WP 3.0 ein Forum zu basteln? Vielleicht kann man dazu das Gästebuch erweitern?
@Martin: ich würde dies vermutlich eher über custom post type machen, da man mit der Kommentarfunktion nicht die untersch. Threads abwickeln kann. Vermutlich wird aber eine Forensoftware hier bessere Dienste leisten. Alternativ schaue die bbPress an bzw. BuddyPress und nutze die Forenfunktion.
Danke für den netten Artikel, ich wollte eh in einem neuen Blog ein Gästebuch einbauen da kommt mir dieser Artikel wie gerufen. Gleich mal Bookmarken das ich den wieder habe wenn ich dann das Gästebuch aufbauen möchte.
Ein sehr gutes Turorial. Ich habe schon einige Plugins ausprobiert, die mir jedoch alle nicht besonders gefallen hatten. Werde versuchen, ob ich das auch so zusammengebastelt bekomme.
Ergänzend habe ich nun ein Child Theme erstelle, welches die Templates für dass Gästebuch, die Child-Theme Voraussetzungen und die Sprachdateien enthält, so dass man im Grunde nur das Theme aktivieren muss und schon hat man TwentyTen in deutscher Sprache inkl. der Möglichkeit ein Gästebuch zu erstellen und trotzdem kann man TwentyTen immer updaten.
Super, genau auf der Suche nach dieser Art von Gästebuch war ich in letzter Zeit.
Die Themes sehen wirklich nett aus, kann man nur weiterempfehlen!!
Mit dem Child Theme habe ich aber irgendwie noch Probleme..
Naja auch die werde ich im Laufe des Tages lösen
Danke und Grüße
Wie sieht es mit der Möglichkeit einer Navigation (ähnlich WP-PageNavi) für die Kommentare aus? Bei 50+ Einträgen wird die Liste nämlich ganz schön lang.
Wenn das noch drinn wäre, wäre es das perfekte Gästebuch.
@Christian: die ist drin, wenn du sie zentral in den Einstellungen der Kommentare aktiv hast.
Ich versteh nur Bahnhof, will das aber unbedingt nutzen können
Gibt es da eine Anleitung für dummies?
Hi!
Danke für das tolle Plugin!
Ich habe aber noch eine Frage, wie der erste Feedbackler hier, wie man die Liste so sortieren kann, dass der neueste Eintrag ganz oben steht.
Du schreibst folgendes dazu:
In meiner guestbook.php ist allerdings kein "wp_list_comments" zu finden und ich weiss nicht, wo ich es einfügen muss.
Könntest du mir bitte dabei helfen?
Gruss
Viv
@Viv: die Funktion muss da sein, sonst fehlt die Ausgabe der Kommentare, ist in meinem Beispiel auch drin.
Wirklich ein super Tutorial. Habe lange Zeit selber versucht ein Gästebuch auf WP zu entwickeln, habe es jedoch nie hinbekommen. Nun kann ich endlich ein Gästebuch auf meinen Blog nutzen.
Vielen Dank!
Hallo Frank,
wirklich ein toller Artikel. Ich habe mir dein Tutorial für meinen Blog zu Gemüte geführt - habe es zwar nicht gleich hinbekommen, aber mit der Hilfe meines Bruder, der ein echter WordPress-Profi ist, hat es super geklappt. Wollte schon immer mal ein neues Design für mein Gästebuch - immerhin soll ein Blog ja auch design-mäßig ansprechend sein. Ich denke, wenn das Gästebuch keinen guten Eindruck macht, sinkt auch die Kommentier-Freudigkeit der User. Bei mir ist es zumindest so. Andernfalls macht das Kommentieren gleich doppelt soviel Spaß.
Nochmals danke und liebe Grüße,
Phil
Tolle Anleitung. Selbst für mich leicht umzusetzen.
Danke + Gruss
Nobby
Hallo Frank,
da hab ich mich wohl zu früh gefreut:
beim erstenmal hat Alles geklappt. Jetzt, ich musste komplett neu installieren, geht es nicht mehr.
ich habe das guestbook-tutorial in den template ordner kopiert und anschliessend eine Seite namens Gästebuch angelegt (dort guestbook als template ausgewählt). Aber wenn ich Gästebuch jetzt anklicke erscheint nur mein Seitentext.
Wo liegt mein -eingefahrener- Gedankenfehler.
Gruss + Danke
Nobby
@Nobby: vermutlich hast du die Kommentare nicht offen, also schaue mal in die Einstellungen --> Diskussion ob Kommentieren erlaubt ist; alternativ schaue an der Seite Gästebuch, ob das das Kommentieren aktiv ist.
Jupps,
das war's. Ich habe in anderen immer wieder gesucht!
Gruss + Danke
Nobby
ich hatte das vor einiger Zeit auch mal versucht, allerdings bin ich über die Kommentar-Einstellungen von WordPress "gestolpert".
Im Detail:
Wenn eingestellt ist, dass Kommentare nach einer bestimmten Zeit automatisch geschlossen werden, hat auch mein Gästebuch getroffen.
Hast Du / Habt Ihr eine Idee, wie man das lösen könnte?
@Christoph: dies ist aufwendig, da man diese ID der Page aus dem Prozess bekommen muss, also via Plugin.
Einfach und effektiv würde ich sagen, vielen Dank! Habe auch schon das ein oder andere mal nach so einer Lösung gesucht und wie so oft bei Dir gefunden!
ui das ist mal ne schöne funktion.... dann will ich doch mal gucken ob ich das ganze auch in meinem blog realisiert bekomme...
Werd's gleich mal testen ob ich es hinbekomme; aber so schwierig sieht dass ja gott sei dank nicht aus =)
Danke.
Hallo Frank,
ich habe die Datein in mein twenty-theme-ordner eingefügt und die php-Datein sind auch im Editor zu sehen. Aber wenn ich eine Seite erstelle, kann ich in der Meta-Box (Attribute) nur zwischen dem Standardtemplate und dem one column, no sidebar-Template wählen. Hast du eine Idee, warum mir das guestbook-template nicht angezeigt wird?
LG
iri
@iri: wenn der FTP-Upload sauber war, dann kann es nur an den Rechten der Datei liegen.
Hallo Frank,
vielen Dank für deine schnelle Antwort. Da ich noch in der Testphase bin, arbeite ich lokal mit xampp, kann es daran liegen?
LG
iri
@iri: nein, eher nicht; gerade XAMPP unter Windows hat eher zu viele Rechte.
Oje, ich muss mal ganz doof fragen, wo kann ich denn die Rechte der Datei überprüfen bzw. was muss ich ändern?
iri
@iri: ich vermute, dass es daran unter XAMPP nicht liegt, aber schaue mal mit dem Kontexmenu (rechte MOusetaste) - Eigenschaften - Sicherheit, wenn du Windows einsetzt. Auf dem Server wird via chmod gesetzt, bzw. eine Linux-Plattform.
Hallo Frank, nachdem ich mir deine Anleitung noch mal durchgelesen habe, habe ich nun meinen Fehler gefunden! Ich hatte das Child-Theme in das Twentyten-Theme kopiert anstatt direkt unter Themes!
Aber jetzt habe ich mir erst deinen Artikel über Child-Themes durchgelesen. Da hab ich noch mal ne Frage. Ich habe an dem Theme TwentyTen in der Style.CSS schon einige Änderungen vorgenommen. Wenn ich jetzt das Gastbook-Child-Theme lade, sehe ich ja meine style.css nicht mehr. Kann ich einfach meine komplette style.css (vom twentyten) in die style.css vom Child-Theme kopieren? Denn ich kann jetzt gar nicht mehr so genau sagen, wo ich überall Änderungen vorgenommen habe.
Ich bin halt Neueinsteiger in WP und erschrecke mich jedesmal, wenn ich wieder neue Tipps und Hinweise entdecke, was man alles beachten solte.
Viele Grüße
iri
Ich hab diese Methode schon einige mal getestet, bin dann aber immer an einer Stelle ins straucheln gekommen, und hab eine andere Lösung verwendet. Mein Problem ist immer: wenn ich "reverse_top_level" verwende, dann macht WP da aus irgendeinem Grund ne seltsame Abfrage:
Wenn ich z.B. 12 Einträge habe und 10 pro Seite, dann werden auf der ersten Seite nur 2 angezeigt und auf der 2. die restlichen 10. Das sieht dann etwas komisch aus. Gibt es da bei jemandem ähnliche Erfahrungen und vielleicht eine Lösung. (Vielleicht liegt es auch an den Einstellungen im Admin-Bereich, aber bei mir lief es jedesmal auf dieses Ergebnis raus.)
Ich hab jetzt noch einmal nachgeschaut "reverse_top_level" sortiert bei mir nur innerhalb einer Kommentarseite die Einträge andersherum, aber nicht alle Kommentareinträge "rückwärts" wie eigentlich erwartet. Letztendlich fängt man dadurch einfach von hinten an sich die Einträge anzugucken - dadurch kann es passieren das auf der letzten/ersten Seite eben nur 2 Einträge stehen.
Besser wäre warscheinlich eine Abfrage mittels wp_query() zu erstellen.
Ich habe das selbe Problem wie Volly, nämlich die Reihenfolge der Seiten. Ansonsten ist die vorgestellte Gästebuchfunktion klasse. Gibt es hierfür irgendeine Lösung? Ansonsten ist das für mich leider ein Grund, doch auf ein Gästebch-Plugin zurückzugreifen, da die User die Reihenfolge der Seiten wahrscheinlich nicht verstehen werden.
nutzt eventuell folgende kleine Funktion, die die Reihenfolge ändert; ablegen in der functions.php oder auch dem Template zum Gästebuch. Allerdings wirkt es so auf alle Kommentare, daher sollte man abfragen, ob man auf dem Gästebuch ist: is_page( 'gaestebuch' )
Danke für deine Antwort. Bei mir hilft der Code leider nicht weiter, ich habe ihn in der functions.php des child-themes eingesetzt.
Habe ihn auch ohne if probiert, da das Gästebuch die einzige Stelle ist, wo Kommentare zum Einsatz kommen.
Ist der Code spezifisch für TwentyTen, oder sollte er auch bei anderen Themes funktionieren?
@Thomas: ist Theme unabhängig, aber WP Version abhängig. Der Hook existiert seit Version 2.1 von WordPress.
Hallo Frank,
nach dieser Möglichkeit hatte ich ewig gesucht. Deswegen wollte ich Dir hiermit kurz Danke für dein WordPress Gästebuch Tuturial sagen.
Ich hab leider massive probleme das ganze ein zu bauen da ich nen anderes them nutze... bzw warscheinlich ne andere WP version.... naja ich werd mal noch nach lösungen suchen denn eigendlich ist das genau die funktion die ich gesucht hatte...
Sehr schönes tut
Aber wie kann man die html tags unter dem textfeld deaktivieren?
@Klaus: in der Regel nur durch das Auskommentieren in der comments.php
Hallo ... vielen Dank mal für die Infos - ich bin grad beim Ausprobieren.
Zu der Reihenfolge der Einträge: im derzeitigen WordPress unter Einstellungen - Diskussion kann man ganz einfach einstellen, dass die letzten Kommentare oben zu stehen haben.
Liebe Grüße, lisia
Hallo,
Danke für das tolle Tutorial. Habe es unter twentyeleven eingebaut.
Leider gibt es dort aber einen Darstellungsbug im Mail-Feld.
Was mich aber mehr interessiert ist, wie ich es hinbekomme
einen view nur für die Einträge zu haben und nur einen Link zum comment_form.
man kann quasi zwischen beiden Ansichten hin und her schalten.
Hast Du da einen Tipp?
Danke Ingo