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.
Du scheinst ja gerade auf nem WordPress Trip zu sein. Ich hätte da ein Problem, womit ich nicht klarkomme. Haste was dagegen, wenn ich dich heute abend mal anrufe und wir darüber sprechen? Wäre cool, wenn das klappen würde.
Bis denne
Martin
Sicher, kein Ding. Aber dann will ich auch die URL ;-)
Hm.. mal schauen… ;) Bis heute abend dann. Wird wahrscheinlich so gegen 19 – 20 Uhr sein.
Ne ne? Zur Einfärbung von Kommentaren würde ich mir mal die Default-Themes anschauen. Wenn ich mich nicht irre, gibt es da eine ganz einfach Lösung. Bevor du Stunden bezüglich der Trackback Geschichte investierst: Sag Bescheid, dann gebe ich dir meine aktuelle comments.php…
Ach, und dich habe im Zweifelsfall auch noch Platz auf meiner WordPress-Therapie-Couch.
Es geht ja auch nicht um die normalen Kommentare eines Beitrags, sondern um die Liste der letzten Kommentare, die man gerne mal in Sidebars wieder findet. Und dafür bietet der Default-Theme nicht mal eine Option an ;-)
Aber stimmt schon, der Titel ist etwas wiedersprüchlich, ich hab noch eine kleine Info am Anfang eingefügt.
Wozu braucht man da jetzt noch Plugins für? ;)
Besonders die unterschiedliche Einfärbung ist ’ne tolle Idee, hast du hier aber noch nicht eingebaut oder? Zumindestens kam keine Änderung beim aktualisieren.
Den Code darf man ja bestimmt klauen, letztlich sagt deine CC-Lizenz nichts anderes aus ;)
Doch sicher, die ist schon da seit es die zweite Sidebar gibt und äußert sich in diesem grauen Hintergrund. Kann allerdings auch sein dass da noch was im Argen liegt, hab gesehen dass Opera und IE ein bissl zicken. Asche auf mein Haupt :-)
Geiler Artikel Jeriko. Destotrotz, ich greife lieber zum Plugin :P
Herzlichen Dank, genau danach habe ich gesucht – schnell eingebaut und angepasst ohne große Plugins.
Liebe Grüße,
Marco Philipeit
Genau so wollte ich das für mein WP haben… Dankeschön
Danke, super Tipp! Hat funktioniert :-)
Hallo Jeriko
Also erstmal danke ich dir für die Beschreibung, ich suche schon ewig nach dieser Lösung. Leider klemmt da noch was bei mir, das will noch nicht so richtig funktionieren.
Also den ersten Code abschnitt baue ich dort ein wo es erscheinen soll richtig?
Aber wo kommt der zweite Abschnitt hin???
Bitte hilf mir : -)
Hi Jeriko,
tolles kleines Snippet, auch wenn’s schon beinahe einen Bart hat ;)
Aber mit dieser Lösung kann man flexibler als mit einem Plugin arbeiten, denke ich.
Mariechen: Der erste Abschnitt ruft nur die Datenbank auf und liest die letzten x Comments aus. Der zweite gibt die Comments dann aus. Den kannst du hinsetzen, wo du möchtest, in sidebar.php, in footer.php, etc.
Einfach mal probieren.
Hey Jeriko,
klasse lösung!!!
ich würde gerne noch den Content mit ausgeben lassen was ich ja via comment_content machen kann.
Aber wie bekomme ich es hin das er den in einer Kurzfassung ausgibt?
Also nur den ersten Satz oder so?
Ich hoffe du kannst mir schnell helfen!
Besten Dank und Gruß!
Nick
Vielen Dank für diesen Artikel, hat mir wirklich sehr weiter geholfen.
Hallo,
Danke für diesen hilfreichen Artikel.
Aber eine Frage hätte ich noch und ich hoffe du kannst sie mir beantworten: Wie kann ich jetzt z.b. nur die Kommentare von einer bestimmten Kategorie zeigen? Mir ist klar dass ich in der SQL Abfrage beim WHERE was hinzufügen muss :) aber was …
Danke und Schöne Grüße
Conny
Super Sache, danke dafür!
Das ist schon mal sehr gut, da es mit den diversen Plugins immer wieder mal das eine oder andere Problemchen gibt.
Was müsste man am Code verändern (ggf. hinzufügen), wenn alle freigegebenen Kommentare angezeigt werden sollen außer jene vom Blogautor selbst? Hierzu fehlen mir leider die entsprechenden PHP-Kenntnisse und Tante Google sagt auch nicht wirklich viel dazu.
hi jerico,
nick hat auch schon gefragt: gibt es eine möglichkeit den comment_content ausgeben zu lassen in einer gekürzten form?
das wäre fein, und interessiert sicherlich nicht nur mich, sonder viel leserinnen und leser deines tollen blogs.
danke und grüsse
horst
Danke für den Tipp! Du hast mir ebenfalls sehr weitergeholfen.
Vielen Dank für die Anleitung. Genau das hatte ich gerade gesucht.
Hallo,
auch von mir vielen Dank für den gut beschriebenen Einblick bezüglich Datenbankzugriff und Datenauswertung.
Hat mir echt geholfen danke
Wow, das hat ja auf Anhieb geklappt!
Danke!
Leicht einzupflegen und gut beschrieben, vielen Dank!