WordPress Version 3.3.1
qTranslate Version 2.5.28

Das Problem war, dass qTranslate meine Code Snippets im Visual Editor von WordPress „gefressen“ hat. Sobald ein Wort in <bla> verpackt war, wurde der gesamte Content dazwischen gelöscht. Die Seite wurde zwar korrekt publiziert, im Editor war der Content jedoch weg. Was natürlich blöd ist, wenn man später eine Seite überarbeiten möchte und man nur noch die Hälfte des Inhalts angezeigt bekommt…

Ich dachte zuerst, ich müsste ein spezielles Code Plugin installieren wie WP-SynHighlight oder SyntaxHighlighter Evolved um dieses Problem zu beheben. Jedoch wurde auch dort der Code gelöscht…

Nach längerem rumprobieren hab ich bemerkt: Wenn qTranslate ausgeschaltet war, hat alles wunderbar funktioniert. Also hab ich den Sourcecode von qTranslate durchwühlt. Und die Lösung gefunden 🙂 Einfach folgende Zeile hinzufügen und das Problem ist gelöst 🙂

Lösung 1 (veraltet)

Dieser Lösungsansatz ist veraltet – denn macht man ein Update des qtranslate Plugins, gehen die Änderungen verloren.

vi wp-content/plugins/qtranslate/qtranslate_wphacks.php 
        // remove wpautop
        if('html' != wp_default_editor()) {
                remove_filter('the_editor_content', 'wp_richedit_pre');
                // added by teslina. bugfix <>&
                add_filter('the_editor_content', 'wp_htmledit_pre');
        }

Lösung 2 (aktuell)

Hier der aktuelle Lösungsweg. Fügt man das im functions.php ein, bleibt die Änderung auch nach einem Update erhalten. Danke, @Alok Jain 🙂

vi wp-content/themes/<themename>/functions.php 

und hier nun diese Zeile einfügen:

        // added by teslina. bugfix <>&
        // remove wpautop
        if('html' != wp_default_editor()) {
                remove_filter('the_editor_content', 'wp_richedit_pre');
                add_filter('the_editor_content', 'wp_htmledit_pre');
        }
        // eof bugfix

Und wie man sieht…

<b>Mein Text ist immernoch da</b>

🙂

Damit sich der Editor auch allen vorformattierten Texten gegenüber korrekt verhält, hab ich in meine

wp-content/themes/THEMENAME/functions.php

noch um Folgende Zeilen ergänzt:

// Remove WordPress Auto P
remove_filter( 'the_content', 'wpautop' );

// function aus advanced tinymce plugin
if ( ! function_exists('tmce_replace') ) {
        function tmce_replace() {
                $tadv_options = get_option('tadv_options', array());
                $tadv_plugins = get_option('tadv_plugins', array());

?>
<script type="text/javascript">
if ( typeof(jQuery) != 'undefined' ) {
  jQuery('body').bind('afterPreWpautop', function(e, o){
    o.data = o.unfiltered
    .replace(/caption\]\ +?<\/object>/g, function(a) {
      return a.replace(/[\r\n]+/g, ' ');
    });
  }).bind('afterWpautop', function(e, o){
    o.data = o.unfiltered;
  });
}
</script>
<?php
        }
        add_action( 'after_wp_tiny_mce', 'tmce_replace' );
}
// eof advanced tinymce plugin

// http://tinymce.moxiecode.com/wiki.php/Configuration
function teslina_tinymce_config( $init ) {

// Change code cleanup/content filtering config

    // Don't remove line breaks
    $init['remove_linebreaks'] = false;
    // Convert newline characters to BR tags
    //$init['convert_newlines_to_brs'] = true;
    //$init['force_br_newlines '] = true;

    // With this option set to false, the line breaks are stripped from the HTML source.
    $init['apply_source_formatting'] = true;
    // Preserve tab/space whitespace
    $init['preformatted'] = true;
    // Do not remove redundant BR tags
    $init['remove_redundant_brs'] = false;

    return $init;
}
add_filter('tiny_mce_before_init', 'teslina_tinymce_config');

Update: 2014-02-28

Ausserdem habe ich noch tinymce-advanced installiert. Dieses Plugin wandelt < > etc, in &amp; &lt; um. Dann haben wir das Problem, dass nicht mehr alles korrekt dargestellt wird. Die Lösung basiert auf diesem Artikel:

vi wp-content/plugins/tinymce-advanced/tinymce-advanced.php

und folgendes ändern:

if ( ! function_exists('tadv_htmledit') ) {
        function tadv_htmledit($c) {
                $tadv_options = get_option('tadv_options', array());

                if ( isset($tadv_options['no_autop']) && $tadv_options['no_autop'] == 1 ) {
/* teslina
                        $c = str_replace( array('&amp;', '&lt;', '&gt;'), array('&', '<', '>'), $c );
*/
                        $c = html_entity_decode($c, ENT_QUOTES, "UTF-8");
// eof teslina