Okay, die Überschrift ist etwas wiedersprüchlich. Es geht hier nicht um die Ausgabe der Kommentare zu einem Beitrag, sondern um eine allgemeine Liste der letzten 5, 10, 20 Kommentare, wie man sie z.B. häufig in Sidebars antrifft. "Aber Jeriko, dafür gibt es doch schon so viele Plugins!" Stimmt, spontan fallen mir da Recent Comments, Fuzzy Recent Comments und Zap_Recent_Commented ein, die sich alle ein wenig unterscheiden, aber letztlich doch das gleiche machen. Alle lassen aber etwas missen:
Was, wenn man die Kommentare abwechselnd unterschiedlich darstellen möchte?
Mag sein, dass die oben genannten (oder natürlich auch ein anderes Plugin das ich noch nicht kenne?) das beherrschen, dann ist es mir bisher nur noch nicht aufgefallen. Es ist aber auch nicht so schwer, die letzten Paar Kommentare zu besorgen. Wie es aussehen kann sieht man, wenn man die zweite Sidebar öffnet.
Der Code
Das Prozedere ist recht simpel: Wir brauchen die Informationen über die letzten Kommentare sowie zumindest den Titel des zugehörigen Posts. Für erstes wird folgendes eingetragen:
<?php $comments = $wpdb->get_results("SELECT comment_post_ID, comment_author, comment_author_email, comment_content, comment_date
FROM $wpdb->comments
WHERE comment_type = ''
&& comment_approved = '1'
ORDER BY comment_date
DESC LIMIT 10"); ?>
Dieser Code kann irgendwo stehen. Die Klasse $wpdb ist für alle Interaktionen von WordPress mit der Datenbank zuständig, die zugehörige Funktion get_results stellt eine Anfrage an die Datenbank und gibt das Ergebnis zurück. Innerhalb des SQL-Statements werden zwei Bedingungen an die Kommentare gestellt:
- Es handelt sich um ein Kommentar (Ping- und Trackbacks werden nicht berücksichtigt)
- Das Kommentar wurde akzeptiert (Spamkommentare werden nicht angezeigt)
Das Ergebnis wird nach dem Datum absteigend sortiert, das neuste Kommentar erscheint also als erstes. Es werden 10 Kommentare ausgelesen. Innerhalb einer Schleife werden die Kommentare nun aufbereitet und ausgegeben, in diesem Fall in einer gewöhnlichen Liste:
<ul>
<?php $commenttype = 'even';
foreach($comments as $comment) {
$post = get_postdata($comment->comment_post_ID); ?>
<li class="<?php echo $commenttype; ?>">
<?php echo $comment->comment_author; ?> zu <a href="<?php echo get_permalink($post['ID']); ?>" title="">
<?php echo $post['Title']; ?></a>
</li>
<?php if($commenttype == "even") { $commenttype = "odd"; } else { $commenttype = "even"; } ?>
<?php } ?>
</ul>
Und das wars auch schon. Für jedes Kommentar werden mit der Funktion get_postdata() die Informationen für den entsprechenden Beitrag aus der Datenbank geholt. Danach folgt die Ausgabe, hier sehr vereinfacht dargestellt. Zum Abschluss wird der Wert der Variable $commenttype geändert, so dass die Listenelemente abwechselnd die Klasse .even und .odd erhalten. Diese Klassen lassen sich ganz normal über die style.css des entsprechenden Themes den eigenen Bedürfnissen anpassen.
Abschluss
Dies stellt sicherlich die einfachste Methode dar und lässt sich beliebig erweitern: Vielleicht möchte man ja doch Ping- und Trackbacks berücksichtigen? Sollen Kommentare von bestimmten Autoren ganz anders aussehen? Oder bestimmte erst gar nicht angezeigt werden? Die Anpassung ist wirklich einfach, bei Hilfe man kann mich gerne ansprechen.
Update: Da hat sich noch ein kleiner Fehler in die Abarbeitung der Schleife eingeschlichen. In der zweiten Zeile heisst es nicht $commenttype == 'even'; sondern $commenttype = 'even'; also nur mit einem Gleichzeichen.