Wie baut man eine Zitatfunktion für die Kommentare ins Blog ein? Der gute cimddwc hat es vorgemacht. Es bedarf etwas PHP und etwas Javascript Code, und schon ist es fertig. Der Aufwand ist gar nicht so groß.Ich habe zusätzlich ein Icon für die “Antworten” Funktion eingesetzt und den “Antworten” Link des von mir verwendeten dkret Themes entfernt.
Im dkret Theme müssen lediglich 2 Dateien bearbeitet werden. Leider ist hier die Umsetzung nur auf ein Child Theme nicht möglich, da eine der beiden Dateien in jedem Fall vom Basis Theme verwendet wird. Man muss also das Original Theme ändern und bei Updates daran denken. Wie unten im ersten Kommentar zu lesen ist, lag ich hier falsch. Man kann durchaus eine eigene Funktion erzeugen und die auch konform ins Theme einbinden. Dazu kopiert man sich die Funktion “dkret_comments_callback” aus der Datei …/themes/dkret/library/extensions/discussion.php in die functions.php des Child Themes. Man muss die Funktion umbenennen. z.B. in “ixiter_comments_callback”.
Zusätzlich sollte man sich 2 Icons zulegen, die als klickbare Icons für die beiden Funktionen verwendet werden.
Auf gehts …
Zuerst der PHP Teil in …/themes/dkret/library/extensions/discussion.php in der soeben neu erzeugten Funktion in …/themes/[dein_child_theme]/functions.php
Nach den Änderungen, sollte die Funktion so aussehen.
function ixiter_comments_callback($comment, $args, $depth) {
$GLOBALS['comment_depth'] = $depth;
$GLOBALS['comment'] = $comment; ?>
comment_class() ?> id="comment- comment_ID() ?>">
comment_ID() ?>">
if (function_exists('gtcn_comment_numbering')) echo gtcn_comment_numbering($comment->comment_ID, $args); ?>
if ($comment->comment_approved == '0') : ?>
_e('Your entry is awaiting moderation.', 'dkret') ?>
endif; ?>
comment_ID(); ?>">
echo apply_filters('comment_text', get_comment_text()) ?>
}
Achtung! Ich habe die Zeilen entfernt, die den Antwort Link für verschachtelte Kommentare erzeugt. Diese sind nach den Änderungen nicht mehr möglich.
Wie man sieht, sollten die beiden Icons comment_reply.png und comments_quote.png heißen und im Ordner …/themes/dkret/library/images/ liegen.
Den Javascript Teil habe ich vom @Reply Plugin “geklaut” und modifiziert. Man muss das Rad ja nicht jedesmal neu erfinden. Der Javascript Teil findet, wie bei der cimddwc Methode, in der Datei comments.php des themes seinen Platz.
Diese findet man in …/themes/dkret/comments.php. Hinter der Zeile 15 muss folgender Code eingefügt werden.
<script type="text/javascript"> //<![CDATA[</span> function ixInsertComment(data){ var myField; if (document.getElementById('comment') && document.getElementById('comment').type == 'textarea') { myField = document.getElementById('comment'); } else { return false; } if (document.selection) { myField.focus(); sel = document.selection.createRange(); sel.text = data; myField.focus(); } else if (myField.selectionStart || myField.selectionStart == '0') { var startPos = myField.selectionStart; var endPos = myField.selectionEnd; var cursorPos = endPos; myField.value = myField.value.substring(0, startPos) + data + myField.value.substring(endPos, myField.value.length); cursorPos += data.length; myField.focus(); myField.selectionStart = cursorPos; myField.selectionEnd = cursorPos; } else { myField.value += data; myField.focus(); } } function ixReplyTo(commentID, author) { var inReplyTo = '@+ commentID + '">' + author + '<\/a>: '; ixInsertComment(inReplyTo); } function ixQuote(commentID, author){ var commentText = document.getElementById('edit-comment' + commentID); if((!commentText) || (commentText.length == 0)){ commentText = document.getElementById('comment-text-' + commentID).innerHTML; }else{ commentText = commentText.innerHTML; } commentText = '' + author + ' schrieb, schrub oder schrubbte:'+ commentText + ' '; commentText = commentText.replace(//g,''); commentText = commentText.replace(/]*alt=[" ]*([^ "]*)[" ]*[^>]*>/ig,' $1 '); ixInsertComment(commentText); } //]]> script>
Das wars auch schon.
Viel Spaß damit und wenn noch Fragen offen sind, immer her damit.
(ix)
Super. Schön, dass Du Dich so ausführlich mit der Modifikation meines Themes auseinandersetzt. Aber Deine Einschätzung, dass man das Basistheme ändern MUSS ist falsch.
Die Funktion “dkret_comments_callback” der Datei discussion.php ist eine Callback-Funktion für die individuelle Anzeige der Kommentare. Sie wird von der comments.php aufgerufen.
Du kannst die comments.php ändern wie Du willst und diese in das Hauptverzeichnis des Child-Theme kopieren. Dann wird immer die comments.php des Child-Theme genutzt, statt der originalen Datei im dkret3-Ordner.
In der functions.php des Child-Themes sollte dann noch eine vollständige Callback-Funktion für die Kommentare eingefügt werden. Also Deine modifizierte und ergänzte dkret-Funktion aus der Datei discussion.php. Es ist natürlich wichtig, dass Du die Funktion umbenennst, damit nicht zwei Funktionen desselben Namens vorhanden sind.
z.B.:
function dkret_comments_callback($comment, $args, $depth) {
->
function childtheme_comments_callback($comment, $args, $depth) {
Schließlich ist es notwendig, dass in der comments.php des Child-Themes dieser callback auch aufgerufen wird.
Beim Kommentieren erhalten ich hier eine Fehlermeldung:
“Warning: Cannot modify header information - headers already sent by (output started at /var/vhosts/ixiter/public/wp-content/plugins/pagerank-widget/pagerank-widget.php:289)”
Möglicherweise ist das in der Fehlermeldung genannte Plugin “schuld”.
Da ist noch ein Fehler drin: In ixQuote beziehst du dich nur auf #edit-comment-XXX, doch das gibt’s nur dann, wenn der Kommentar auch tatsächlich editierbar ist – das ist für dich als Admin immer der Fall, aber für Besucher nur, wenn’s der eigene ist und die Zeit noch nicht abgelaufen ist. Konsequenterweise findet sich in der Fehlerkonsole, als ich das grad ausprobiert hab, “document.getElementById(“edit-comment” + commentID) is null”.
Solche Fehlermeldungen hab ich auch grad “ein paar” bekommen, davor ein Pagerank-Bildchen…
Und die Kommentar-Uhrzeit stimmt auch nicht, es ist schon 12 Uhr.
Pingback: wemaflo.net » WordPress: Zitatfunktion bei Kommentaren einbauen
@Kretzschmar: Stimmt! Danke für den Hinweis.
Ich war gestern wohl nicht ganz auf der Höhe, denn eigentlich weiß ich um die functions.php und das von dir beschriebene Verfahren. Habe ich natürlich geändert und werde ich auch gleich im Beitrag korrigieren.
Danke auch für die Fehlermeldung.
Ich habe das Plugin einfach deaktiviert, weil ich es eh nicht benutze. Ich hatte es nur für Testzwecke installiert.
@cimddwc:
Auweia! Danke auch dir. Ich hätte bei dir aufmerksamer lesen sollen
Jetzt gehts aber.