5

I have added a button beside the Add Media button in WordPress' post editor. Its called Insert Content button.

When this button is pressed, it should send a content, either plain text or HTML, into the editor, replacing any text in it.

The code should work in both text and visual mode. How can I do that using jQuery?

Here is an image to further clarify the question:

enter image description here

Note: There are various answers already but they only answer replacing the text in visual mode.

1 Answer 1

16

The first thing to do is to select the active editor. Here we select the editor using its id, which is content.

var activeEditor = tinyMCE.get('content');

Then we use tinyMCE's setContent:

var activeEditor = tinyMCE.get('content');
var content = 'HTML or plain text content here...';
activeEditor.setContent(content);

However, if the editor is in text mode to begin with, after the page has loaded, activeEditor will be null. So we need to account for that:

var activeEditor = tinyMCE.get('content');
var content = 'HTML or plain text content here...';
if(activeEditor!==null){
    activeEditor.setContent(content);
}

Since setContent only works for tinyMCE, this wont work if the editor is in text mode. So we have to call the textarea directly and update its value:

var activeEditor = tinyMCE.get('content');
var content = 'HTML or plain text content here...';
if(activeEditor!==null){
    activeEditor.setContent(content);
} else {
    $('#content').val(content);
}

However, another caveat is that if you toggled into visual mode, then toggled back into text mode, activeEditor is no longer null, so setContent will be called always instead of the textarea. So we have to check for the editor's state. To determine the current mode, we monitor the class of div#wp-content-wrap. Putting it all together:

var content = 'HTML or plain text content here...';
if($('#wp-content-wrap').hasClass('html-active')){ // We are in text mode
    $('#content').val(content); // Update the textarea's content
} else { // We are in tinyMCE mode
    var activeEditor = tinyMCE.get('content');
    if(activeEditor!==null){ // Make sure we're not calling setContent on null
        activeEditor.setContent(content); // Update tinyMCE's content
    }
}
1
  • Works as expected, should be accepted Commented May 23, 2018 at 8:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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