Da $comments_by_type bei WordPress mittlerweile nicht mehr so funktioniert, wie es sollte, musste ich mir für ein Theme etwas anderes überlegen, wie ich nach Kommentaren, Pings und Tweets filtern und sortieren kann.
Ausgangsbasis ist die unter WordPress Codex geschilderte Funktion wp_list_comments() und die Möglichkeit, dadurch eine Kommentarliste eines bestimmten Typs anzeigen zu lassen.[01]
Voraussetzung ist daher, dass man sich mit Theme-Development in WordPress auskennt!
Ich musste leider zwei unangenehme Dinge feststellen:
- Die Variable $comments_by_type scheint nicht mehr zu existieren, die alternative Variante im Kommentar auf sivel.net hab ich erst gar nicht probiert, da sie im Codex nicht dokumentiert scheint und es also eher experimentiell wäre.
- Das Zählen nach Typen funktioniert nicht, sondern die Standardfunktion gibt nur die Summe aller Typen zurück.
Nun gibt es zumindest für die Zählproblematik bereits einige Lösungen, aber das saubere Trennen ist damit nicht automatisch gelöst. Denn: die obige if-Abfrage lässt meinen Codeblock nicht ausblenden oder nicht anzeigen (hängt davon ab, ob Verneinung drin oder nicht, es gibt im Netzt BEIDE Varianten). Nämlich egal ob Kommentare vorhanden sind oder nicht, $comments_by_type bleibt für jeden Typ IMMER leer. Ergo: nutzloses Zeug!
Nun habe ich mal durch Debugging herausgefunden, was denn die $comments so enthält, und prompt viel mir auf, wie des Rätsels Lösung ist, und zwar für beide Probleme gleichzeitig!
Im Array $comments sind alle Kommentare jeglichen Typs hinterlegt, und das ist cool. Damit kann man gleich eine Menge anstellen.
Ich übergebe die $comments einer eigenen Funktion (die dann in der functions.php des Theme hinterlegt ist) und werte erst einmal den ganzen Kram aus. Das Schöne nebenbei: es muss mich noch nicht einmal die Verschachtelung kümmern, sofern man diese nutzt, denn die Ebenentiefe steckt als Wert im jeweiligen Kommentar drin und wird erst durch WordPress selbst ausgewertet.
Was macht die Funktion?
Sie geht das Array $comments durch und zählt jeden Kommentar, der einem bestimmten Typus entspricht, also alle Kommentare oder Tweetbacks oder Pingbacks oder Trackbacks oder Pings allgemein (also Ping- und Trackbacks). Diesen Wert liefert es als Rückgabewert und schon haben wir zwei Fliegen mit einer Klappe geschlagen. Wenn der Zähler größer Null ist, dann haben wir also Kommentare und lassen erst somit die Auflistung beginnen. Zudem können wir den Wert auch als Anzeige nutzen — Blogger sind statistikgeil und machen gern Schwanzvergleiche.
Code und Beispiel
Der Code:
Funktion count_comment_type() [theme/functions.php]: count_comment_type (PHP-Code)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php /* file: count-comment-type.php */ /** * Liefert die Anzahl eines bestimmten Kommentartyps * * @author Christoph Grabo aka Blogcrafter <http://blogcraft.de> * @param array reference &$c Referenz zu $comments * @param string $type der zu zaehlende Typ ('comment','tweetback','pings','pingback','trackback') * @return integer Anzahl der Kommentare des gefragten Typs */ function count_comment_type(&$c,$type) { $counter = 0; foreach($c as $comment){ if($comment->comment_type == $type) $counter++; if($comment->comment_type === '' and $type == 'comment') $counter++; if(($comment->comment_type == 'pingback' or $comment->comment_type == 'trackback') and $type == 'pings') $counter++; } return $counter; } ?> |
Beispiel-Einbindung:
Beispiel-Codesnippet in der theme/comments.php: count_comment_type in comments.php
1 2 3 4 5 6 7 8 9 10 | <?php /* file: count-comment-type-example-snippet.php */ $comcount = count_comment_type($comments,'comment'); if( $comcount>0 ) : ?> <h3 id="comments">Kommentare (<?php echo $comcount; ?>):</h3> <ol class="commentlist"> <?php wp_list_comments('type=comment'); ?> </ol> <?php endif; ?> |
Nachdem was ich bisher so gesehen habe, finde ich meine Lösung sehr praktisch und klein ist sie zudem auch noch. Ich verwende sie jedenfalls in einem selbst erstellten Theme auf einem anderen Blog und bin damit sehr zufrieden. Ein Beispiel könnt ihr in diesem Beitrag auf mannaz.cc sehen, wo alle Typen auftreten.
Was die Funktion nicht macht!
Die Funktion kann nicht wie comments_number()[02] einen schönen Text zurückliefern, dies sollte aber mit ein bisschen Geschick selbst zu bewerkstelligen sein. Und: Sie zählt nicht alle Typen aufsummiert; auch das kann man selbst erledigen, indem man die jeweiligen Aufrufe vor die ganzen Schleife packt und die Einzelergebnisse selbst addiert. Ich brauchte das bisher so nicht und daher wurde dies nicht implementiert.
Für PHP-Kenner: um Ressourcen zu sparen, verwende ich in der Funktion eine Referenz auf $comments (siehe das & vor $c in der Parameterliste); also vermeidet es tunlichst, irgendetwas mit der Variable $c anzustellen! Nur abfragen und belassen![03]
Möge euch der Code zu Nutze sein!
Für Fehler und einer dadurch zerstörten WordPress-Installation übernehme ich keine Haftung!
fußnoten:
- Infos zum Template-Tag im Codex hier [↩]
- siehe Codex “comments_number” [↩]
- Infos zu Variablen und Referenzen, siehe php.net [↩]

Reaktionen:
Für Fehler und einer dadurch zerstörten WordPress-Installation übernehme ich keine Haftung!
Dafür sollte man ja immer vorher ein Backup durchführen.
Tolle Anleitung, danke.
Du benutzt noch Ajax Edit Comments?
Ich habe ja noch die letzte freie Version hier installiert. Und da es ja dann auch keine Updates mehr via Plugin-Verzeichnis gibt, bekomme ich das ja gar nicht mit, wenn die sich verkommerzialisieren.
Ich werd schauen, ob und wann ich es bei mir rauswerfe. Noch läuft ja alles. :-)