Schrecksekunden beginnen manchmal ganz harmlos und so ganz nebenbei …
Erst Erstaunen und dann der kalte Schauer auf dem Rücken und dann die bange Frage im Kopf: Ist die Datenbank geschrottet?
Was war passiert?
So ganz nebenbei fielen mir unterschiedliche Reihenfolgen von Kommentaren auf: Die Dialogseite zeigte eine andere Reihenfolge der Kommentare an als die dazugehörige Einzelartikelseite.
Als Hintergrund muß man wissen, daß ich die Dialogseite durch ein eigenes PlugIn erzeugen lasse. Und das nimmt als Sortierkriterium aus der Kommentartabelle (wp_comments) das Feld comment_date_gmt.
Die Detailansicht einer Seite nimmt hingegen aus der gleichen Tabelle das Feld comment_date als Kriterium der Sortierung. Ja - das ist kein Witz - zu jedem Kommentar werden zwei Zeitstempel in unterschiedlichen Feldern abgespeichert. Und das sind eben die Felder:
comment_date_gmtcomment_date
Nun das macht unter bestimmten Bedingungen sogar viel Sinn - obwohl man eigentlich auch rechnen könnte. Na egal - es ist nun mal so.
Nun habe ich ja berichtet, daß ich ein paar Kommentare manuell übernehmen mußte. Dabei stimmten natürlich die Zeiten nicht. Die habe ich dann ganz normal aus WordPress heraus über die Funktion “Kommentar bearbeiten” und da den Punkt “Zeitstempel bearbeiten” unter “Erweitert” geändert. Nur was ich dabei nicht wußte, war die Tatsache, daß bei diesem Vorgang nur das Feld comment_date verändert wird. comment_date_gmt bleibt “unberührt“.
Die entscheidende Stelle
In der Datei wp-includes/comment-functions.php beginnt im Original (Wordpress 2.0.5) die Funktion wp-update-comment in Zeile 156. Und die ist dafür verantwortlich, daß nur comment_date geändert wird. Hier der entscheidende Auszug:
$result = $wpdb->query(
"UPDATE $wpdb->comments SET
comment_content = '$comment_content',
comment_author = '$comment_author',
comment_author_email = '$comment_author_email',
comment_approved = '$comment_approved',
comment_author_url = '$comment_author_url',
comment_date = '$comment_date'
WHERE comment_ID = $comment_ID" );
Und da fehlt comment_date_gmt - was zu der Differenz bei einer Änderung über den beschriebenen Weg führt.
Und so hält man die Zeitänderungen synchron
Eigentlich ist es ganz einfach: Man fügt zwei Zeilen ein - nämlich die roten:
$comment_date_gmt = gmdate('Y-m-d H:i:s', strtotime($comment_date) );
$result = $wpdb->query(
"UPDATE $wpdb->comments SET
comment_content = '$comment_content',
comment_author = '$comment_author',
comment_author_email = '$comment_author_email',
comment_approved = '$comment_approved',
comment_author_url = '$comment_author_url',
comment_date_gmt = '$comment_date_gmt',
comment_date = '$comment_date'
WHERE comment_ID = $comment_ID" );
Bug oder Feature
Im Bugtrackingsystem von WordPress konnte ich nichts zu dem Thema finden. Auch sonst habe ich im Web nichts gefunden, was dieses Verhalten beschreibt. Wie gesagt - unter bestimmten Aspekten macht das originale Vorgehen Sinn. Ich finde es aber falsch: Wenn ich den Zeitstempel verändere, will ich ihn auch wirklich komplett ändern. Selbst wenn man von dieser Funktion nur in wenigen Fällen gebrauch macht. Zumal auch Wordpress mal auf das eine und mal auf das andere Feld bei der Sortierung schaut. Von PlugIns mal abgesehen. Persönlich bevorzuge ich comment_date_gmt als Kriterium, da es transparenter und eindeutiger ist. Oder es zumindest sein sollte
Also kein Grund zur Aufregung, wenn es mal unterschiedliche Ergebnisse bei der Reihenfolge von Kommentare in Euren Blogs gibt. Vielleicht ist ja das hier beschriebene Verhalten die Ursache dafür.
Und 2.0.2 macht es auf alle Fälle auch so
Hat zumindest ein Blick in den Quellcode ergeben. Vielleicht sollte ich ja doch ‘n Bug bei WordPress aufmachen???
