Kommentare auf der Indexseite…

Kennt ihr das? Man arbeitet Stunde um Stunde an einem Problem, macht permanent Fortschritte und trotzdem fühlt es sich an, als ob man auf der Stelle treten würde? Genauso geht es mir gerade mit einer neuen WordPress-basierten Seite, an der ich gerade arbeite.

Bei dieser möchte ich, dass man auf der Artikelübersichtsseite bereits Kommentare lesen und schreiben kann. Das ist garnicht sooo einfach, weil kaum ein WordPress-Theme (geschweige denn WordPress selber) dafür konzipiert zu sein scheint. Da ich nun (so hoffe ich jedenfalls) alle wichtigen Schritte hinter mir haben sollte, dachte ich mir, ich veröffentliche einen kleinen Leidtfaden, um euch zu erklären, worauf ihr bei solch einem Vorhaben unbedingt achten müsst.

Fangen wir mal mit dem wahrscheinlich größten Krisenherd an: der "comments.php" eures Themes. Diese enthält den Aufbau des Kommentarbereichs und ist mit hoher Wahrscheinlichkeit nicht dafür ausgelegt, mehrfach auf einer Seite angezeigt zu werden! Primäres Problem ist, dass es einige Elemente gibt, die unter Garantie mit einem id-Attribut versehen sind - diese müsst ihr so abändern, dass die IDs wieder eindeutig werden. Hierfür solltet ihr ziemlich weit oben solch einen Codeblock einfügen:

1
2
3
4
5
6
7
8
9
10
11
<?php
  // use this when more than one comment form is displayed
  global $postTABcount;
    if (!isset($postTABcount)) {
    $postTABcount = 1;
  }
  $postIDstring = "";
  if ((!is_single()) && (!is_page())) {
    $postIDstring = "-" . get_the_ID();
  }
?>

In diesem werden zwei Variablen initialisiert - "$postTABcount" und "$postIDstring". Während $postIDstring euch helfen wird, eure IDs eindeutig zu machen, ist $postTABcount dafür da, eure Tab-Indizes ordentlich zu setzen - aber dazu später mehr!

Angenommen ihr habt in eurer Datei solch eine Zeile stehen:

1
<div id="comments">

Dann würde ich euch empfehlen, diese wie folgt abzuändern:

1
<div id="comments<?php print($postIDstring); ?>" class="comments">

Dadurch habt ihr folgendes erreicht: Die ID ist eindeutig und durch Setzen der Klasse könnt ihr trotzdem noch ein einheitliches Styling einrichten.

Weiterhin solltet ihr überprüfen, wie das eigentliche Kommentare-anzeigen implementiert ist. In meinem Fall wurde dazu die Funktion "wp_list_comments()" verwendet. Bei dieser müsst ihr darauf achten, dass die Liste der zu zeigenden Kommentare explizit mitgegeben wird. Ansonsten kann es euch passieren, dass ihr unter jedem Artikel die gleichen Kommentare angezeigt bekommt. 😉

1
2
3
<ol class="commentlist">
  <?php wp_list_comments($commentStyling, get_comments('post_id=' . get_the_ID())); ?>
</ol>

Eine Besonderheit erwartet euch am Ende eures Formulars: Seit ein paar Version wird es vom Codex verlangt, dass im Kommentarformular der Rückgabewert der Funktion get_comment_id_fields() eingebaut wird - und wie es der Zufall will, handelt es sich dabei um versteckte Input-Elemente inklusive id-Attribut. Um diese id-Attribute eindeutig zu machen, könnt ihr folgenden Quellcode nutzen:

1
2
3
4
<?php
  // change "id" in autogenerated code
  print(preg_replace("/\<(.+) id\=\'(.+)\' (.+)\>/iU", "<$1 id='$2" . $postIDstring . "' class='$2' $3>", get_comment_id_fields()));
?>

Nun erwartet euch in dieser Datei nur noch eine Kleinigkeit: Es ist wahrscheinlich, dass die Inputfelder des Kommentarbereiches mit tabindex-Attributen ausgestattet sind. Durch diese ist es möglich, durch drücken der Tab-Taste ins nächste Feld zu springen. Da es später potentiell mehrere Felder geben wird, solltet ihr die statischen Zahlen (meist 1 bis 5) durch diesen Code ersetzen, der die Zahl automatisch hochzählt:

1
<?php print($postTABcount++); ?>

Wenn ihr alle Stellen gefunden und ersetzt habt, seid ihr mit dieser Datei soweit durch! 😀

Machen wir also schnell weiter! Angenommen, ihr wollt die Kommentarfunktion auf der Indexseite anbieten. Dann müsst ihr nun die "index.php"-Datei eures Themes öffnen. In dieser sollte sich eine Zeile befinden, die so oder so ähnlich aussieht:

1
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

Über diese Zeile solltet ihr folgenden Code einfügen, der dafür sorgt, dass das Tabindex-Durchnummerieren korrekt funktioniert:

1
2
3
4
<?php
  // needed for tabindex of comment form elements
  $postTABcount = 1;
?>

Und nun der letzte größere Schritt: In der while-Schleife, die sich in der Datei befindet, sollte irgendwo ein Aufruf der Funktion the_content() oder the_excerpt() zu finden sein. Unter diesen Aufruf solltet ihr nun folgenden Code einfügen können, um das gerade vorbereitete Kommentarformular anzeigen zu lassen:

1
2
3
4
<?php
  $withcomments = true;
  comments_template();
?>

Das Setzen der Variable "$withcomments" sorgt übrigens dafür, dass der Aufruf der Funktion comments_template() auch im Index- und Archiv-Template funktioniert. 😉

Wenn ihr so weit gekommen seid, sollte euer Kommentarbereich eigentlich schon unter jedem Post auf der Indexseite angezeigt werden. In meinem Anwendungsfall ist es nun aber so, dass es den Nutzern nicht möglich ist, eine einzelne Artikelseite zu öffnen - sie müssen auf der Indexseite bleiben. Das stellt beim Kommentar absenden ein großes Problem dar. Denn standardmäßig springt WordPress nach dem Absenden eines Kommentars in den dazugehörigen Artikel! Um dieses Verhalten zu umgehen, habe ich ein kleines Plugin ("Back2Ref") geschrieben, das einen nach dem Absenden eines Kommentars zu der Seite zurücklotst, auf der man den Kommentar geschrieben hat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
  /*
    Plugin Name: Back2Ref
    Plugin URI: https://weizenspr.eu/
    Description: Will redirect the user to the referer he comes from when sending a comment.
    Version: 0.1c1
    Author: Kevin Niehage
    Author URI: https://weizenspr.eu
  */


  function back2ref_execute($location, $comment) {
    $result = $location;

    if (isset($_SERVER['HTTP_REFERER'])) {
      $result = $_SERVER['HTTP_REFERER'];

      if ($comment != null) {
        $result = $result . "#comment-" . $comment->comment_ID;
      }
    }

    return $result;
  }

  add_filter('comment_post_redirect', 'back2ref_execute', 10, 2);
?>

Puuuh... nun ist es aber wirklich endlich geschafft! Das war doch mal ein Haufen Arbeit für einen einzigen Artikel. 😉
Update:
Hinweis zu AntispamBee entfernt.

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Kommentierende Grüße, Kenny

1 Kommentar » Schreibe einen Kommentar

  1. Pingback: Kommentare auf der Indexseite… | WeizenSpr.eu

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.