Как заменить содержимое редактора tinyMCE в текстовом и визуальном режиме с помощью jQuery?
Я добавил кнопку рядом с кнопкой "Добавить медиафайл" в редакторе записей WordPress. Она называется "Вставить контент".
Когда эта кнопка нажата, она должна отправлять контент (обычный текст или HTML) в редактор, заменяя весь имеющийся там текст.
Код должен работать как в текстовом, так и в визуальном режиме. Как это можно реализовать с помощью jQuery?
Вот изображение для лучшего понимания вопроса:
Примечание: Существуют различные ответы, но они описывают только замену текста в визуальном режиме.

Первое, что нужно сделать - выбрать активный редактор. Здесь мы выбираем редактор по его идентификатору, который называется content
.
var activeEditor = tinyMCE.get('content');
Затем мы используем метод setContent
tinyMCE:
var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
activeEditor.setContent(content);
Однако, если редактор изначально находится в текстовом режиме после загрузки страницы, activeEditor
будет равен null
. Поэтому нам нужно это учитывать:
var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
if(activeEditor!==null){
activeEditor.setContent(content);
}
Поскольку setContent
работает только для tinyMCE, это не сработает, если редактор находится в текстовом режиме. Поэтому нам нужно обратиться к textarea напрямую и обновить его значение:
var activeEditor = tinyMCE.get('content');
var content = 'HTML или обычный текст здесь...';
if(activeEditor!==null){
activeEditor.setContent(content);
} else {
$('#content').val(content);
}
Однако, есть ещё один нюанс: если вы переключились в визуальный режим, а затем вернулись в текстовый, activeEditor
больше не будет null, поэтому setContent
будет вызываться всегда вместо обновления textarea. Поэтому нам нужно проверять состояние редактора.
Чтобы определить текущий режим, мы отслеживаем класс div#wp-content-wrap.
Объединяя всё вместе:
var content = 'HTML или обычный текст здесь...';
if($('#wp-content-wrap').hasClass('html-active')){ // Мы в текстовом режиме
$('#content').val(content); // Обновляем содержимое textarea
} else { // Мы в режиме tinyMCE
var activeEditor = tinyMCE.get('content');
if(activeEditor!==null){ // Убеждаемся, что не вызываем setContent для null
activeEditor.setContent(content); // Обновляем содержимое tinyMCE
}
}
