I'm showing little pieces of example HTML/PHP code on the frontend (with syntax highlighting). The entries are displayed as FAQ custom posts, and have a plugin (CMS Tree page) to alter the menu order, at which these are displayed. Whenever I change the order, it calls a wp_update_post, updating ID, menu_order, post_parent, post_type. For debug, I output the post_content property right before updating, and right after, and it gets changed in a horrible way.

Before (correct):

[html light="true"]</body>[/html]

After (messy):

[html light="true"]</body>[/html]

If I do it a couple of times it'll become living hell to revert:

[html light="true"]</body>[/html]

It looks exactly like htmlspecialchars() with ENT_NOQUOTES has been cast on it...

Please note that these are from the "source code" view and not the frontend. The browsers correctly handle the "Before" state, and render it as


How can I prevent it going messy?


It was https://wordpress.org/plugins/syntaxhighlighter/ plugin's fault. There are some functions in it that have something to do with this, namely encode_shortcode_contents_slashed_noquickedit, encode_shortcode_contents_callback.

Now I replaced it to https://wordpress.org/plugins/crayon-syntax-highlighter/ but by the time I confirmed it was the other plugin's fault I had already written a solution.

function wpse190396_insert_post_data($data, $postarr){
    if($postarr['filter'] == 'db'
        && ($data['post_type'] == 'fix' || $data['post_type'] == 'faq')
        && (strpos($data['post_content'],'&amp;lt;') !== false
            || strpos($data['post_content'],'&amp;nbsp;') !== false
            || strpos($data['post_content'],'&amp;gt;') !== false
        $data['post_content'] = htmlspecialchars_decode($data['post_content']);
    return $data;

add_action( 'wp_insert_post_data', 'wpse190396_insert_post_data', 10, 2 );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.