Nachdem meine Top-Kommentator(inn)en-Lösung vom vergangenen Freitag ja noch nicht das war, was man 'Perfekt' nennen könnte, habe ich jetzt solange daran rumgebastelt das man es wohl als fast nicht mehr verbesserungsfähig bezeichnen könnte.
Fall ihr Euch wundert, weshalb ich einen neuen Artikel schreibe statt die Änderungen als Update oder Ergänzung unter den erwähnten Artikel zu setzen, so denke ich das die Änderungen doch etwas zu umfangreich ausfallen, als das das Sinn machen würde.
Bis auf einen kleinen Fehler, den ich mir allerdings nicht wirklich erklären kann, werkeln die Codes nun also hier im Blog. Das könnt ihr Euch hier auf der rechten Seite auch gleich anschauen.
Aber was den Fehler angeht, so habe ich zumindest eine Vermutung.
Noch immer basiert die Lösung auf Tanjas Top-Trackback-Code. Aber ich habe ihren Inhalt doch mehr oder minder sehr stark verändert.
Der Code der Top-Liste der letzten 30 Tage sieht wie folgt aus:
function top_commentators_monat() {
global $wpdb;
$topcommentator_query="SELECT comment_author, comment_author_email, SUBSTRING_INDEX(comment_author_url, '/', 3) as top_commentator, COUNT(*) as top_num FROM $wpdb->comments
WHERE comment_approved='1'
AND comment_date >= CURDATE() - INTERVAL 30 DAY
AND comment_author_url NOT LIKE 'http://themenfreund.de%'
GROUP BY top_commentator
Order by top_num DESC, comment_date ASC
LIMIT 3";
$topcommentator_result = $wpdb->get_results($topcommentator_query);
if ( !empty($topcommentator_result) ) {
echo '<ul>';
foreach ($topcommentator_result as $comment) :
$co_aut = $comment->top_commentator;
$co_aut = str_ireplace("http://", "", $co_aut);
echo '<li>',get_avatar( $comment, 32 ),' <a href="'.$comment->top_commentator.'/" target="_blank">'.$comment->comment_author.'</a> ('.$comment->top_num.') </li>';
echo '<br /><br /><br />';
endforeach;
echo '</ul>';
}
}
Der Versuch, den Code zu erklären:
Zeile 1: Vergabe eines Namens für die Funktion, um sie dann - wo gewünscht - anzeigen zu können
Zeile 2: Angabe der Datenbank, in welcher die erforderlichen Daten stehen
Zeile 3: Die Titel der Spalten aus der die Daten geholt werden sollen. Ausser der bei Tanja schon angegebenen Spalten comment_author_url hole ich mir noch die Informationen aus den Spalten comment_author_email und comment_author. Das Ergebnis der Zählung (Count) aller Spalten (*) fließt in die Variable top_num ein. Die URL aus 'comment_author_url' identifiziert dabei den Top-Kommentator.
Zeile 4: Es werden nur die freigeschalteten Kommentare gezählt ...
Zeile 5: und nur die, deren Datum zwischen dem Datum von heute und dem von dem heutigen Datum minus 30 Tage liegen ...
Zeile 6: Zudem nur Kommentatoren, deren URL nicht die eigene Domain enthalten
Zeile 7: Das Ergebnis wird gruppiert in der Variablen top_commentator
Zeile 8: Das Ergebnis wird in absteigender Reihenfolge angezeigt, das Kommentar-Datum in aufsteigender Reihenfolge
Zeile 9: Die Maximale Anzahl der anzuzeigenden Kommentatoren (hier 3)
Zeile 10: Das Ergebnis der Top-Kommentator-Abfrage wird in die Variable topcommentator_result übergeben
Zeile 11: Überprüfung, ob die Variable topcommentator_result überhaupt einen Wert enthält
Zeile 12: Ausgabebeginn einer ungeordneten Liste
Zeile 13: Die Variable topcommentator_result soll in die Variable comment geschrieben werden
Zeile 14 Die Variable co_aut soll den Inhalt der Variable comment erhalten
Zeile 15: stellt sicher, das auf eine möglichen Unterschied in Groß- oder Kleinschreibung keine Rücksicht genommen wird. Bei php stellt es ja einen Unterschied dar, ob es XYZ, oder xyz oder XyZ heißt.
Zeile 16: Ausgabe des Avatars des Kommentators, so er denn bei Gravatar eines hinterlegt hat, der URL des Blogs als Link, der beim Mouseover des Kommentartor-Namens angezeigt wird. Als letztes wird hier noch in Klammern die Zahl der Kommentare angezeigt.
Zeile 17: Zeilenumbrüche, da die Anzeige ansonsten wie eine Treppe dargestellt wird.
Zeile 18: Die Schleife aus Zeile 13 wird beendet.
Zeile 19: Die ungeordnete Liste wird geschlossen.
Bei der Version für die letzten 365 Tage gibt es noch ein paar zusätzliche Angaben:
function top_commentators_jahr() {
global $wpdb;
$topcommentator_query="SELECT comment_author, comment_author_email, comment_type, SUBSTRING_INDEX(comment_author_url, '/', 3) as top_commentator, COUNT(*) as top_num FROM $wpdb->comments
WHERE comment_approved='1'
AND comment_author_email NOT LIKE '...@themenfreund.de%'
AND comment_author_email NOT LIKE '...@themenfreund.de%'
AND comment_type NOT LIKE 'pingback' OR 'trackback'
AND comment_date >= CURDATE() - INTERVAL 365 DAY
GROUP BY top_commentator
Order by top_num DESC, comment_date ASC
LIMIT 3";
$topcommentator_result = $wpdb->get_results($topcommentator_query);
if ( !empty($topcommentator_result) ) {
echo '<ol>';
foreach ($topcommentator_result as $comment) :
$co_aut = $comment->top_commentator;
$co_aut = str_ireplace("http://", "", $co_aut);
echo '<li>',get_avatar( $comment, 32 ),' <a href="'.$comment->top_commentator.'/" target="_blank">'.$comment->comment_author.'</a> ('.$comment->top_num.') </li>';
echo '<br /><br /><br />';
endforeach;
echo '</ol>';
}
}
Und zwar musste ich, warum ist mir nicht wirklich ersichtlich, in Zeile 3 noch den Kommentar-Typ mit in die Liste der zu berücksichtigenden Tabellenspalten der Datenbank-Tabelle comments mit aufnehmen. Dies musste sein, um in Zeile 7 auszuschließen, das Pingbacks und Trackbacks mitgezählt werden.
Vorher hatte ich den 30 Tage-Code einfach kopiert und in Zeile 5 aus der 30 eine 365 gemacht. Aber plötzlich zählte er Pingbacks mit, die zumindest offensichtlich überhaupt nicht die geforderten Kriterien erfüllten und die somit das Ergebnis verfälschten.
Mit Zeile 5 und 6 schließe ich aus, das er meine alte und meine aktuelle Kommentatoren-Mail-Addy mitzählt. Die Zeilen sind also synchron zur Zeile 6 im 30-Tage-Code.
Was mir jetzt noch Kopfschmerzen macht ist die Tatsache, das er Tanja als Top-Kommentatorin einen Kommentar gutschreibt. Was - wie ich vermute - eventuell daran liegt, das sie ihre Blog-Adresse nicht in die URL-Zeile bei den Kommentaren eingibt.
Vielleicht löst sich das Problem demnächst ja auch noch in Wohlgefallen auf. Zumindest habe ich jetzt eine Top-Kommentatoren-Liste mit Avataren, aber ohne ein Plugin dafür einsetzen zu müssen.

[...] endforeach; echo '</ul> '; } } Die Grundfunktion basiert auf Marcus Schröders Beitrag “Top-Kommentatoren ohne Plugin anzeigen”. Das Script ist relativ rudimentär und kann natürlich auf die eigenen Bedürfnisse angepasst und [...]