WordPress und CDATA / Javascript Problem

Bei dem XHTML-konformen Einbau von Google-Adwords Conversion Tracking Snippet in WordPress Seiten ergibt sich ein typisches WordPress Problem: Das mit CDATA Block  eingefügte JavaScript wird von der automatischen Worpdress Formatierung umgewandelt. Der Endmarker des CDATA Blocks wird von

/* ]]> */

zu

/* ]]> */

Schuld ist eine Zeile im WordPress Core – um genau zu sein die Datei wp-includes/post-template.php –  in der folgendes steht:

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

Seit Jahren ist es ein Thema, diese wenig nützliche String-Ersetzung heraus zu nehmen. Am Beste sollte das als WordPress Filter umgesetzt werden, so dass man diesen bei Bedarf auch abschalten kann. Dann klappt es auch mit dem [[ CDATA ]] …

Diese Funktion ist Teil des WordPress Konzepts Texte optimal für den Besucher der Webseite anzuzeigen. Dies Teil sich in zwei Abschnitte auf: Abspeichern eingegebener Texte und diese auch ad-post auch umformatiert auszugeben. Dies geschieht mit der Funktion wpautop(), die man in der Functions.php Datei wie folgt auch deaktivieren kann:

remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );

Doch zurück  zu unserem [[ CDATA ]] Problem in WordPress im Speziellen:

Workaround: CDATA Javascript Block in WordPress

WordPress ändert also die betreffenden > Zeichen des CDATA-Blocks in HTML-Entities um: >

Das liegt an der oben beschriebenen Funktion wpautop(), die normalerweise praktische Hilfe bietet, indem Sonderzeichen in Posts automatisch für uns in HTML-Entities geändert werden. Im Fall unsere CDATA wollen wir das aber eben die Umwandlung nicht. Die Methode mit dem Hammer, nämlich den Filter wpautop() komplett abzuschalten, kennen wir. Der folgende Workaround löst das Problem aber besser und erhält uns die nützliche wpautop() Funktion. Der Workaround zur Ausklammerung der CDATA Umformatierung wird in die functions.php aufgenommen:

function cdata_fix($content) {
$content = str_replace("]]>", "]]>", $content);
return $content;
}

function cdata_template_redirect( $content ) {
ob_start('cdata_fix');
}

add_action('template_redirect','cdata_template_redirect',-1);

Zugegeben ein ärgerliches technisches Problem für WordPress benutzer, aber wer mit Javascript Snippets hantiert, der wird sich auch schnell mit dem kleinen CDATA Problem Workaround arrangieren.

Leave a Comment