Rock’n’Picture 16: Schau, sie spielen Krieg

Runde 16 in diesem Ein-Bild-zu-einem-Rock-Song-Projekt – und wo Juli schon mit Hämatom (nur der Band, hoffe ich ;) ) unterwegs ist, geht’s diesmal auch um einen Song von denen: „Schau, sie spielen Krieg“

Ich hätte ja einfach ein Foto vom Manowar-Konzert nehmen können, denn das nordisch-heroische Getue und Getexte von denen passt ja auch zum Kriegsspielthema – aber ich hab mir dann doch ein Lego-Wikingerschiff organisiert und Manowar nur in Form eines T-Shirts (ungebügelt, wie man sieht) mit Wikingerschiff-in-Flammen-Motiv in den Hintergrund verbannt:

Und dass ich mich dabei auf den Titel selbst beziehe, ohne spezielle Zeilen herauszugreifen, dürfte klar sein…

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. []

Ungläubig, aber nicht tot^^

Wie im Rätsel vorhin schon angedeutet, war ich gestern im Zenith in München bei Manowar – die Tour heißt „Death to Infidels“, daher auch dieser Beitragstitel. Begonnen hat das ganze erstmal mit einer „kleinen“ Schlange in S-Form, von der hier zwei Drittel zu sehen sind (und einer weiteren von der anderen Seite vom Parkplatz her):

Manowar: Schlange vor der Halle

Wie jemand hinter mir gemeint hat: Die Security hätte doch wissen müssen, dass sie mehr Personal brauchen, weil es eben seine Zeit dauert, jedem Metal-Fan seine 10 Waffen abzunehmen.^^

Nun denn, nach 35 Minuten war ich dann auch drin und habe nur die ersten zehn Minuten der ersten Vorband verpasst. War aber nicht so schlimm, war ja nur Metalforce. ;) (Hier ein Lied.) Die zweite war HolyHell, und die war gar nicht mal schlecht. (Ein Lied.1) Könnte mein nächster Vorschlag fürs Projekt Hörsturz werden…

Übrigens war auch die Akustik schon bei den Vorbands recht gut – da hab ich schon deutlich Schlimmeres und Leiseres gehört.

Metalforce Holyhell

Allzu gut sind die paar Fotos, die ich gemacht habe, nicht. Lag vielleicht auch an der Entfernung, denn ich war hinter der Hallenmitte – v.a. bei HolyHell, wo ich am Merchandising-Stand anständig anstand, und der war am anderen Ende der Halle. T-Shirts für 30€ passen irgendwie zum Eintrittspreis von knapp 70€: übertrieben teuer. Manche meinen, Manowar wäre viel zu kommerziell geworden – nun, ich bin da kein Experte, zumal es mein erstes Manowar-Konzert war, aber widersprechen werde ich da sicher nicht. Den alten Fans hat auch die Ausrichtung der Tour auf viele neuere Titel nicht gepasst, aber warum sollte Manowar da nicht mal abwechseln?

Die Setlist in München müsste der von Offenbach entsprochen haben – ohne die Hallenräumung wegen einer Bombendrohung, auch ohne eine Drohung ohne Räumung (Ludwigsburg) und ohne Buttersäure-Attentat (Fürth), soweit ich das mitbekommen habe. Irgendein Spinner (oder mehrere) scheint Manowar nicht so ganz zu mögen.

Manowar Manowar

Nun denn. Nachdem um 22:11 endlich das Intro einsetzte – 15-20 Minuten später als vom Umbau her nötig – und die Jungs alten Herren endlich die Bühne betraten, ging’s schließlich richtig los. Schade dabei war, dass ich schon am Ende von Warriors of the World, dem letzten Lied vor der Zugabe, gehen musste, weil ich ja noch mit dem (letzten) Zug heimfahren musste, und von Freimann zum Hauptbahnhof sind’s halt auch ein paar Meter.

Der Bühnenaufbau war recht einfach – insbesondere ohne Pyrotechnik –, aber das tat der Musik keinen Abbruch. Die AZ schreibt „Auf dem Weg zum Kasperltheater“, aber hey, das ganze Fantasy-Mythologie-Thema war doch schon immer nicht so bierernst zu nehmen. „Unzeitgemäß und aufgesetzt, das Testosteron-Geprotze der Männer auf der Bühne in ihren Leder-Schnür-Miedern“? Pff, na und?

Wie anscheinen üblich durften auch mal ein paar Mädels und ein Gast-Gitarrist aus dem Publikum auf die Bühne (nächstes Bild) – letzterer hat sich gar nicht mal so ungeschickt angestellt und gut gespielt. Wie viel von ihm dann zu hören war im folgenden Lied oder ob er weitgehend ausgeblendet wurde, wissen wohl nur der Mischpult-Bediener und das Ego der Band…

Manowar: Gitarrist aus dem Publikum Manowar

Ich stand ja, wie gesagt, hinter der Mitte in der nicht ausverkauften Halle. Die Stimmung hatte öfters ihre Probleme, die ganze Halle zu erfassen – so richtig gelang das eigentlich nur bei Die For Metal und Warriors of the Worlds (und vermutlich bei der Zugabe). Nächstes Mal muss ich wieder weiter nach vorne; unterhaltsam war’s aber auch so – auch wenn das nicht mein bestes Konzert aller Zeiten war, gefallen hat’s mir auf jeden Fall.

Manowar hat ja den Ruf der „lautesten Band der Welt“, und passender- wie netterweise hat die Rockantenne an ihrem Stand auch Ohrenstöpsel verteilt, die ich dann auch vor Beginn von Manowar reingesteckt habe. Komplett reingesteckt war’s mir an meiner Position dann aber doch zu leise und vor allem zu dumpf, deswegen hab ich sie wieder etwas gelockert, und dann war die Akustik praktisch perfekt. (Wie die Rockantenne-Moderatoren heute früh gesagt haben, soll das in dieser Halle generell nicht so oft der Fall sein.) Dem körperlichen Lautstärkegefühl nach war es aber auch nicht sooo viel lauter als das, was ich von früheren Konzerten gewohnt war. Die Hosenbeine müssen eben etwas flattern, wenn Joey DeMaio in seinem Bass-Solo kräftig zupft. :mrgreen:

:rocks:

  1. Live-Aufnahmen mit Kleinkamera-/Handy-Billig-Mikrofonen in Bühnennähe sind irgendwie suboptimal, wenn man sich » das hier mal anhört… []

Bilderrätsel 22

Dienstagnachmittag, Zeit für ein Rätsel – auch diesmal wieder ein Bilderausschnittsrätsel. Diesmal vielleicht ein kleines bisschen gemein, aber vielleicht täusche ich mich da auch und ihr habt’s sofort raus… also:

Wovon ist dieser Ausschnitt?

br22

Ich hab noch einen größeren Ausschnitt vorbereitet, und natürlich beantworte ich auch Kommentare – na dann legt mal los!

(16:48): So, der größere Ausschnitt:

br22a

(17:19): Und hier noch mehr:

br22b

Jetzt sollte es aber einfach sein…

Gelöst von kamil: Lautsprecher auf einer Konzertbühne, „etwas“ überbelichtet durch „ein paar“ Strahler, die gerade in dem Moment angegangen sind:

br22s

Und das war gestern Abend bei Manowar – ein kleiner Bericht mit mehr Fotos folgt in ein paar Stunden.

Danke fürs Mitmachen und bis nächsten Dienstag!