Как создать WP Editor с помощью JavaScript
Я пытаюсь создать повторяющиеся поля и для этого мне нужно создать новый редактор wp editor с уникальным ID.
Мой вопрос: есть ли способ создать wp_editor
используя JavaScript, аналогично тому, как мы получаем его с помощью функции WordPress <?php wp_editor() ?>
.
Я пробовал использовать:
tinyMCE.init({
mode: "exact",
elements: "accordion_icon_description_"+response.success.item_count
});
но это создает очень базовый редактор, который, как я понимаю, не такой, как редактор контента в WordPress.

Благодаря комментарию Джейкоба Питти, я могу ответить на этот вопрос, используя только JavaScript. На самом деле, мы делали что-то подобное, но до версии 4.8 это было не так просто, поэтому в итоге мы использовали wp_editor()
. Но теперь вы можете сделать это с помощью объекта wp.editor
в JavaScript. Есть 3 основные функции:
wp.editor.initialize = function( id, settings ) {
Где id
— это
HTML-идентификатор текстового поля, используемого для редактора. Должен соответствовать требованиям jQuery. Никаких скобок, специальных символов и т.д.
и settings
— это либо объект
{
tinymce: {
// настройки TinyMCE
},
quicktags: {
buttons: '..'
}
}
с этими настройками TinyMCE. Вместо любого из 3 объектов (settings
, tinymce
или quicktags
) можно использовать true
, чтобы применить значения по умолчанию.
wp.editor.remove = function( id ) {
Довольно очевидно. Удаляет любой экземпляр редактора, созданный через wp.editor.initialize
.
wp.editor.getContent = function( id ) {
Ну, получает содержимое любого редактора, созданного через wp.editor.initialize
.
Использование может выглядеть так:
var countEditors = 0;
$(document).on('click', 'button#addEditor', function() {
var editorId = 'editor-' + countEditors;
// добавляем редактор в HTML как <textarea> с id editorId
// даем ему класс wp-editor
wp.editor.initialize(editorId, true);
countEditors++;
});
$(document).on('click', 'button.removeEditor', function() {
// предполагаем, что редактор находится в том же родительском элементе
var editorId = $(this).parent().find('.wp-editor');
wp.editor.remove(editorId);
});
Поскольку содержимое будет автоматически отправлено, в этом примере оно не требуется. Но вы всегда можете получить его через wp.editor.getContent( editorId )
.

Я проверил, инициализируя редактор с ID текстового поля wp.editor.initialize(editorId, true); но это не работает.

Редактор уже в DOM, ID правильный? Можешь поделиться своим JS-кодом (например, через pastebin)?

Да, текстовое поле находится в поле метаданных. Я проверяю это в document.ready и также проверил, выполняя код в консоли браузера, но он возвращает undefined для каждого текстового поля, даже для тех, которые являются полями метаданных записи.

Я не могу поделиться всем кодом, так как это будет бессмысленно. Это часть чего-то большего.

Для вашего сведения, мой код: wp.editor.initialize("accordion_icon_description_1", true);

@kero, у меня тоже возникает эта проблема. Можете помочь мне с её решением? https://wordpress.stackexchange.com/questions/382108/editor-not-displaying-dynamically-after-clicking-on-the-button

WP 5.3.2
Создаю плагин с Ajax-подгрузкой страниц, необходимо получать данные из нескольких динамически загружаемых редакторов WP.
ПРИМЕЧАНИЕ: Пример ниже для области wp-admin, если нужно для фронтенда, возможно, потребуется доработка.
1. Убедитесь, что скрипты редактора загружены:
add_action( 'admin_enqueue_scripts', 'load_admin_scripts');
function load_admin_scripts() {
// НЕ загружайте на всех страницах админки, добавьте логику для загрузки только на ваших страницах
wp_enqueue_editor();
}
2. Получаем текстовое поле редактора через Ajax (PHP):
function your_ajax_get_editor_callback() {
// Важно: каждый редактор должен иметь уникальные name и id
return '<textarea name="my-wp-editor" id="my-wp-editor" rows="12" class="myprefix-wpeditor">Значение из базы данных здесь :-)</textarea>';
}
3. Используем JS скрипт с Ajax для загрузки и удаления WP редакторов в колбэке успешного Ajax запроса.
Я все еще экспериментирую с доступными плагинами TinyMCE, смотрите документацию TinyMCE и учтите, что WP переименовал некоторые из них. Проверьте
wp-includes/js/tinymce/plugins
. В примере ниже я добавилfullscreen
, удобный плагин, который по умолчанию отключен.
var active_editors = [];
function ajax_succes_callback() {
remove_active_editors();
init_editors();
}
function remove_active_editors() {
$.each( active_editors, function( i, editor_id ) {
wp.editor.remove(editor_id);
}
active_editors = [];
}
function init_editors() {
$.each( $('.myprefix-wpeditor'), function( i, editor ) {
var editor_id = $(editor).attr('id');
wp.editor.initialize(
editor_id,
{
tinymce: {
wpautop: true,
plugins : 'charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview',
toolbar1: 'bold italic underline strikethrough | bullist numlist | blockquote hr wp_more | alignleft aligncenter alignright | link unlink | fullscreen | wp_adv',
toolbar2: 'formatselect alignjustify forecolor | pastetext removeformat charmap | outdent indent | undo redo | wp_help'
},
quicktags: true,
mediaButtons: true,
}
);
// Сохраняем id для последующего удаления
active_editors.push(editor_id);
});
}
4. Получаем содержимое каждого редактора с помощью:
function get_editor_content() {
// ПРИМЕЧАНИЕ: в моем приложении этот код находится внутри цикла полей
var editor_id = $(field).attr('id');
var mce_editor = tinymce.get(editor_id);
if(mce_editor) {
val = wp.editor.getContent(editor_id); // Активна вкладка "Визуально"
} else {
val = $('#'+editor_id).val(); // Активна вкладка "HTML"
}
}
Важные моменты:
- Используйте
wp.editor.initialize(editor_id_here)
на чистом<textarea>
, не используйтеwp_editor()
для HTML вывода. - Убедитесь, что удаляете редактор с помощью
wp.editor.remove(editor_id)
, если он больше не присутствует в DOM. Если этого не сделать, инициализация редактора завершится ошибкой при повторной динамической загрузке. - Получение содержимого редактора различается для каждой вкладки (Визуально / HTML)
ПРИМЕЧАНИЕ: Приведенные примеры кода не полностью протестированы и могут содержать ошибки. В моем приложении они работают. Это лишь отправная точка.

Спасибо, ваша информация требует доработки. Но в итоге успешно получилось с этим кодом.

Рад, что смог помочь. Думаю, у вас достаточно репутации, чтобы добавить улучшения через кнопку редактирования, и я смогу их проверить.

Сначала необходимо использовать wp_enqueue_editor();
для вывода скриптов, таблиц стилей и настроек по умолчанию редактора. Документацию можно найти здесь: wp_enqueue_editor()
Нужно удалить true из функции следующим образом: wp.editor.initialize(editorId);

tinymce.execCommand( 'mceAddEditor', true, element.id );
Это сработало для меня. Благодарю за ответ Goran Jakovljevic на: Как загрузить wp_editor через AJAX
