comments.php – Kommentare schreiben und anzeigen

Kein Blog kommt ohne vernünftige Kommentarfunktion aus, deshalb soll auch unser Template mit einem Kommentarformular ausgestattet werden. Lege als erstes die Datei comments.php in deinem Template-Ordner an.

Das Kommentar-Formular anlegen

In die Datei comments.php fügen wir nun folgenden Code ein:

<div id="kommentar_formular">

<h3 id="respond">Kommentar schreiben</h3>

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

	<p>
		<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" />
		<label for="author">Name</label>
	</p>

	<p>
		<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
		<label for="email">Email <small>(wird nicht veröffentlicht)</small></label>
	</p>

	<p>
		<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
		<label for="url">Webseite</label>
	</p>

	<p>
		Kommentar
		<textarea name="comment" id="comment" style="width: 100%;" rows="10" tabindex="4"></textarea>
	</p>

	<p>
		<input name="submit" type="submit" id="submit" tabindex="5" value="Kommentar abschicken" />
		<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
	</p>

	<?php do_action('comment_form', $post->ID); ?>

</form>

</div> <!-- kommentar_formular -->

Erklärung:
In die Div-Box “kommentar_formular” kommt unser kompletter Code der für das Formular nötig ist.

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

Das “action”-Attribut des Formulars erwartet den Link zur Datei “wp-comments-post.php”, die sich im root-Ordner des Blogs befindet (schau nach :) ). Diese Datei erwartet ein paar Werte und trägt den Kommentar ein, wenn alles in Ordnung ist. “get_option(‘siteurl’);” gibt uns die Blog-Root Url, daran hängen wir noch den Namen der Datei und der Formular-Kopf ist fertig.

Als nächstes erstellen wir die Input-Felder für die Werte “author”, “email” und “url”, sowie eine Textarea für den “comment”. Je nach Einstellung im WordPress Backend erwartet die Datei “wp-comments-post.php” diese Werte. Die Value-Werte von author, email und url sind jeweils mit einer Variable ausgestattet:

value="<?php echo $comment_author; ?>"
value="<?php echo $comment_author_email; ?>"
value="<?php echo $comment_author_url; ?>"

Wenn ein Besucher schonmal kommentiert hat und seine Werte noch vorhanden sind, werden die Formular-Felder vorausgefüllt, was dem Besucher ein bisschen Arbeit erspart.

Die beiden letzten Input-Elemente sind der Submit-Button und ein verstecktes Feld.

<input name="submit" type="submit" id="submit" tabindex="5" value="Kommentar abschicken" />
<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />

Der Submit-Button ist soweit selbsterklärend und das hidden-Feld erwartet die ID des aktuellen Beitrags, ebenfalls wichtig für die “wp-comments-post.php”-Datei.

<?php do_action('comment_form', $post->ID); ?>

Bei der letzten Zeile handelt es sich mal wieder um ein Plugin-API-Hook, sprich es gibt Plugins, die diesen Hook brauchen um korrekt zu funktionieren. Also, einfach rein und glücklich sein ;)

Kommentare ausgeben

Jetzt haben wir zwar ein Formular, über das der Besucher seinen Kommentar schreiben kann, aber noch keine Möglichkeit die Kommentare anzuzeigen. Dazu gibt es, ähnlich wie bei den Beiträgen, eine Loop, die Kommentar Loop. Füge unterhalb des Kommentarformulars in der Datei comments.php den folgenden, markierten Code ein:

</form>

</div> <!-- kommentar_formular -->

<div id="kommentare">
	<?php foreach ($comments as $comment) : ?>

		<div class="comment" id="comment-<?php comment_ID() ?>">

			<small class="commentmetadata"><?php comment_author_link() ?> <strong>|</strong> am <?php comment_date('j. F Y') ?> um <?php comment_time('H:i') ?> Uhr</small>

			<?php comment_text() ?>

		    <?php if ($comment->comment_approved == '0') : ?>
				<strong>Achtung: Dein Kommentar muss erst noch freigegeben werden.</strong><br />
			<?php endif; ?>

		</div>
	<?php endforeach; /* end for each comment */ ?>
</div><!-- kommentare -->

Der Code ist schnell erklärt: Wir wollen alle Kommentare in der Div-Box “kommentare” ablegen. Danach startet die Comment-Loop mit:

<?php foreach ($comments as $comment) : ?>

Jeder Kommentar erhält seine eigene Div-Box mit der Klasse “comment”. Da wir uns in der Loop befinden, können wir auf alle Kommentardaten des jeweiligen Kommentars zugreifen. Wir brauchen

  • den Autor – “comment_author_link()”, das ist der Name + der Link, wenn der User eine URL beim eintragen mit angegeben hat
  • das Datum und die Uhrzeit – “comment_date(‘j. F Y’)” und “comment_time(‘H:i’)”
  • den Kommentar – “comment_text()”

Der letzte Teil ist eine Anzeige-Prüfung. Wenn der Kommentar erst von einem Admin freigeschaltet werden muss, bekommt der User eine Nachricht und weiß, dass sein Eintrag erfolgreich war.

Kommentarformular anzeigen

Jetzt müssen wir nur noch eine Änderung an der Datei single.php vornehmen, damit unser Kommentarformular auch angezeigt wird:

<?php get_header(); ?>

	<div id="main">

		<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
			<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
         <div id="meta">
				<p>
					erstellt am: <?php the_date('d.m.Y'); ?> |
					von: <?php the_author(); ?> |
					Kategorie(n): <?php the_category(', '); ?>
				</p>
			</div>
			<div class="entry">
				<?php the_content(); ?>
			</div>
		<?php endwhile; endif; ?>

		<?php comments_template(); ?>

	</div><!-- main -->

	<div id="sidebar">
		<?php get_sidebar(); ?>
	</div><!-- sidebar -->	

<?php get_footer(); ?>

comments.php

Hier nochmal zur Zusammenfassung, was alles in unserer comments.php stehen soll:

<div id="kommentar_formular">

<h3 id="respond">Kommentar schreiben</h3>

<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" id="commentform">

	<p>
		<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" />
		<label for="author">Name</label>
	</p>

	<p>
		<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="2" />
		<label for="email">Email <small>(wird nicht veröffentlicht)</small></label>
	</p>

	<p>
		<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="3" />
		<label for="url">Webseite</label>
	</p>

	<p>
		Kommentar
		<textarea name="comment" id="comment" style="width: 100%;" rows="10" tabindex="4"></textarea>
	</p>

	<p>
		<input name="submit" type="submit" id="submit" tabindex="5" value="Kommentar abschicken" />
		<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
	</p>

	<?php do_action('comment_form', $post->ID); ?>

</form>

</div> <!-- kommentar_formular -->

<div id="kommentare">
	<?php foreach ($comments as $comment) : ?>

		<div class="comment" id="comment-<?php comment_ID() ?>">

			<small class="commentmetadata"><?php comment_author_link() ?> <strong>|</strong> am <?php comment_date('j. F Y') ?> um <?php comment_time('H:i') ?> Uhr</small>

			<?php comment_text() ?>

		    <?php if ($comment->comment_approved == '0') : ?>
				<strong>Achtung: Dein Kommentar muss erst noch freigegeben werden.</strong><br />
			<?php endif; ?>

		</div>
	<?php endforeach; /* end for each comment */ ?>
</div><!-- kommentare -->

Fazit – mehr zur comments.php

Die hier erklärte comments.php ist die absolute Basis. Es erfolgen so gut wie keine Überprüfungen, also ob nur registrierte Besucher kommentieren dürfen, ob der Beitrag passwortgeschützt ist und demnach wahrscheinlich auch keine Kommentare ohne Passwort angezeigt werden sollen und viele weitere. Zudem werden keine Gravatare angezeigt (User-Bilder neben dem Kommentar) und auch kein Captcha verwendet (wobei das eh besser durch ein Plugin gelöst werden sollte).

Ich denke aber, dass diese Basis besser ist als ein Beispiel was alles kann, denn so kann man selbst entscheiden welche Features man noch haben möchte. In den Template Tags gibt es einen extra Bereich für die Comment Tags, für alle die mehr aus der comments.php rausholen wollen.

hier geht's weiter...



Kommentare


Erstmal Danke für das erstellen des Handbuches. Denn mit Hilfe dessen habe ich mir auch ein Template/Theme von Grund-auf erstellt.

siehe hier http://www.dirtydriver.de/template/.

Nun zum eigentlichen Anliegen.

Bei einem Artikel mit deaktivierter Kommentar-Funktion wird das Formular trotzdem angezeigt. Mit dem einfügen der zwei Zeilen oberhalb und unterhalb des Formulars wird dies verhindert.


&lt;?php if ('open' == $post-&gt; comment_status) : ?&gt; 

&lt;div id=&quot;kommentar_formular&quot;&gt;

.

.

.

.

.

&lt;/div&gt; &lt;!-- kommentar_formular --&gt;

&lt;?php endif; ?&gt;

mfg

dIrtY


Super Tutorial, hat mir bisher sehr geholfen. Habe aber leider ein Problem mit der comments.php, leider können bei mir keine Kommentare geschrieben werden… an was könnte das liegen? Habe mich bis jetzt immer an diesem Tutorial gehalten, hat auch alles geklappt. Nur die comments.php bereitet mir Kopfschmerzen


@rickjames: Wird denn das Kommentarformular angezeigt? Es könnte auch daran liegen, dass Kommentare generell deaktiviert sind.


ne das kommentarformular wird auch nicht angezeigt. Habe natürlich Kommentare genehmigt. Vielleicht installier ich WordPress nochmal neu und auf eine andere Domain. Mal schauen ob's dann funktioniert.


Eventuell liegt es auch an meinem Template. Hast du mal ein anderes Template aktiviert und geschaut, ob dort das Formular korrekt angezeigt wird?


Sehr gut! Danke, ich hab´zwar nicht alles gefunden was ich suchte, aber zumindest ist der Weg klarer geworden. Unser Problem: kommentarlänge. Wir haben manchmal recht lange Kommentare. Liegt am Thema. Aber sie werden nicht voll dargestellt. Wie macht man das? Eine Antwort wäre schön. Ich lese erstmal weiter.


Fehlendes öffnendes p-Tag: Script zu "Kommentarformular anzeigen", dort im DIV mit der ID "meta" …

Mfg Jan


@Jan: Danke für den Hinweis, ist behoben.


Hi,

gibt es eine Möglichkeit, dass bspw. die Benutzergruppe "Abonnent" zwar eingeloggt ist, aber dieselbe Maske wie unregistrierte User bekommt um Kommentare zu schreiben?
Hintergrund ist, dass ein kleiner Kreis denselben Login bekommt, aber bei Kommentaren natürlich nicht immer derselbe Login-Name stehen soll.


Danke, Chris. Ich habe es auch noch mal im WP-Forum DE versucht.
Mit Deiner hervorragenden comments.php kann man zwar auch die Maske mit Namen (unabhängig vom Login) darstellen, aber bei der Ausgabe erzwingt die Cookie-Abfrage den Benutzernamen. Diese Routine würde ich gerne unterbrechen.
Ich habe alle Plugins zum Thema im WPCodex durchgearbeitet, dieser (zugegebenermaßen) unlogische Fall wird dort leider auch nicht gelöst ;-)


Vielen Dank für eine so ausführliche Erklärung!
Ich wollte noch sagen, dass mein Problem woanders lag, und zwar wenn man den Loop mehrmals ausführt funktionieren die Kommentare dann nicht mehr normal. Die Abhilfe schafft dann wp_reset_postdata(); , vielleicht hilft es jemandem. VG.


Danke für den Hinweis, ist behoben.


In meinem Blog wird zwar das Kommentar-Icon gezeigt, jedoch ist das kommmentieren nicht möglich. Unter "Diskussion" hab ich bereits alle Parameter auf "Kommentarfunktion erlauben" gesetzt, auch in den einzelnen Artikeln – aber die Kommentarfunktion scheint irgendwie komplett ausgeschaltet zu sein – in welchen Dateien außer comments.php, single.php und page.php könnte da noch so ein allmächtiger "Aus-Schalter" gesetzt sein?? Danke!!


Habe Kommentare aktiviert, es wird allerdings kein Formularfeld für die Kommentare angezeigt.

Benutze den Mozilla-Browser.

Kann e sein, dass ich irgendwas in falscher Reihenfolge kopiert habe.

Deine zu kopierenden Code-Zeilen fangen immer mit Zeile 1 an. Vielleicht hat das bei mir zu Missverständnissen geführt.


Hallo Jens,
die Zeilenangabe hier darfst du nicht beachten (denn jeder Codeblock fängt wieder bei Zeile 1 an).
Schau mal in dem Bereich "Kommentarformular anzeigen", hast du die Zeile "<?php comments_template(); ?>" eingefügt?

Wird nur das Formular nicht angezeigt, oder werden auch keine Kommentare ausgegeben?


Komme auf Jens' Problem zurück: das Gleiche habe ich auch, ich finde auf meinem Blog/Einzelseite kein Kommentarfeld, Wenn ich den Kommentarbefehl eintrage, steht in der single.php folgendes:
<?php get_header(); ?>
<?php get_template_part( 'loop', 'single' ); ?>
<?php comments_template(); ?>
<?php get_footer(); ?>

Folge: Ich habe den Kommentarbereich zweimal: einmal ohne Kommentarfeld, einmal mit Kommentarfeld (ich kann auch Text eingeben, Mail wird verschickt).

Gehe davon aus, dass in irgendeiner php noch eingegriffen werden muss, aber in welcher? Benutzt wird das Design "Magazine Basic", der Blog ist zu finden unter blog.computus-druck.com

Wenn jemandem die Lösung ein-/auffällt, schon jetzt ein herzliches Danke.

Gruß
Jörn


Hallo,
ich hätte folgendes Problem auf meiner Website:
Ich habe als Admin auf einen Kommentar geantwortet, diese Antwort wird aber nicht angezeigt.
Kann mir viell. jemand sagen, woran es liegen kann, dass die Antworten zwar mitgezählt aber nicht angezeigt werden?
Dankeschön und schöne Grüße,
Marina

Kommentar schreiben

Kommentar

Hilfe:

<strong>fettgedruckt</strong> => fettgedruckt

<em>kursiv</em> => kursiv

<a href="http://wordpress.lernenhoch2.de">Link</a> => Link

[code]<?php echo 'hello world'; ?>[/code]

*

Feedback Formular