Schlagwort-Archiv:

Webdesign

Kommentar-Anzahl anzeigen (ohne Plugin)

Kinder mit Abacus Wie meine Kommentatoren wissen, zeige ich bei jedem Kommentar an, wie viele Kommentare dieser Kommentator hier bisher geschrieben hat (genauer gesagt: wie viele unter demselben Namen abgegeben wurden; mehr zu dieser Unterscheidung später). Über die Details und die Neuerungen Ende letzten Jahres wollte ich schon länger mal schreiben, zumal auch manche andere davon profitieren könnten…

Ursprünglich geschah dies – natürlich ohne extra Plugin (und ohne Abacus ;) ) – mit einer einfachen Datenbankabfrage, die in der Kommentarausgabe aufgerufen wird:1

$c_count = (int) $wpdb->get_var(
   "SELECT COUNT(*) AS comments
    FROM $wpdb->comments
    WHERE comment_author='"
.esc_sql($comment->comment_author)."'
        AND comment_type=''
        AND comment_approved='1'"
);

(Hinweis: esc_sql ab WP 3.6; zuvor war’s $wpdb->escape)

Das Problem dabei: eine Datenbankabfrage pro Kommentar. Das ist kein so großes Problem, wenn es wenige Kommentare zum Beitrag oder insgesamt wenige Kommentare gibt. Aber je mehr Kommentare, je mehr verschiedene Kommentatoren und je seltenere Kommentatoren es gibt, umso mehr hat der Datenbankserver zu ackern und umso weniger kann ein Query-Cache – den wohl jeder MySQL-Server hat – oder ein DB-Cache-Plugin ausrichten. Und wenn der Beitrag zwar öfters, aber nicht ständig aufgerufen wird, fallen die Anfragen oder der Beitrag selbst auch immer wieder aus dem Cache raus.

Wenn ein Blog schon einige tausend Kommentare hat, ist diese Abfrage (gerade bei Shared Hosting) recht „teuer“ – ich hatte damals bei Tests Zeiten von bis zu 300 ms pro Anfrage (was ich in aktuellen Tests aber nicht mehr reproduzieren konnte, da waren’s nur ca. 30; keine Ahnung, was sich da geändert hat), was sich bei einem von vielen Leuten vielkommentierten Beitrag so darstellen kann, dass man sehen konnte, wie die Kommentare nach und nach „hingeblättert“ wurden…

Deswegen hab ich mir – nach einem kurzen Test mit einem simplen internen Cache, der sicher noch etwas schneller als eine Anfrage an den MySQL-DB-Cache ist – eine Lösung gebastelt, bei der alle Kommentaranzahlen für den jeweiligen Beitrag auf einmal eingelesen werden, was meinen Tests zufolge nicht wesentlich teurer ist als eine einzelne Abfrage der oben genannten Art:

$ag_number_of_comments_cache = array();
$ag_number_of_comments_inited = false;

function ag_number_of_comments ($comment, $before="",$after="") {
    global $wpdb,$ag_number_of_comments_cache,$ag_number_of_comments_inited;

    if (!$ag_number_of_comments_inited)
        ag_number_of_comments_post ((int) $comment->comment_post_ID);

    if ($comment->comment_type=="") {
        $c_count = (int) $ag_number_of_comments_cache[ mb_strtolower($comment->comment_author) ];
        echo $before."<span class=\"comments-by-author\">".($c_count==1?__('1 Comment'):$c_count." ".__('Comments'))."</span>".$after;
    }
}

function ag_number_of_comments_post ($post_ID) {
    global $wpdb,$wp_query,$ag_number_of_comments_cache,$ag_number_of_comments_inited;

    if ($post_ID==0) return;
    $ag_number_of_comments_inited = true;

    $comments = $wp_query->comments;
    $authors_sql = '0';
    foreach ($comments as $c) {
        if ( ($c->comment_type=='') && ($c->comment_approved=='1') ) {
            $authors_sql .= " OR comment_author='".esc_sql(mb_strtolower($c->comment_author))."'";
        }
    }
    $authorcounts = $wpdb->get_results(
       "SELECT comment_author, COUNT(*) as comments
        FROM $wpdb->comments
        WHERE comment_type=''
            AND comment_approved='1'
            AND ($authors_sql)
        GROUP BY comment_author"
);
    foreach ($authorcounts as $a) {
        $ag_number_of_comments_cache[mb_strtolower($a->comment_author)] = (int) $a->comments;
    }
}

Eingefügt wird dieser Code am besten natürlich in die functions.php des Themes (auf jeden Fall nach dem <?php am Anfang und vor dem ?> am Ende der Datei!) und aufgerufen dann an der geeigneten bzw. gewünschten Stelle in der Kommentarausgabeschleife in der comments.php2, etwa vor oder nach der Datumsausgabe, mit diesem PHP-Funktionsaufruf:

ag_number_of_comments ($comment);

Bzw. wenn es mitten im HTML-Code stehen soll, natürlich in PHP-Tags eingeschlossen:

<?php ag_number_of_comments ($comment); ?>

Mit den beiden zusätzlichen Parametern kann man noch etwas davor- und dahintergestellten Text angeben, für eine eingeklammerte Ausgabe etwa:

ag_number_of_comments ($comment, " (",") ");

Im Theme-CSS lässt sich das ganze dann mit der Klasse .comments-by-author ansprechen und stylen, falls gewünscht.

Zur eingangs erwähnten Zählung der Kommentare nur nach dem Namen möchte ich noch sagen, dass ich das zwar auch nicht optimal finde, da so mitunter verschiedene Leute, die mit demselben, i.d.R. „normalen“ Namen kommentieren, nicht unterschieden werden können. Nun könnte man zusätzlich die E-Mail-Adresse als Unterscheidungskriterium hinzufügen – doch wenn diese sich ändert (was bei ein paar Kommentatoren schon der Fall war), ist das Ergebnis auch nicht das gewünschte, genausowenig wie bei der URL, wo noch öfter „falsche Unterschiede“ auftreten, weil mal ein „/“ am Ende angegeben wurde und mal nicht. Deswegen belasse ich es beim Namen als Kriterium.

Übrigens wird die Groß-/Kleinschreibung auch nicht unterschieden – schon der Vergleich in MySQL kümmert sich nicht darum, weshalb eine entsprechende Umwandlung in PHP mittels mb_strtolower nötig ist; diese Funktion, die ordentlich mit Umlauten und Sonderzeichen umgehen kann, gibt’s ab PHP 4.3.0 (was heutzutage kein Problem sein sollte).

Nun denn, vielleicht hilft dieser Tip dem einen oder anderen. Es mag nicht der perfekte Code sein, denn auch wenn ich manchmal besserwisserisch korrigieren kann, bin ich kein PHP-Guru. :) Also sind Verbesserungsvorschläge sowie Anregungen und Fragen natürlich willkommen.

 


Foto: Monika Adamczyk – Fotolia.com

  1. Das Syntax-Highlighting des Codes hab ich hier online erstellt, musste dann aber noch die einzelnen Anführungszeichen durch &#39; ersetzen, damit WordPress sie nicht in ihre hübsche Variante umwandelt. Vielleicht finde ich fürs nächste Mal einen Highlighter, der auch das noch berücksichtigt… []
  2. Wenn ihr dort nur einen Aufruf der Funktion wp_list_comments() ohne Callback-Parameter findet, wird es etwas komplizierter – dann ließe es sich vielleicht in den Filter get_comment_date oder get_comment_author einhängen und somit vor/nach diesen ausgeben, aber das ist zu viel für diesen Beitrag; falls jemand ein Plugin dafür kennt – oder für die, die generell nicht gern im Code rumpfriemeln –, könnt ihr ja Bescheid sagen. []

Zwischenstand: Wieviele Beiträge pro Seite?

Vor knapp zwei Wochen hatte ich euch gefragt, wieviele Beiträge pro Seite ihr bei Blogs denn so gerne seht, und es ist Zeit für einen Zwischenstand nach 32 Teilnehmern mit 44 Stimmen:

Ihr könnt aber immer noch abstimmen!

Wie man sieht, gibt es ein leichtes Übergewicht für die gekürzte Darstellung – in normalen Auszügen oder als Magazin – gegenüber der vollständigen Darstellung, die mit zusammengenommen rund 42% der nicht-egalen Stimmen aber auch nicht irrelevant geworden ist.

Also kein Grund, mich unbedingt mit einem Neudesign mit Auszügen zu beschäftigen. Möglich, dass ich das bei einem künftigen Theme-Wechsel berücksichtigen werde, aber ein solcher steht auch nicht an, mein Theme gefällt mir noch gut genug. :) (Wobei ich auch hier Verbesserungsvorschläge gerne annehme.)

Die Frage, die mir nun bleibt, ist: Soll ich, wie ich mir ohnehin schon überlegt hatte, von bisher 7 auf 5 Beiträge pro Seite umstellen? Die Hälfte der Stimmen für vollständige Beiträge (9 von 18) entfällt auf „4 bis 6“ – aber auch 39% auf 7 oder mehr! Wenn ich einen gewichteten Mittelwert bilde, komme ich auf 6,6 – doch ist das die richtige Methode, das beste Ergebnis zu finden? Oder mache ich mir da jetzt zu viele Gedanken, die ich selber nicht mehr richtig ernst nehme?1

Wieviele vollständige Beiträge sollen's nun sein?

  • Ich beeinflusse dich gerade telepathisch. (71%, 5 Stimmen)
  • Deine Entscheidung, du wirst schon die beste Wahl treffen. (14%, 1 Stimmen)
  • Mach doch, wie du willst, ich kann's eh nicht ändern. (14%, 1 Stimmen)

Stimmen insg.: 7

Loading ... Loading ...

Genau. Deswegen hab ich auf 5 Beiträge umgestellt. (Und bei Gelegenheit werde ich schauen, dass die Suchergebnisse – die schon immer als Auszüge dargestellt werden – 10 auf einmal zeigen.)

  1. Ja. []

Wieviele Beiträge pro Seite?

Abstimmen! Bei mir finden sich auf der Startseite und in den Archiven (Tag, Monat etc.) sieben volle Beiträge pro Seite (wobei ich mir eine Reduktion auf fünf überlege). Auf meinen Streifzügen durch die Welt der Klein­bloggers­dorfo­sphäre bin ich schon auf so ziemlich alle Variationen von zwei bis zehn Beiträgen (mitunter auch mehr), mal ganz, mal in mehr oder weniger kurzen Auszügen gestoßen.

Diese Archiv-Ansichten sind m.E. in erster Linie für denjenigen interessant, der in einem neu entdeckten Blog stöbern und sich einen Überblick verschaffen möchte – da sind sowohl zu kurze und/oder nichtssagende Auszüge kontraproduktiv wie auch nur zwei oder drei Beiträge pro Seite, da man da ständig blättern (und warten) muss und dabei ggf. die Lust verliert. Andererseits können viele Beiträge pro Seite mit viel Text, der eventuell auch nicht besonders übersichtlich strukturiert ist, oder mit vielen Fotos den Besucher quasi erschlagen.

Es kommt natürlich auf den Stil des Blogs an: Wer meist nur kurze Texte schreibt, kann eben leichter viele auf einmal anzeigen, wer – wie ich – kurze und lange Texte und einzelne und viele Bilder mischt, muss umso mehr einen Kompromiss finden. Aber welchen?

Und deswegen – oder trotzdem, angesichts der Verallgemeinerung in der Frage, die nicht allen Blog-Arten gerecht werden kann – möchte ich euch fragen (wobei ihr bis zu 2 Antworten auswählen könnt):

Welche Startseitenform bevorzugt ihr als Leser?

  • Auszüge untereinander, 6-9 pro Seite (28%, 13 Stimmen)
  • vollständige Beiträge, 4-6 pro Seite (21%, 10 Stimmen)
  • Magazin-Stil: Auszüge mehrspaltig (mit Variationen in Größe und Bebilderung) (11%, 5 Stimmen)
  • Auszüge untereinander, 10-14 pro Seite (11%, 5 Stimmen)
  • vollständige Beiträge, 7-10 pro Seite (9%, 4 Stimmen)
  • Auszüge untereinander, max. 5 pro Seite (9%, 4 Stimmen)
  • vollständige Beiträge, 11 oder mehr pro Seite (6%, 3 Stimmen)
  • vollständige Beiträge, max. 3 pro Seite (4%, 2 Stimmen)
  • mir egal (2%, 1 Stimmen)
  • Auszüge untereinander, 15 oder mehr pro Seite (0%, 0 Stimmen)

Stimmen insg.: 34

Loading ... Loading ...

Weitere Kommentare sind natürlich auch nicht unerwünscht. :)

Update: » Zwischenstand nach 13 Tagen und 32 Teilnehmern.


Foto: absolut – Fotolia.com

Echt witzig!

Vor ein paar Tagen im Quelle-Online-Shop herumgestöbert und die Sprechblasen-Erklärungen beim Überfahren der Symbole wie etwa zu Reinigungshinweisen und Kleidungsgröße bemerkt:

Klicken Sie bitte hier

An sich eine gute Idee, Symbole zu erklären, ohne generell Platz zu verschwenden oder sich auf kleine, unformatierte und verzögert erscheinende Standard-Tooltips zu beschränken.

Ein klitzekleines Problemchen gibt’s aber, wenn ein Link dabei ist: Die Sprechblase verschwindet, wenn der Cursor das Symbol verlässt. Wie lange das manche Leute wohl beschäftigt, die vergeblich versuchen, den Link zu Größenfinder und Maßtabelle anzuklicken…? Muss ich die Maus schneller bewegen. Jetzt aber! Mist, wieder nichts. Nochmal: Uuund – nix. Grmbl. Mit Countdown: 2 – 1 – los! Argh!! Oder exakt über den schmalen Pfeil? Nee, auch nicht. Wo ist denn ein normaler Link zu Größenfinder und Maßtabelle??

So einen normalen Link hab ich übrigens nicht gefunden. Nun ja, vielleicht mit einigen Minuten längerer Suche…