Sidebar
ein-/ausblenden

Live Kommentarvorschau mit jQuery und WordPress

Plugin für WordPress SEO

Anzeige

Kommentarautoren bewerten eine Vorschau des getippten Kommentars als Mehrwert und es gibt die unterschiedlichsten Lösungen um die Vorschau in das Blog zu integrieren. Die wohl bekannteste ist das Plugin Live Comment Preview. Mit diesem Plugin fällt die Implementierung recht leicht.

jQuery Logo

Nicht immer ist der leichteste Weg aber der Beste, wobei die folgende Lösung nicht unbedingt als die Beste angesehen werden soll, aber für mich und das Theme, bei dem ich die Vorschau einsetze, ist es die beste Lösung. Dies liegt vor allem daran, dass ich schon einige Funktionen in das Theme integriert habe, die auf Basis jQuery - eine populäre JavaScript-Library - basieren. Somit ist die Entscheidung leicht gefallen, denn das Framework wurde eh schon geladen und stand so zur Verfügung.

Damit erklärt sich auch schon die Grundfunktion - die im folgenden vorgestellte Lösung wird mit jQuery realisiert. Der Code entspricht dem wunderbaren Blog zum Thema jQuery - „Learning jQuery“.

Damit wir auf das Framework zugreifen können, muss es natürlich eingebunden werden. Dazu hinterlegen wir einen Link zur Library im Theme. Hierbei gilt es zu beachten, dass die Library entweder aus dem Standard von WordPress geladen wird oder im Theme als Datei hinterlegt wurde. Zu jeder Anwendung jeweils ein Beispiel.

Außerdem gilt es zu prüfen, dass nicht eventuell andere Plugins auch eine eigene Library mitbringen. Es kann zu Problemen zwischen den verschiedenen Librarys kommen! Ebenso sollte man nicht die gleiche Library mehrfach laden, eventuell auch verschiedene Versionen. Also hier gilt, prüfen.

Im weiteren empfehle ich, dass das Framework, auch wenn jQuery wesentlich kleiner ist als andere Librarys, nur dann geladen wird, wenn es explizit auch benötigt wird. Realisieren kann man dies recht einfach mit Hilfe der Conditional Tags unter WordPress.

Einbinden werde ich den Code in die footer.php, so dass die Library erst dann geladen wird, wenn der User sein „wichtigen“ Daten bekommen hat, den Inhalt der Seite.

Einbinden des Framework aus dem Theme-Ordner


<?php if (is_single() || is_page()) { ?>
<script src="<?php bloginfo('template_url'); ?>/js/jquery.js" type="text/javascript" charset="<?php bloginfo('charset'); ?>" ></script>
<?php } ?>

Einbinden aus den Standard-WordPress-Installation

<?php wp_enqueue_script('jquery');?>

Diese Variante kommt mit wenig Syntax aus, denn WordPress bietet eine eigene Funktion zum einbinden der Librarys. Es gibt noch weitere Möglichkeiten, doch diese sollen in diesem Artikel nicht das Thema sein. Einige Möglichkeiten findet man in der Datei wp-includes/script-loader.php, Klasse WP_Scripts.

Einbau der Kommentar-Vorschau

Hat man die Library eingebunden, dann steht die Basis und wir können das Kommentar-Template bearbeiten und die Vorschau integrieren.

Textfeld ansprechen

Dazu müssen wir die Daten aus dem Textfeld (textarea) bekommen, dieses erkennt jQuery anhand der ID comment.

Das Formular zum Hinterlassen von Kommentaren ist in jedem Theme anders hinterlegt, die Grundstruktur sollte aber ähnlich sein, deshalb im folgendem Code-Abschnitt ein Beispiel. Entscheidend ist das ID des Textfeldes. Das JavaScript für die Live-Vorschau muss dementsprechend angepasst werden.


<form id="commentform" action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" >
	<p>
		<label for="author">Name <?php if ($req) echo "<small>ist Pflichtfeld</small>"; ?></label>
		<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="50" tabindex="1" />
	</p>
	<p>
		<label for="email">eMail (bleibt versteckt) <?php if ($req) echo "<small>ist Pflichtfeld</small>"; ?></label>
		<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="50" tabindex="2" />
	</p>
	<p>
		<label for="url">Website</label>
		<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="50" tabindex="3" />
	</p>
	<p>
		<label for="comment">Dein Kommentar</label>
		<textarea name="comment" id="comment" cols="70" rows="5" tabindex="4"></textarea>
	</p>
	<?php do_action('comment_form', $post->ID); ?>
	<p>
		<input name="submit" type="submit" id="submit" tabindex="6" value="Kommentar absenden" />
		<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
	</p>
</form>

Ausgabe erzeugen

Als nächstes binden wir den JavaScript-Code ein um die Vorschau des Kommentars zu realisieren. Dazu erzeuge ich einen div mit Hilfe jQuery.


$('#comment').one('focus', function() {
$('#comment').parent().after('<h4 class="live_preview_h">Live Kommentar Vorschau</h4><ol class="commentlist_preview"><li id="live_preview_li"><div class="commenttext" id="live-preview"></div></li></ol>');
});

Auch das ist nur ein Beispiel, wie ich es umgesetzt habe. Der Syntax für die Ausgabe nach dem Kommentarfeld ($('#comment').parent().after) sollte entsprechend deinem Kommentar gleichen. So sieht die Vorschau annähernd dem endgültigem Design ähnlich.

Damit die Vorschau auch nur dann erzeugt wird, wenn ein Kommentar eingegeben wird, also wenn das Textfeld aktiv genutzt wird, fragen wir dieses auch anhand der ID ab ($('#comment').one('focus').

Für die Ausgabe der Vorschau vergebe ich das ID live-preview, dieses benötigen wir im kommenden Schritt.

Ausgabe formatieren

Prinzipiell kann damit die Ausgabe schon eingebaut werden, wenn wir die Ausgabe aktivieren. Allerdings gibt es ein Problem, wenn der Kommentarautor Enter betätigt. Deshalb fragen wir auch dies ab und passen ($comment.replace) die Ausgabe mit einem Break (<br />) an.


var $comment = '';
$('#comment').keyup(function() {
	$comment = $(this).val();
	$comment = $comment.replace(/\n/g, "<br />").replace(/\n\n+/g, '<br /><br />').replace(/(&lt;\/?)script/g,"$1noscript");
	$('#live-preview').html( $comment );
});

Der komplette JS-Code

Damit sieht der komplette Code für die Vorschau des Kommentars wie folgt aus.


jQuery(document).ready(function() {
	/* Comment preview */
	$('#comment').one('focus', function() {
		$('#comment').parent().after('<h4 class="live_preview_h">Live Kommentar Vorschau</h4><ol class="commentlist_preview"><li id="live_preview_li"><div class="commenttext" id="live-preview"></div></li></ol>');
	});
	var $comment = '';
	$('#comment').keyup(function() {
		$comment = $(this).val();
		$comment = $comment.replace(/\n/g, "<br />").replace(/\n\n+/g, '<br /><br />').replace(/(&lt;\/?)script/g,"$1noscript");
		$('#live-preview').html( $comment );
	});
});

Einbinden des Code

Diesen kann man nun in eine eigene Datei auslagern und ähnlich dem Einbinden der jQuery-Bibliothek im obigen Abschnitt einbinden oder direkt im Code des PHP-Templates hinterlegen. Auch dazu wieder je ein Beispiel.

Die folgende Lösung wird nur dann geladen, wenn es sich im einen einzelnen Beitrag (is_single()) oder (||) eine statische Seite (is_page()) in WordPress handelt. Die Abfrage erfolgt mittels Conditional Tags, dazu habe ich hier im Blog schon eine ganze Reihe an Artikeln hinterlegt, nur für die, die mehr zum Thema wissen wollen.


<?php if (is_single() || is_page()) { ?>
<script src="<?php bloginfo('template_url'); ?>/js/comment_preview.js" type="text/javascript" charset="<?php bloginfo('charset'); ?>" ></script>
<?php } ?>

Alternativ auch die zweite Methode, das einbinden direkt in das Template. Dazu muss der JavaScript-Code in den script-Tag eingebettet werden. Als Empfehlung wieder die footer.php, wenn der Code des JS erst geladen werden soll, wenn die Inhalte der Seite vorhanden sind und damit die wichtigen Elemente für den Leser im Browser sind.


<script type="text/javascript">
<!--
	jQuery(document).ready(function() {
		. . .
	});
-->
</script>

Auch diesen Code kann man natürlich wieder mit Hilfe der Conditional Tags in das Template einbetten und so die Ladequalität steigern.

Dann kann ich nur noch viel Spaß beim Umsetzen wünschen! Ich hoffe, es ist anschaulich erklärt und ich wünsche mir auch für diesen Beitrag wie immer, Feedback und Verbesserungsvorschläge. Vielleicht hat ja einer der JavaScript-Cracks einen Tipp für die einfache Integration des Autorennamens und Links o.ä.?

Weiterführende Links

14 Kommentare und 2 Trackbacks zu „Live Kommentarvorschau mit jQuery und WordPress“

  1. 1
    Kommentar von Handy Blogger

    Danke für den Tipp! Werde ich gleich mal ein eins meiner Blogs einbauen. Sehe übrigens gerade die Live Vorschau meines Kommentars :-)

  2. 2
    Kommentar von Fabian Künzel

    Hallo Frank,

    der Artikel ist klasse :o )
    Nur Leider scheint das ganze nicht zu Funktionieren mit deiner Lösung...
    Zumindens bekomme ich keinen Text angezeigt wenn ich in der Textarea Schreibe...
    Mit der Lösung von Really Simple Live Comment Preview entgegen siehts wieder ganz anders aus...

    Ne Idee worans liegt?

  3. 3
    Kommentar von Frank Bültge

    @Fabian: eventuell hat der Tag html im JS Probleme gemacht, der wurde als acronym formatiert. JS ist da sensibel, es muss klein geschrieben werden.

  4. 4
    Kommentar von Fabian Künzel

    Hmm, das wäre möglich... nun ich werd das ganze demnächst nochmal in Angriff nehmen...
    Derzeit sind einige dinge wichtiger.. mein blog muss endlich wieder zum Leben geweckt werden... Mal sehen wenn sich alles gelegt hab, werd ich mich wohl auch mal mit der jQuery Libary beschäftigen. Einige Funktionien die damit Realisierbar sind, machen mich einfach neugierig..

    Übrigens... ich ahtte dich vor einigen tagen bezüglich der gzip angesprochen...
    Ich vermute fast doch das es mit WP2.3 zusammenhängt... Mein 2. Blog (auf gleichen space, nur unter subdomän) verwendet gzip.. von vorne rein... hier bekomm ich jedoch nicht angezeigt.. aber auch erstmal egal :)

  5. 5
    Pingback von JavaScript in HTML einbinden | bueltge.de [by:ltge.de]
  6. 6
    Kommentar von Tobi

    Hallo,

    in dem ersten Code befindet sich ein Fehler. Vor "comment" id="comment" fehlt ein textarea.

  7. 7
    Kommentar von Frank Bültge

    @Tobi: Vielen Dank, ergänzt.

  8. 8
    Pingback von links for 2008-08-22 auf Timos Weblog
  9. 9
    Kommentar von Jared

    Hallo Frank :)

    ich habe grade dein Artikel gefunden da ich nicht mehr auf das Plugin angewiesen sein will!
    Es klappt auch super aber mein Layout sieht (leider) nicht vor das die Kommentarvorschau genau nach dem Textfeld erscheint.

    Aber jedesmal wenn ich die '#comment' gegen die ID meines Obercontainers angebe, als Beispiel '#kommentare' funktioniert das Script einfach nicht mehr :(

    Ich tausche einfach überall wo #comment steht gegen #kommentare aus.
    Was mach ich denn falsch?

    Wär dir echt dankbar für einen kleinen Tip..

    lg
    Jared

  10. 10
    Kommentar von Frank Bültge

    Das ist quasi auch richtig so, achte aber auch auf die anderen IDs wie #commentform, alle müssen passen, sonst kann JS nichts finden.

  11. 11
    Kommentar von Jared

    Das ist ja grade das eigenartige?!
    Es funktioniert auf jeden Fall mit dem von dir vorgeschlagenen Code (mein Theme passt auch) aber sobald ich #comment im Javascript Code gegen #kommentare austausche... dann geht nix mehr.

  12. 12
    Kommentar von Frank Bültge

    Ist natürlich immer schwer zu sagen, denn ohne den Code zu sehen ist eine Fehlersuche für mich unmöglich.

  13. 13
    Kommentar von Jared

    Das ist sonnenklar ;-)
    Bin nur grade noch auf Arbeit in meiner Mittagspause... Könnte ich dir den Code heute abend als Kommentar in diesem Beitrag schicken?

    Vielleicht ist mir bis dahin ja doch noch eine Lösung eingefallen!!!

    lg
    Jared

  14. 14
    Kommentar von Frank Bültge

    via Mail wäre mir lieber, die Kommentare verschlucken manchmal den Code; oder direkt das Theme.

  15. 15
    Kommentar von Tobias

    hoffentlich haste Kontaktformular :D

  16. 16
    Kommentar von EmiBender

    jQuery finde ich gerade für Webshops sehr gut. Ich habe meinen Admin auch gebeten, es für mich einzurichten, weil ich leider zu wenig Erfahrungen damit habe.

Kommentar schreiben

Kommentarregeln: Bleib cool, kritisch ist in Ordnung, aber wenn du unhöflich bist, dann lösche ich deinen Kommentar. Bitte benutze deinen persönlichen Namen oder Initialen und nicht den Namen eines Unternehmens, dies würde als Spam gewertet und wird gelöscht. Der Zusammenhang zwischen Namen und URL sollte nicht offensichtlich auf Spam hindeuten! ♥ Ansonsten, vielen Dank für den Kommentar und viel Spaß mit meinem Blog.

E-Mail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

Kommentar-Hilfe

händischer Spam:
Beachte die Kommentarregeln, jede Form von versuchtem Spam wird gelöscht. Warum und wieso steht in einem meiner Beiträge.

Bezug auf Textstellen:
Du kannst direkt bezug auf Textstellen im Beitrag nehmen. Dazu muss lediglich der Bereich im Artikel markiert werden; daraufhin erscheint ein Button, der den markierten Text in das Kommentarfeld übernimmt und als Zitat auszeichnet. Die Funktion ist nur bei aktivem JavaScript nutzbar.

xHTML:
Du kannst folgende Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <pre> <em> <strong> <strike> <ul> <ul> <li>

Achte darauf, wenn du Code im Kommentar hinterlegen willst, dann muss der Code maskiert sein. Dann wird er nicht interpretiert. Der Code muss mit Hilfe von HTML-Entities dargestellt werden, d.h. dass man z.B. < als &lt; und > als &gt; einfügt.

E-Mail-Benachrichtigung bei neuen Kommentaren ?
Wenn der Haken in der Checkbox gesetzt ist, dann wirst du über neue Kommentare vie E-Mail informiert. Der Versand erfolgt nur, wenn du die URL in der Bestätigungs-E-Mail genutzt hast oder schon Abonnent hier im Blog bist.

Kommentar erscheint nicht:
Alle Kommentare werden manuell geprüft, freigegeben und nach Möglichkeit beantwortet. Bitte um etwas Geduld und Nachsicht.

Identifikationsbilder (Avatare):
Auf Gravatar.com kann man sich mit seiner E-Mail-Adresse registrieren und ein Bild hochladen, dann erscheint dieses Gravatar hier und in vielen weiteren Blogs.

Spamschutz:
Das Kommentarformular ist mit einem Spamschutz ausgerüstet. Solltest du diesen Artikel ohne JavaScript besuchen und kommentieren wollen, so muss du die Frage beantworten und das jeweilige Wort in das Textfeld eingeben.