Der Aufruf des Kommentarformulares

Dieser geschieht in der Datei comments.php des verwendeten Themes. Hier gibt es ziemlich am Ende der Datei folgende Codezeile.

1
<?php comment_form(); ?>

Diese kleine Zeile – hier wird die Funktion comment_form(); aufgerufen – erstellt das ganze Formular. Was hier allerdings nicht steht ist die Tatsache, dass man hier auch noch Argumente übergeben kann. Man kann hier das gesamte Formular beeinflussen. Also wäre an dieser Stelle die komplette Syntax dann Folgende.

1
comment_form( $args = array(), $post_id = null )

Das geübte Auge erkennt, dass diese Funktion zwei Optionen erlaubt, beide sind optional, müssen also nicht angegeben werden. Für die erste Option – $args – wird ein Array erwartet. Hier kann das Formular manipuliert werden. Wirft man einen Blick in die Funktion comment_form(); – welche sich in der Datei /wp-includes/comment-template.php befindet – sieht man schnell wie dieses Array aufgebaut werden muss.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$defaults = array(
'fields' => apply_filters('comment_form_default_fields', $fields),
'comment_field' => '<p><label for="comment">' . _x('Comment', 'noun') . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
'must_log_in' => '<p>' . sprintf(__('You must be <a href="%s">logged in</a> to post a comment.'), wp_login_url(apply_filters('the_permalink', get_permalink($post_id)))) . '</p>',
'logged_in_as' => '<p>' . sprintf(__('Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>'), admin_url('profile.php'), $user_identity, wp_logout_url(apply_filters('the_permalink', get_permalink($post_id)))) . '</p>',
'comment_notes_before' => '<p>' . __('Your email address will not be published.') . ($req ? $required_text : '') . '</p>',
'comment_notes_after' => '<p>' . sprintf(__('You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s'), ' <code>' . allowed_tags() . '</code>') . '</p>',
'id_form' => 'commentform',
'id_submit' => 'submit',
'title_reply' => __('Leave a Reply'),
'title_reply_to' => __('Leave a Reply to %s'),
'cancel_reply_link' => __('Cancel reply'),
'label_submit' => __('Post Comment'),
);

Für diese Beschreibung ist lediglich Zeile 2 interessant, denn hier sind die Kommentarfelder. Schaut man in der selben Datei nun etwas höher findet man sie auch recht schnell, sie sind in $fields hinterlegt.

1
2
3
4
5
6
7
8
$fields = array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __('Name') . '</label> ' . ($req ? '<span class="required">*</span>' : '') .
'<input id="author" name="author" type="text" value="' . esc_attr($commenter['comment_author']) . '" size="30"' . $aria_req . ' /></p>',
'email' => '<p class="comment-form-email"><label for="email">' . __('Email') . '</label> ' . ($req ? '<span class="required">*</span>' : '') .
'<input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email']) . '" size="30"' . $aria_req . ' /></p>',
'url' => '<p class="comment-form-url"><label for="url">' . __('Website') . '</label>' .
'<input id="url" name="url" type="text" value="' . esc_attr($commenter['comment_author_url']) . '" size="30" /></p>',
);

In diesem Array sind auch deutlich die Bezeichner der Felder zu erkennen – author, email und url. Das Attribut value=““ in den Zeilen 3, 5 und 7 sorgt dafür, dass diese Felder belegt bleiben. Und genau diese drei Kandidaten sollen nun manipuliert werden, so dass sie nach dem Absenden des Kommentares wieder geleert werden.

Eingriff in den Formularaufruf

An dieser Stelle geht es wieder zurück in die comments.php, wo nun die neuen Felder definiert und an die Funktion übergeben werden.

Zunächst müssen die neuen Felder definiert werden, also der value muss entfernt werden. Dazu wird ein kleines Array erstellt, welches sich an der Struktur des $defaults in der Funktion orientiert.

1
2
3
4
5
6
7
8
$array_args['fields'] = array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
'<input id="author" name="author" type="text" value="" size="30"' . $aria_req . ' /></p>',
'email' => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
'<input id="email" name="email" type="text" value="" size="30"' . $aria_req . ' /></p>',
'url' => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
'<input id="url" name="url" type="text" value="" size="30" /></p>',
);

Wie hier nun – wieder in den Zeilen 3, 5 und 7 – zu erkennen ist, ist für das Attribut value kein Wert übergeben. Somit kann der Funktionsaufruf nun getrost erweitert werden und sieht nun wie folgt aus.

1
comment_form($array_args);

Damit wird das Array mit den neuen Formularfeldern an die Funktion übergeben und die Voreinstellungen werden überschrieben. Angst vor Updates müsst ihr auch keine haben, die comments.php in eurem Theme bleibt davon unberührt, es sei denn, diese Update ist euer Theme :-)

18 Meinungen zu “WordPress: Kommentarfelder nicht vorbelegen

    • Er schreibt ja schon „[..] aus welchen Gründen auch immer, [..]“ ;)

      Meine Meinung dazu ist, wenn der Nutzer dies nicht möchte, dann kann er es ja auch selbst verhindern. Entweder indem er keine Cookies zulässt oder diese bei jedem schließen des Browsers automatisch löschen lässt.
      Umgekehrt funktioniert es auch. Ist diese Funktion deaktiviert, kann man ja seinen Browser bitte, „Formulardaten“ zu speichern. Dann reicht ein klick in das zu füllende Feld und man bekommt seine zuvor eingegebenen Daten.

      Ich finde, das sollte dem Benutzer auch überlassen werden.

      Ich zum Beispiel finde es sehr praktisch, da ich sehr viel in Blogs kommentiere, und nein, nicht um einfach nur meine Links zu verbreiten ;)

      Also, danke für den Beitrag!
      Es kommt bei mir mit Sicherheit mal zur Anwendung, wenn auch nicht im eigenen Blog, spätestens aber, wenn ein Kunde danach fragt.

      Grüße,
      Martin

  1. Also, um hier eine Dauerdiskussion über Sinn und Unsinn etwas zuvor zu kommen:

    In gewissen Fällen kann es notwendig sein dies abzuschalten. Zum Beispiel bei diversen Chachingmechanismen, welche die Seite so wie sie ist als Cache speichern. Dann sind auch die Formulardaten im Chache und wären dann bei anderen Nutzern ebenfalls zu sehen. Auch wenn mittels WordPress eine Webseite realisiert wird, in der es schlichtweg notwendig ist, dass die Eingabedaten nach dem Absenden aus den Feldern entfernt werden. So zum Beispiel, wenn es sich eventuell um vertrauliche Daten handelt, welche nicht als Kommentar dargestellt werden. Die Möglichkeiten sind da ja nur durch die eigene Phantasie begrenzt, denn WordPress muss ja nicht immer als klassisches Blog eingesetzt werden. Und je nach Einsatz bekommt die Kommentarfunktion auch ganz neue Aufgaben.

  2. Vielen Dank für diesen Text. Genau die Information suchte ich gerade. Hoffentlich habe ich es richtig gemacht. In der comments.php kam dieser Eintrag nämlich so nicht vor. Ich habe dort jetzt die Values im Eingabebereich des Formulars alle auf „“ gesetzt.

  3. Vielen Dank für die Klarstellung, H.-Peter. Ich hatte das noch verhältnismäßig neue Cache-Plugin von Sergej installiert (Cachify). Dazu war die Änderung im Template notwendig.

  4. Hallo zusammen,
    leider konnte ich das irgendwie nicht in meinem Theme umsetzen und an WordPress selber möchte ich das nicht ändern, eben wegen den erwähnten Updates. Ich benutze das Cordobo Green Park Theme. Vielleicht macht sich jemand die Mühe und hilft mir dabei! Ich wäre wirklich sehr dankbar!
    LG Nathanael

  5. hatte ich auch mal testweise entfernt, nach nem update war es wieder da. Ich bin immer sehr vorsichtig mit eingriffen in den Core

  6. Ich glaube das bringt bei einigen Usern eher Frust, als das es groß hilfreich wäre.
    Ich würde es eher nicht anwenden, um meine Leser und Kommentatoren nicht zu verärgern

  7. Wow, ich bin begeistert. Genau dieses Problem hat mich gerade wahnsinnig gemacht. Dank dieses Eintrages konnte ich es nun beheben – trotz meiner PHP-Unkenntnisse!
    Wir haben einen Blog an einem „Terminal“. Schüler sollen hier ihre Beiträge kommentieren. Und trotz der Einstellungen im Browser, keine Formulardaten und Cookies zu speichern, ist immer die Eintragung vom Voränger zu sehen. Deswegen war dies hier sehr hilfreich.
    Auch wenn dieser Eintrag schon etwas älter ist: Vielen Dank!

Schreibe einen Kommentar

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>