WordPress: Trash last Comments

Es ist schon etwas ernüchternd, wenn man morgens den ersten Blick in die E-Mail Konten wirft und anhand der WordPress Benachrichtigungsmails feststellen muß, daß sich wieder einmal an die hundert Spam- oder Unsinn-Kommentare in WordPress angesammelt haben. Schon an den Absenderdaten erkennt man meist überschlägig: Alles Schrott, vieles kann weg. Spätestens hier entsteht dann der Wunsch den gesamten Müll jederzeit und von überall mit einem Knopfdruck, entfernen zu können.

Vorausgesetzt wird, daß keine WordPress Plugins im Hintergrund wirken, denen man mit den nächsten Schritten ins Handwerk pfuscht. Außerdem wird angenommen, daß eingehende Kommentare per Voreinstellung als sofort freigegeben gelten. Desweiteren muß darauf hingewiesen werden, daß manuelle Eingriffe in die WordPress-Datenbankstrukturen grundsätzlich Probleme verursachen können.

Neue Kommentare werden, ergänzt mit Verwaltungsinformationen, in der Tabelle wp_comments abgelegt. Das Datenfeld wp_comments.comment_approved ist zum Beispiel mit dem Wert »1« belegt, wenn der Kommentar freigegeben wurde oder mit dem Wert »trash« belegt, wenn der Kommentar für die Löschung/Leerung des Papierkorbs vorgesehen ist. Erlaubt WordPress geschachtelte Kommentare, enthält wp_comments.comment_parent des Child-Kommentars die ID des bezogenen Parent-Kommentars, andernfalls steht hier einfach eine »0«. Innerhalb dieser Hierarchie werden die Kommentare nach Datum aufsteigend sortiert dargestellt. Die zu den Kommentaren in Bezug stehende Tabelle wp_commentmeta wurde damit bisher noch nicht berührt. Das ändert sich erst, wenn über das Web-Interface von WordPress ein Kommentar gelöscht, genauer gesagt zunächst in den Papierkorb verschoben wird. Dann laufen diese vier Dinge ab:

  • in der Tabelle wp_comments wird das Feld comment_approved von »1« auf »trash« gesetzt
  • die Tabelle wp_commentmeta erhält einen neuen Datensatz mit der ID des gelöschten Kommentars wp_comments.comment_ID, dem Schlüssel _wp_trash_meta_status und dem Wert des Datenfelds wp_comments.comment_approved vor dem Löschen, hier also eine »1«
  • die Tabelle wp_commentmeta erhält noch einen weiteren Datensatz, ebenfalls mit der ID des gelöschten Kommentars, dem Schlüssel _wp_trash_meta_time und dem Unix-Timestamp des Löschzeitpunkts
  • besonders problematisch: obwohl es sich um eine berechenbare Größe handelt ist das Datenfeld wp_posts.comment_count mit der Anzahl der zugehörigen Kommentare vorbesetzt und wird mit jedem Löschvorgang um eins dekrementiert.

Wird über die WordPress-Verwaltung in einem weiteren Schritt jetzt auch noch der Papierkorb geleert, werden alle drei betroffenen Datensätze (2 × wp_commentmeta und 1 × wp_comments) aus den beiden Tabellen gelöscht. Wenn übrigens ein Parent-Kommentar gelöscht wird, nicht aber seine Child-Kommentare, erhalten diese Child-Kommentare im Datenfeld wp_comments.comment_parent den Eintrag »0«, werden also nachträglich quasi selbst zu Parent-Kommentaren. Ihre Einsortierung in der Kommentarhierarchie erfolgt dann wiederum nach Datum. Dieses WordPress Verhalten ist überdenkenswert.

Aufgabe

Benötigt wird jetzt eine praktische Möglichkeit Kommentare eines beliebigen Zeitraums ohne Zuhilfenahme des WordPress Web-Interface zu löschen. Genauer gesagt, zunächst sollen die betreffenden Kommentare in den WP-Papierkorb verschoben werden aus dem eine Rettung vor der nächsten Leerung jederzeit wieder möglich ist. Zum Einsatz soll eine MySQL-Prozedur (stored procedure) in der WordPress Umgebung und ein kleines Skript auf dem PC oder Notebook kommen, das die entfernte Prozedur anstößt. Hier sei nochmals der Hinweis erlaubt: Keine Eingriffe in Produktionssysteme ohne Datensicherung und dann auch nur mit dem Verständnis dafür, was man da eigentlich macht.

Prozedur

Die MySQL-Prozedur kann sehr bequem über den SQL-Editor von phpMyAdmin erfaßt und abgespeichert werden:

DROP PROCEDURE IF EXISTS proc_comments_new_delete //
CREATE DEFINER = 'WP_DB_User'@'localhost'
  PROCEDURE proc_comments_new_delete()
  BEGIN

    drop temporary table if exists WP_Database.tmp;

    create temporary table WP_Database.tmp (
    ID bigint(20) unsigned not null auto_increment,
    c_ID bigint(20) unsigned not null default '0',
    cp_ID bigint(20) unsigned not null default '0',
    primary key(ID)) engine = memory;

    insert into WP_Database.tmp
    select NULL, co.comment_ID, co.comment_post_ID
    from wp_comments as co
    where date(co.comment_date) >= date_sub(current_date(),
      INTERVAL 1 DAY)
    and co.comment_approved = '1';

    insert into WP_Database.wp_commentmeta
    select NULL, tmp.c_ID, '_wp_trash_meta_status',
      co.comment_approved
    from tmp, wp_comments as co
    where tmp.c_ID > 0 and tmp.c_ID = co.comment_ID;

    insert into WP_Database.wp_commentmeta
    select NULL, tmp.c_ID, '_wp_trash_meta_time',
      unix_timestamp(current_timestamp())
    from tmp, wp_comments as co
    where tmp.c_ID > 0 and tmp.c_ID = co.comment_ID;

    update WP_Database.wp_comments as co, tmp
    set co.comment_approved = 'trash'
    where co.comment_ID = tmp.c_ID;

    call proc_posts_commentcount_update();

    drop temporary table if exists WP_Database.tmp;

  END //

Hinweise: Das Update der Kommentarzähler erfolgt hier in einer eigenen Prozedur, da diese Routine auch eigenständig sinnvoll eingesetzt werden kann. Die Beschreibung hierzu erfolgt im nächsten Post. Der Begrenzer/Delimiter »//« muß im SQL-Editor bekannt gemacht werden, damit der Editor die Verwaltung von der Nutzdaten zwischen Begin und End richtig trennen kann. Diese Schritte werden dabei durchlaufen:

  1. alte Prozedur gleichen Namens ggf. löschen
  2. neue Prozedur erstellen
  3. temporäre Tabelle tmp löschen
  4. temporäre Tabelle tmp mit drei Datenfeldern zur Aufnahme der IDs erstellen
  5. temporäre Tabelle mit den IDs der Kommentare füllen, die von heute oder gestern sind und den comment_approved Status »1« tragen
  6. Tabelle wp_commentmeta gemäß den IDs aus der Tabelle tmp mit den Einträgen ID, _wp_trash_meta_status und dem comment_approved Status aus der Tabelle wp_comments beschicken
  7. Tabelle wp_commentmeta desweiteren mit den Einträgen zu ID, _wp_trash_meta_time und dem Unix-Timestamp des Löschdatums beschicken
  8. in der Tabelle wp_comments das Datenfeld comment_approved von »1« auf »trash« setzen
  9. update des Kommentarzählers wp_posts.comment_count für alle Kommentare/Posts durchführen
  10. temporäre Tabelle tmp löschen

Der unter Punkt 5. genannte Zeitraum (gestern/heute) ist natürlich nur ein Beispiel und sollte dem Bedarf angepaßt werden. Alternativ könnte auch ein konkreter Zeitraum, zum Beispiel die letzten 24 Stunden, vorgegeben werden:

select comment_post_ID as PostID, comment_author as Autor,
  comment_date as DatumZeit, comment_author_email as EMail,
  comment_content as Inhalt
from WP_Database.wp_comments as co
where (unix_timestamp() - unix_timestamp(co.comment_date))
  between 0 and 86400 and
  co.comment_approved = '1'
order by co.comment_date;

Hinweis: Die »magic number« 86400 setzt sich natürlich zusammen aus 60 Sekunden × 60 Minuten × 24 Stunden.

Skript

Schließlich wird noch ein kleines Skript benötigt, das man per »rechte Maustaste | Öffnen | Klick« den eigentlichen Job machen läßt. Mehr sollte nicht notwendig sein:

@echo off
set Nachricht=alle neuen Kommentare geloescht
::
echo.Kommentare von heute und vom Vortag suchen ...
::
set sql=
set sql=%sql% call proc_comments_new_delete()
::
c:\"program files (x86)"\putty\plink -ssh -P 22 ^
  -l ssh-user -pw user-password ^
  hostname-oder-ip ^
  /usr/bin/mysql -u mysql-user –pmysql-password wordpress-database ^
  --execute=\"%sql%\"
::
if %ERRORLEVEL% gtr 0 (
  set Nachricht=Fehler beim Loeschen neuer Kommentare ^
  & goto batchend)
::
:batchend
echo.%Nachricht%

Zusammenfassung

Während dieser Artikel entstand sind 27 Spam-/Unsinn-Kommentare eingetroffen und komfortabel wieder entsorgt worden. Natürlich ist das Löschen ganzer Kommentargruppen gestern/heute oder 24 Stunden nicht der Weisheit letzter Schluß. Aber es ist möglicherweise eine Vorstufe zu einer zentralen, transparenten, nicht WordPress-Plugin gestützten Spam-Kontrolle. Abschließend sei nochmals angemerkt, daß Manipulationen an der WordPress Datenbank, vorbei an der WP-Datenbankverwaltung, fatale Folgen für den gesamten Blog haben kann. Desweiteren ist das Versenden von Paßwörtern und sonstigen Verbindungsdaten über unverschlüsselte Leitungen, wie hier im Skript gezeigt, sehr schlechter Stil. Es ist halt nur bequem.
rh2012-08-001

Ubuntu 12.04 auf Sony Vaio VGN-Z21MN

Um das vorläufige Ergebnis vorweg zu nehmen, es ist alles andere als brilliant und die Informationen im Netz bezüglich Linux auf Notebooks/Laptops sind immer noch dürftig. Die Hersteller optimieren ihre Produkte ständig für den Energiehaushalt und stellen hierfür eine Vielzahl von zumeist spezialisierten Windows Betriebssystem-Routinen (Treibern) zur Verfügung. Dies läßt sich natürlich unter Linux nicht nachbilden. Aber selbst ein OS-Upgrade innerhalb der MS-Familie kann Schwierigkeiten bereiten. Sony hatte seinen Kunden für das Upgrade von Windows Vista nach Windows 7 ein sehr enges Support-Zeitfenster gesetzt. Danach mußte der Kunde selbst Informationen suchen, welche der von Sony entwickelten Komponenten in das neue Betriebssystem einzubinden seien. Kundenorientierung sieht anders aus. Das Sony Vaio war zum Zeitpunkt des Kaufs ausgestattet mit Windows Vista Professional 32-bit. Dies bedarf keiner weiteren Kommentierung, außer, daß nach nun über drei Jahren die Neuinstallation eines Betriebssystems überfällig ist.

Ubuntu 12.04 64-bit Live-CD

Die Ubuntu Live-CD in der 64-bit Version, als Beigabe des Fachmagazins c’t, startet auf dem Sony Vaio unerwartet flüssig. Das WLAN wird spontan gefunden und ist nach Eingabe des Paßworts sofort verfügbar. Der Unity-Desktop kann trotz einfacher Intel-Grafik im 3D-Modus dargestellt werden und sogar die Fn-Tasten für Lautsprecher ein/aus, Ton laut/leise und Helligkeit hell/dunkel funktionieren einwandfrei. Unity in 3D-Darstellung …

# /usr/lib/nux/unity_support_test -p
OpenGL vendor string:     Tungsten Graphics, Inc
OpenGL renderer string:   Mesa DRI Mobile Intel GM45
                          Express Chipset 
OpenGL version string:    2.1 Mesa 8.0.2
Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes
Unity 3D supported:       yes

… und die verfügbare VGA-Hardware

# lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation
  Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
01:00.0 VGA compatible controller: NVIDIA Corporation G98
  [GeForce 9300M GS] (rev a1)

Installationsvorbereitung

Da alles ganz vielversprechend aussieht, ist die Entscheidung schnell getroffen: Ubuntu kann die gesamte Festplatte belegen und soll nur mit der Intel-Grafik betrieben werden. Eine Nvidia-Grafikeinheit ist zwar zusätzlich vorhanden, soll aber wegen des Stromverbrauchs und der andauernden Probleme mit Linux nicht aktiviert werden. Da die Live-CD auch das Programm gparted enthält, kann die Partitionierung der HD schon im Vorfeld erfolgen, und so sieht anschließend das Ergebnis aus:

GParted Sony Vaio
GParted Sony Vaio VGN-Z21MN

Natürlich bietet auch die Installationsroutine von Ubuntu geeignete Möglichkeiten für Partitionierungen an, aber so ist es noch komfortabler.

Ubuntu Installation

Nach der erfolgten Partitionierung kann sofort und ohne Neustart die Installation beginnen. Sie ist Ubuntu typisch anwenderfreundlich und auch ohne unfangreiche Vorkenntnisse durchführbar. Nach der Beantwortung der Punkte Sprache, Aktualisierung während der Installation, Software von Drittanbietern, etc., muß unter Installationsart »Etwas Anderes, selbst Partition anlegen« ausgewählt werden, um die Zuordnung zu den zuvor erstellten Partitionen vorzunehmen. Das Gerät für die Bootloader-Installation ist in diesem Beispiel /dev/sda. In den weiteren Installationsschritten, in denen nach Ort, Tastatur, etc. gefragt wird, erfolgt auch die Anlage des ersten Users, der dann auch über die root-Rechte verfügt. Ein Gimmick dabei ist, daß man über die Webcam des Notebooks sofort ein Foto von sich anfertigen lassen kann. Wer denkt sich so etwas nur aus? Immerhin: Selbst die Webcam wird von Ubuntu erkannt und erfolgreich angesteuert; das läßt für alles Weitere hoffen. Abschließend wird das Grundsystem installiert.

Ubuntu Neustart

Nach der erfolgreichen Installation und dem ersten Neustart ist zunächst einmal die Aktualisierung von über 250 Paketen (mehr als 260 MB) erforderlich. Nachdem auch dies mit einem weiteren Neustart erledigt ist, hat man bereits ein vollständiges System mit Libre Office, Firefox, Thunderbird, Gimp, Rhythmbox und weiteren sinnvollen Programmpaketen vor sich. Die Ernüchterung folgt auf den zweiten Blick.

Beseitigung grober Mängel

Der Display-Manager wird in dieser Ubuntu-Version betrieben von /usr/sbin/lightdm. Anders als mit der Live-CD erscheint der Desktop-Manager Unity jetzt jedoch nicht in der 3D Variante. Der Grund hierfür bleibt im Unklaren. Eine Abhilfe aus der Rubrik quick-and-dirty besteht in dem Entfernen der drei Nvidia-Pakete nvidia-common, nvidia-current und nvidia-settings, danach geht’s. Möchte man übrigens eine Auflistung aller installierten Pakete nur mit ihrem Namen erhalten, so geht das mit diesem Aufruf:

# COLUMNS=200 dpkg -l | grep '^ii' | awk '{ print $2 }'

Ein ewiges Ärgernis ist das mounten von Windows-Freigaben (hier Samba), was Linux nur mit wechselndem Erfolg beherrscht. Ubuntu 12.04 ist hier wieder weniger erfolgreich. Nachdem die Datei /etc/fstab mit den erforderlichen Mount-Optionen versehen wurde, sieht der korrespondierende Teil in der /var/log/syslog etwa so aus:

Jun 29 12:34:30 notebook1 kernel: [  683.611923] CIFS VFS:
  default security mechanism requested. The default security
  mechanism will be upgraded from ntlm to ntlmv2 in kernel
  release 3.3
Jun 29 12:34:30 notebook1 kernel: [  684.039306] CIFS VFS:
  server 192.168.20.30 of type Samba 3.2.8 returned unexpected
  error on SMB posix open, disabling posix open support. Check
  if server update available.

Das ganze führt dann zu einem Problem, wenn sich ein User abmeldet, die Freigaben zuvor aber nicht aushängt und ein neuer User auf die gleichen Freigaben zugreifen möchte. Das geht nicht ohne Crash. Es muß also eine Script-Lösung gefunden werden, die eingehängte Windows-Freigaben während des Ausloggens wieder aushängt. Der Display-Manager bietet hier eine Möglichkeit sowohl für Start- als auch für Stop-Scripte. Gesteuert wird das über die Datei /etc/lightdm/lightdm.conf:

$ cat /etc/lightdm/lightdm.conf
…
# session-setup-script=
session-cleanup-script=/usr/local/bin/script-to-run
…

Ein entsprechendes Stop-Script könnte zum Beispiel so aussehen:

#!/bin/bash
# Die Samba-Freigabe: '//station/CentralData
# ggfs. un-mounten.
log() {
  logger -t user.info -p user.info "$1";
}
cifsfreigabe="//station/CentralData"
mountpoint=`echo $HOME`/CentralData
# wenn die Freigabe 'CentralData' gemountet ist,
# dann un-mounten ...
if [ $(mount | grep $mountpoint | wc -l) -eq "1" ]; then
  umount $mountpoint
  log "Nachricht von `basename $0`, user: $USER, home:\
    $HOME, mountpoint: $mountpoint = un-mount fuer cifs:\
    $cifsfreigabe"
else
# ... sonst nur Nachricht ausgeben
  log "Nachricht von `basename $0`, user: $USER, home:\
    $HOME, mountpoint:  $mountpoint = nichts zu tun fuer cifs:\
    $cifsfreigabe"
fi

Es bleibt zu hoffen, daß für Ubuntu schnellstmöglich eine Lösung gefunden wird Netzfreigaben sauber einzubinden. Ein drittes und vielleicht das unangenehmste Problem überhaupt sind die ständigen System-Fehlermeldungen zum Beispiel unvermittelt nach dem User-Login oder im Zusammenhang mit den regelmäßigen Updates.

Ubuntu Bugreport
Bugreport Ubuntu 12.04

Es kommt zwar nie zum tatsächlichen Systemausfall, aber ein ungutes Gefühl bleibt.

Nächste Schritte

Das Notebook bleibt jetzt einige Zeit unter Beobachtung und wird überwiegend zum Internet-Einsatz verwendet. Bevor Ubuntu 12.04 nicht die störenden Fehlermeldungen in den Griff bekommt, kann auch keine weitere Zeit in die Untersuchung der Systemkonfiguration gesteckt. Andernfalls wird Windows 7 Prof. 64-bit installiert werden.
rh2012-06-005

Freizeit-Piraten

Sie machen Ernst, die Piraten. Nach der unglaublichen Personalfluktuation in den vergangenen Monaten – auch in exponierten Positionen – und der Wahl des neuen Bundesvorsitzenden ist eines klar: Die Piraten wollen keine Berufspolitiker. Dies scheint ihnen ein Dogma zu sein. Auch Herr Bernd Schlömer will seine Piratenpartei, dessen Bundesvorsitzender er seit April 2012 ist, wie ein Kommunalpolitiker nach 17 Uhr und am Wochenende führen. Bundespolitik als Freizeitbeschäftigung. Dabei bezeichnete sich Herr Schlömer in einem Zeit Online Interview vom 30. April 2012 als Koordinator und Controller der Piraten. Controller sind allerdings zumeist full-time employees, keinesfalls aber Hobbyisten.

Feierabendpiraten
Piraten mit Kurs in die Flaute
Es ist inzwischen allgemeiner Kenntnisstand, daß die Piraten das Berufspolitikertum und die gegenwärtige Parteiendemokratie ablehnen und den Weg zu einer Basisdemokratie suchen. Zwei Dinge haben sie aber scheinbar noch nicht verstanden. Zum einen werden sie sich zunächst in die bundesdeutsche Parteienstruktur einbinden lassen müssen um überhaupt politisches Gewicht und Möglichkeiten der Einflußnahme zu erlangen. Zum anderen muß die gesamte werbliche Kommunikation ihrer Ziele professionalisiert werden. Sowohl potentielle Wähler, aber auch politische Gegner, sollten deutungsfrei über die maßgeblichen politischen Absichten der Piratenpartei informiert werden. Dies ist ein kontinuierlicher Prozeß, der gleichermaßen nach außen und innen wirken muß.

Richtig gute Beispiele für schlechte Medienarbeit der Piraten konnte man in den letzten Monaten in den einschlägigen Polit-Talkshows (Jauch-Will-Illner und Co.) beobachten. Im Internet finden sich immer noch diverse Beispiele. Perfekt zeigte auch ein Spiegel-Interview zwischen Jan Delay (Künstler) und Christopher Lauer (Pirat) zum Thema Urheberrechtsnovelle die ganze Misere auf. Pirat Lauer konnte auf die Kritik des Künstlers Delay weder argumentativ noch inhaltlich angemessen reagieren. Er mußte im Ungenauen bleiben, fabulierte und erweckte damit genau den Eindruck eines typischen Berufspolitikers, den es zu vermeiden galt.

Die Piraten müssen sich besser, das heißt in diesem Fall medienwirksamer, verkaufen. Wenn sie schon mit so abstrakten Themen, wie Urheberrecht oder Bedingungsloses Grundeinkommen (BGE) die politische Bühne betreten, sollten sie diese bei öffentlichen Auftritten argumentativ schlüssig und verständlich vortragen können. Andernfalls wirkt es kontraproduktiv. Damit sind die Piraten aber offensichtlich überfordert.

Aufgabenteilung

  • Durch imperatives Mandat eingesetzte Abgeordnete setzen Beschlüsse der Basis um.
  • Die Abteilung für Öffentlichkeitsarbeit vertritt die Partei in allen Belangen nach außen. Sie ist sozusagen das Gesicht der Piraten.
  • Die Basis, die aus Arbeitsgruppen und Fachausschüssen besteht, leistet die fachliche Arbeit und faßt die Beschlüsse.

Da Basispiraten scheinbar argwöhnisch, um das Wort Mißgunst zu vermeiden, darauf achten, daß sich kein Abgeordneter zu sehr öffentlich profiliert, könnten per imperativem Mandat entsandte Abgeordnete hier etwas ausgleichen. Richtige (bezahlte) Medienprofis müßten in der Öffentlichkeitsarbeit tätig sein. Sie benötigten zusätzlich Fachwissen und die Kenntnis darüber, was in den Arbeitsgruppen und Fachausschüssen aktuell läuft. Die Basis wäre dann der Ort an dem die Bürger die Inhalte der Politik in fachbezogenen Gruppen mitgestalten könnten.

Die Bundesbürger haben einen Anspruch darauf umfassend und verständlich über die Ziele und die Arbeitsweise der Piratenpartei informiert zu werden. Die Piratenpartei ihrerseits hat es schon am 20. Januar 2013 mit der Wahl zum 17. Niedersächsischen Landtag zu tun. Da die Piratenpartei keine zwei oder drei Prozent Partei mehr ist, sollte sie die aktuelle Situation für eine bessere Kommunikation und eine effektivere Arbeitsweise nutzen.
rh2012-06-004

WordPress: Wer kommentiert denn hier?

Wenn man Spam-Kommentare von Hand aussortiert und in den Papierkorb legt, könnte es interessant sein zu sehen, ob sich URLs, Autoren oder E-Mail Adressen in den Spam-Botschaften wiederholen und welche es schließlich sind.

Hier laufen zur Zeit drei Arten Spam-Kommentare auf:

  • Da sind zum einen Autoren mit so klangvollen Namen, wie xbtxgqhsxy, jnoitl oder auch spxoshrkb und ihre nicht minder enigmatischen Botschaften, wie zum Beispiel: »OFkICe … href=“http://agulagevkiewecyy.com/“ rel=“nofollow“> agulagevkiewecyy …« Die angegebenen URLs sind im gleichen Stil aufgebaut.
  • Die zweite Kommentar-Kategorie stellen die Einzeiler dar. Da ist dann zu lesen: »Wo ist der gefällt mir Button« oder »Guter Beitrag, werde noch mal drüber nachdenken«. Die Autoren heißen Dennis, Darko oder Sebastian und die URLs zeigen nicht selten auf Server, wie zum Beispiel: www.naehmaschinenzentrale-bielefeld.info oder www.luedenscheider-blogsyndicate.com.
  • Die größte Arbeit machen sich die meist englischsprachigen Mehrzeiler. Von Kommentatoren, wie Vaughn Masilliaux, Curb Herionne oder Middie Oldestby ist zu lesen: »Thank you so much for providing individuals with an exceptionally memorable opportunity to read … ideas in this article are easily the most effective we have ever had.« Die URLs verweisen hier in der Regel direkt auf den Server ohne weitere Pfadangaben.

Wenn sich im Papierkorb eine nennenswerte Anzahl von bereits gelöschten Kommentaren befindet, kann man über kurze SQL-Abfragen zum Beispiel die Anzahl gleicher Autorennamen, E-Mail Adressen oder URLs ermitteln. Der Zugang zur WordPress Datenbank erfolgt in der Regel über phpMyAdmin. Nach Auswahl der WordPress Datenbank kann über den Reiter SQL ein kleiner Editor geöffnet werden. Mit der folgenden Abfrage werden aus der Tabelle wp_comments die mit Löschvermerk versehenen Datensätze selektiert. Dabei werden gleichlautende URLs gezählt und mit der Häufigkeit ihres Vorkommens in absteigender Reihenfolge ausgegeben:

select comment_author_url as URL, count(*) as Anzahl
from wp_comments
where comment_approved = "trash"
group by URL having URL <> ""
order by Anzahl desc limit 10;

Das Ergebnis könnte dann zum Beispiel so aussehen:

URL Anzahl
http://nighttraincomp.com/sports-transport-south… 17
http://www.clearvolume.info/duamcxma/posts/16375… 15
http://www.crazynesbydry.net 13
http://clearycare.uk/jailbreak/ 12
http://www.seobankingteam.com/seo-bielefeld/ 10
http://karo0u9an.pasterious.dk/ 7
 

Soll sich die Analyse auf freigeschaltete Kommentare beziehen, so muß in der Where-Klausel »trash« gegen »1« ausgetauscht werden. Weitere Abfragen nach comment_author oder comment_author_email wären ebenso denkbar.
rh2012-06-003