Deutsch English
WordPress Read this post in English

JavaScript und CDATA-Blöcke in WordPress-Posts

In Zusammenhang mit dem XHTML-konformen Einbau von Google-Maps stieß ich (mal wieder) auf zwei Probleme: Als ich das JavaScript mit dem CDATA-Block einfügen wollte, kam mir WordPress mit seinen sonst so angenehmen automatischen Formatierungen ins Gehege. Da wurde nämlich aus dem Endmarker

/* ]]> */

plötzlich folgendes:

/* ]]> */

Schuld daran ist eine Zeile in der Datei wp-includes/post-template.php, die da lautet:

165
$content = str_replace(']]>', ']]>', $content);

Wozu diese Zeile überhaupt jemals gut sein soll, ist mir ein Rätsel. Warum das Ganze nicht als Filter umgesetzt wurde, den man bei Bedarf auch mal abschalten kann, ist mir ebenfalls ein Rätsel. Schon seit zwei Jahren bitten etliche Leute darum, diese Zeile abzuschaffen oder irgendwie anders zu realisieren. Da bleibt nur warten und hoffen, daß es eines fernen Tages in einer kommenden WordPress-Version geändert wird.

In der Zwischenzeit aber bleibt einem wohl nichts anderes übrig, als die oben zitierte Zeile einfach auszukommentieren – auch wenn ich solche Lösungen, die ein Rumpfuschen im Quellcode erfordern, nicht so gerne habe. Dann klappt’s auch mit den CDATA-Blöcken – oder zumindest schonmal mit deren Definition.

Nun fügt man so einen CDATA-Block ja eigentlich nur aus einem Grund ein, nämlich damit man auch Zeichen wie <, > usw. verwenden kann, ohne sie in HTML-Entities umwandeln zu müssen. So kann man dann beispielsweise auch innerhalb eines JavaScripts HTML notieren, ohne daß der Browser davon irritiert wird.
Wordpress aber wandelt alle betreffenden Zeichen innerhalb des CDATA-Blocks trotzdem in HTML-Entities um. Das liegt an der Funktion wpautop(), die uns normalerweise das Leben sehr erleichtert, indem sie alle Sonderzeichen in Posts für uns in HTML-Entities umwandelt. In diesem speziellen Fall aber wollen wir ja gar nicht, daß sie umgewandelt werden! Wir müssen also den Filter wpautop() irgendwie abschalten.

Aber zum Glück gibt es ja für fast alles ein Plugin – so auch hierfür. „TextControl“ heißt es und ist hier erhätlich. Übrigens wird es zur Verwendung von JavaScript in WordPress-Posts sogar von offizieller Seite empfohlen. Mit diesem Plugin kann man für jeden Post einzeln oder aber auch blogweit die automatische Formatierung deaktivieren. Um die Umwandlung von Sonderzeichen abzuschalten, genügt es, im zweiten Dropdown-Menü „No Character Encoding“ anstatt „Default (wptexturize)“ auszuwählen.



Kommentare

  1. 26. November 2014
    19:59 Uhr

    Ginchen flag

    Du hast recht, heute würde ich es auch so lösen. Genauso wie ich heutzutage wpautop() immer per functions.php deaktiviere. Aber als ich das damals geschrieben habe, war ich noch ein totaler WordPress-Neuling und hatte keine Ahnung, dass das geht. :)
    Ich sollte den Post also mal updaten. ;)

  2. 25. November 2014
    9:09 Uhr

    Arno Welzel flag

    Es gibt immer noch keinen Fix dafür – aber man kann auch ohne Änderung am Core-Code von WordPress das Problem lösen mit einer kleinen Funktion im eigenen Template (oder einem eigenen Plugin dafür).

    Siehe hier:

    https://core.trac.wordpress.org/ticket/3670#comment:72

    Das nutze ich so bei mir und hatte damit bisher keine Probleme – und ich muss nicht bei jedem WordPress-Update daran denken, die Änderung im Core-Code nachzuziehen.

  3. 3. Juli 2014
    15:27 Uhr

    Christoph flag

    Yeah. Still not fixed! Nice work!

  4. 31. Juli 2013
    17:51 Uhr

    Matt Hawkins

    Five years later and this still isn’t fixed!

Kommentieren

Erlaubtes HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong> <img src="" alt="" class="" width="" height=""> | Codeschnipsel können in `backticks` gepostet werden. Beispiel: `<?php echo "Hi!"; ?>`