Как создать WP Editor с помощью JavaScript

25 июл. 2017 г., 17:47:53
Просмотры: 15K
Голосов: 4

Я пытаюсь создать повторяющиеся поля и для этого мне нужно создать новый редактор wp editor с уникальным ID.

Мой вопрос: есть ли способ создать wp_editor используя JavaScript, аналогично тому, как мы получаем его с помощью функции WordPress <?php wp_editor() ?>.

Я пробовал использовать:

tinyMCE.init({ 
  mode: "exact", 
  elements: "accordion_icon_description_"+response.success.item_count 
});

но это создает очень базовый редактор, который, как я понимаю, не такой, как редактор контента в WordPress.

1
Комментарии

В версии 4.8 появился способ сделать это: https://make.wordpress.org/core/2017/05/20/editor-api-changes-in-4-8/ Я не добавляю ничего нового, поэтому не буду публиковать это как ответ, но, возможно, кто-то с примерами сможет.

Jacob Peattie Jacob Peattie
25 июл. 2017 г. 17:55:49
Все ответы на вопрос 4
6

Благодаря комментарию Джейкоба Питти, я могу ответить на этот вопрос, используя только JavaScript. На самом деле, мы делали что-то подобное, но до версии 4.8 это было не так просто, поэтому в итоге мы использовали wp_editor(). Но теперь вы можете сделать это с помощью объекта wp.editor в JavaScript. Есть 3 основные функции:

  1. wp.editor.initialize = function( id, settings ) {

Где id — это

HTML-идентификатор текстового поля, используемого для редактора. Должен соответствовать требованиям jQuery. Никаких скобок, специальных символов и т.д.

и settings — это либо объект

{
    tinymce: {
        // настройки TinyMCE
    },
    quicktags: {
        buttons: '..'
    }
}

с этими настройками TinyMCE. Вместо любого из 3 объектов (settings, tinymce или quicktags) можно использовать true, чтобы применить значения по умолчанию.

  1. wp.editor.remove = function( id ) {

Довольно очевидно. Удаляет любой экземпляр редактора, созданный через wp.editor.initialize.

  1. 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 ).

25 июл. 2017 г. 18:37:41
Комментарии

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

1naveengiri 1naveengiri
25 июл. 2017 г. 18:55:35

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

kero kero
25 июл. 2017 г. 19:03:56

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

1naveengiri 1naveengiri
25 июл. 2017 г. 19:10:13

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

1naveengiri 1naveengiri
25 июл. 2017 г. 19:11:27

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

1naveengiri 1naveengiri
25 июл. 2017 г. 19:12:49

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

Naren Verma Naren Verma
25 янв. 2021 г. 17:20:08
Показать остальные 1 комментариев
3

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)

ПРИМЕЧАНИЕ: Приведенные примеры кода не полностью протестированы и могут содержать ошибки. В моем приложении они работают. Это лишь отправная точка.

20 дек. 2019 г. 02:34:49
Комментарии

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

Ravi Patel Ravi Patel
7 авг. 2020 г. 04:48:34

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

Bjorn Bjorn
13 авг. 2020 г. 14:28:28

Удаление ранее инициализированного редактора с помощью wp.editor.remove(editor_id) было ключевым моментом для работоспособности в моем случае, спасибо

Tamik Soziev Tamik Soziev
2 нояб. 2022 г. 23:16:48
0

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

Нужно удалить true из функции следующим образом: wp.editor.initialize(editorId);

20 сент. 2017 г. 09:30:21
1
tinymce.execCommand( 'mceAddEditor', true, element.id );

Это сработало для меня. Благодарю за ответ Goran Jakovljevic на: Как загрузить wp_editor через AJAX

7 апр. 2022 г. 20:30:34
Комментарии

Есть ли способ загрузить Gutenberg вместо TinyMCE?

doraemon doraemon
1 мар. 2023 г. 14:43:41