WordPress: Anzahl der Kommentare zu einem Artikel ermitteln | Update: 14. April 2017

3. März 2014 | Ca. 6 Minuten Lesedauer

Heute gibt es, aus aktuellem Anlass, mal wieder einen etwas technischen Beitrag. Wie unschwer zu erkennen ist, sieht flomei.de ein wenig anders aus. Dazu gehört auch, dass auf der Startseite angezeigt wird, wenn zu einem Artikel Kommentare vorhanden sind. Wie man das realisiert, und dabei wirklich nur Kommentare und keine Ping-/Trackbacks zählt, erkläre ich im Folgenden.

Achtung! Es gibt ganz unten ein Update zu diesem Beitrag, bitte beachten…

Als ich angefangen habe, nach einer Lösung für diese Aufgabe zu suchen, hab ich natürlich erstmal im WordPress Codex nachgeschaut. Mit der Funktion get_comments_number oder auch comments_number hat man da im Grunde schon, was man haben will. Dachte ich zumindest.

Problem an diesen Funktionen ist allerdings, dass sie auch Pingbacks und Trackbacks mitzählen, die in WordPress ebenfalls als Kommentar gehandhabt werden. Das mag den ein oder anderen nicht stören, ich wollte auf der Startseite allerdings nur eine Anzeige „echter“ Interaktionen, echter (Text-)Kommentare zu einem Artikel. Also musste was anderes her.

get_comments_number und Co. haben leider keine Möglichkeit den Suchstring zu filtern, also die Suche auf Textkommentare einzuschränken. Die Lösung liegt darin, erstmal alle Kommentare heranzuziehen und dann Ping-/Trackbacks wieder rauszuwerfen. Das was über bleibt sind dann die besagten Textkommentare.

In Quelltext gegossen sieht das dann wie folgt aus:

$args = array(
            'status' => 'approve',
            'post_id' => $post->ID,
            'type' => '',
            );

      $comments = get_comments($args);
      foreach($comments as $key=>$value)
      {
         if(($value->comment_type == 'pingback') || ($value->comment_type == 'trackback'))
         unset($comments[$key]);
      }
      $number = count($comments);
      unset($comments);

      if($number > 0) { echo '|&nbsp;'.$number.'&nbsp;<i class="icon-comment"></i>'; }

In Zeile 1 bis 5 sammeln wir erstmal die Parameter für die Abfrage der Kommentare. Dabei werden nur bereits genehmigte Kommentare ausgewählt (Zeile 2), sie werden für den aktuellen Artikel geholt (Zeile 3) und wir nehmen alle Arten von Kommentaren mit (Zeile 4).

Das Ganze übergeben wir als Parameter an get_comments und freuen uns über den Rückgabewert, nämlich ein Array mit allen Kommentaren.

Das arbeiten wir dann Schritt für Schritt ab (Zeile 8 bis 12) und schauen dabei, ob das aktuelle Element (jeweils ein Kommentar) im Array vom Typ Pingback oder Trackback ist (Zeile 10). Sollte das so sein, dann schmeissen wir es aus dem Array raus (Zeile 11).

Übrig bleibt am Ende ein Array, dass nur noch Textkommentare enthält. Die können wir dann ganz einfach mittels count zählen (Zeile 13) und am Ende den Speicher wieder schön frei machen, indem wir unsere komplette Kommentarsammlung einfach löschen (Zeile 14).

Übrig bleibt zu prüfen, ob es überhaupt Kommentare gibt (Zeile 16) und eine entsprechende Ausgabe.

Wie man hier sieht, das ist meine Implementation, gebe ich einen Trennstrich aus, dann die Zahl der Kommentare und schließlich den Code, um mittels des hier genutzten Icon-Fonts eine kleine Sprechblase zu erzeugen.

Ich hoffe das hier konnte wieder dem ein oder anderen helfen. Hinterlasst in den Kommentaren gerne eure Fragen oder eure Umsetzungen dieser Funktion in Webseiten. Dann können wir auch gleich nochmal testen, ob die Funktion wirklich so arbeitet wie gewünscht. ;-)

Update am 14. April 2017
Wie Sven in den Kommentaren korrekt erwähnt hat, kann man get_comments() auch einen Parameter für den gewünschten type übergeben. Damit lassen sich komfortabel nur Kommentare oder Ping- und Trackbacks zurückgeben lassen und man spart sich den Overhead mit dem Entfernen der Elemente aus dem Array…

Damit würde der Code von oben wie folgt aussehen:

$args = array(
            'status' => 'approve',
            'post_id' => $post->ID,
            'type' => 'comment',
            );

      $comments = get_comments($args);
      $number = count($comments);
      unset($comments);

      if($number > 0) { echo '|&nbsp;'.$number.'&nbsp;<i class="icon-comment"></i>'; }

Wieso ich das vor drei Jahren nicht gleich so gemacht habe… Ich hab keine Ahnung… :-D

Support your local flomei
Wenn du hier etwas gefunden hast, dass dir privat oder beruflich weitergeholfen hat und du dafür Danke sagen möchtest, dann könntest du diesen Link benutzen, um bei Amazon einzukaufen, mir etwas von meinem Amazon Wunschzettel schenken oder eine Leberkässemmel finanzieren.