Top-Kommentatoren ohne Plugin anzeigen

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 TanjasTop-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_monat_query="SELECT comment_author, comment_author_email, comment_type, SUBSTRING_INDEX(comment_author_url, '/', 3) as top_commentator_monat, COUNT(*) as top_num_monat FROM $wpdb->comments
		WHERE comment_approved='1'	
		AND comment_date >= CURDATE() - INTERVAL 30 DAY
		AND comment_author_url IS NOT NULL
		AND comment_author_url != ''
		AND comment_author_url NOT LIKE 'https://schroeders-netzecke.de%'
		AND comment_author_url NOT LIKE 'http://twitter.com/themenfreund%'
		AND comment_author_email NOT LIKE 'kommentar@schroeders-netzecke.de%'
		AND comment_type NOT LIKE 'pingback' OR 'trackback'
		GROUP BY top_commentator_monat
		Order by top_num_monat DESC, comment_date ASC
		LIMIT 3";
	$topcommentator_monat_result = $wpdb->get_results($topcommentator_monat_query);
	if ( !empty($topcommentator_monat_result) ) {
		foreach ($topcommentator_monat_result as $comment) :
			$co_aut = $comment->top_commentator_monat;
			$co_aut = str_ireplace("http://", "", $co_aut);
			echo '
    '; echo '
  1. '. get_avatar( $comment, 32 ); if($comment->top_commentator_monat) { echo ' '; }; echo $comment->comment_author; if($comment->top_commentator_monat) { echo ''; }; echo ' ('.$comment->top_num_monat.')
  2. '; echo '
'; endforeach; } }

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 – hier die globale WordPress-Datenbank

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+7: …und wo die URL des Autors nicht leer ist

Zeile 8-11: Weiter Bedingungen die zutreffen müssen

Zeile 12: Das Ergebnis wird gruppiert in der Variablen top_commentator_monat

Zeile 13: Das Ergebnis der Anzahl an Kommentaren wird in absteigender Reihenfolge angezeigt, das Kommentar-Datum in aufsteigender Reihenfolge

Zeile 14: Die Maximale Anzahl der anzuzeigenden Kommentatoren (hier 3)

Zeile 15: Das Ergebnis der Top-Kommentator-Abfrage wird in die Variable topcommentator_monat_result übergeben

Zeile 16 – 19: Überprüfung, ob die Variable topcommentator_monat_result überhaupt einen Wert enthält und Zuweisung der jeweiligen Variablen

Zeile 20: Ausgabebeginn einer geordneten Liste

Zeile 21: Ausgabe des Ergebnisses mitsamt dem Gravatar

Zeile 22: Ende der geordneten Liste

Zeile 23: Ende der Schleife

Zeile 24: Schleife geschlossen

Zeile 25: Zeile 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_url IS NOT NULL
		AND comment_author_url != ''
		AND comment_author_email NOT LIKE 'webmaster@schroeders-netzecke.de%'
		AND comment_author_email NOT LIKE 'kommentar@schroeders-netzecke.de%'
		AND comment_author_url NOT LIKE 'http://twitter.com/themenfreund%'
		AND comment_author_url NOT LIKE 'https://schroeders-netzecke.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) ) {
		foreach ($topcommentator_result as $comment) :
			$co_aut = $comment->top_commentator;
			$co_aut = str_ireplace("http://", "", $co_aut);
			echo '
    '; echo '
  1. '. get_avatar( $comment, 32 ),' '.$comment->comment_author.' ('.$comment->top_num.')
  2. '; echo '
'; endforeach; } }

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 11 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 7 und 8 schließe ich aus, das er meine alte und meine aktuelle Kommentatoren-Mail-Addy mitzählt. Die Zeilen sind also synchron zur Zeile 10 im 30-Tage-Code.

Angezeigt wird die Liste in der Sidebar dann mit diesem Code:


				
				
				

Schreibe einen Kommentar