Как загрузить wp_editor() через AJAX/jQuery

10 мая 2012 г., 18:30:59
Просмотры: 26.2K
Голосов: 25

У меня есть тема, которая разработана на заказ и довольно сложная. Одна из особенностей - несколько областей контента, где пользователи могут указывать содержимое для определенных вкладок. Я загружаю несколько экземпляров редактора WordPress через функцию wp_editor(). Это работает отлично. (Всё это находится в административной части, в типе записи "Страница")

Однако я начал вносить некоторые улучшения, включая возможность динамически добавлять/удалять вкладки (раньше я загружал 6 редакторов на странице). Пользователи могут иметь от 1 до 7 вкладок.

Когда пользователи добавляют вкладку, нужно добавить экземпляр редактора на страницу. Однако, что бы я ни пробовал, я не могу заставить его загружаться и отображаться правильно.

Вот 2 способа, которые я уже попробовал:

  1. Создание PHP файла, включающего административный bootstrap, и затем загрузка редактора с помощью wp_editor(). Затем я использую jQuery $.load для вызова страницы и включения полученного HTML в область, где он должен отображаться. Однако это не совсем работает, так как кнопки форматирования редактора исчезают (стоит отметить, что при прямом открытии страницы редактор отображается и функционирует идеально)
  2. Загрузка редактора на странице внутри скрытого div, и после добавления вкладки использование jQuery для перемещения его на место. Это загружает редактор в целости, но нельзя использовать кнопки редактора (они отображаются, но не работают), и нельзя установить курсор в текстовую область (любопытно, однако, что переключение в режим HTML позволяет печатать и взаимодействовать с кнопками режима HTML)

Итак, вопрос: у кого-нибудь получилось добавлять редакторы через AJAX-вызовы? Есть какие-нибудь советы?

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

Вы пробовали делать AJAX-запрос через admin-ajax.php? Если нет, создайте функцию с вашим кодом, а затем вызовите её через admin-ajax.php

Sisir Sisir
10 мая 2012 г. 18:56:02

Помогает ли это предложение? Если да, то это не вопрос по WordPress. :)

fuxia fuxia
10 мая 2012 г. 19:52:57

@Sisir, Если я правильно понимаю ваше предложение, то оно не сработало. Я использовал это для вызова Ajax-формы: $('#sph-tabs-section-tab'+newTab).load('/wp-admin/admin-ajax.php?action=sph_add_editor');, а затем добавил функцию, которая возвращает wp_editor(). Вызов происходит без проблем, но по-прежнему возвращается редактор без кнопок. (точно такой же результат, как в пункте 1 оригинального вопроса)

Aaron Wagner Aaron Wagner
10 мая 2012 г. 20:44:26

После инициализации TinyMCE нельзя перемещать в DOM. Необходимо сначала удалить его, переместить в DOM и снова инициализировать. Похожий код, но для фронтенд-комментариев в моем блоге: http://www.techytalk.info/add-tinymce-quicktags-visual-editors-wordpress-comments-form/ Форма комментариев перемещается, когда пользователь нажимает "ответить" или "отменить ответ".

User User
6 сент. 2012 г. 01:46:12
Все ответы на вопрос 8
0

Чтобы отобразить быстрые теги (quicktags), необходимо заново инициализировать их в обработчике oncomplete вашего ajax-запроса.

quicktags({id : 'editorcontentid'});

Мой обработчик успешного выполнения ajax выглядит так:

success: function(data, textStatus, XMLHttpRequest){
            // добавляем редактор в DOM
            $('#container').append($(data).html());
            // инициализируем quicktags
            quicktags({id : 'editorcontentid'});
            // инициализируем tinymce
            tinymce.init(tinyMCEPreInit.mceInit['editorcontentid']);
        }

Мне удалось загрузить редактор, сначала вызвав статическую функцию, которая создает редактор и кэширует его как переменную. Я запускаю метод создания редактора при инициализации. Это, кажется, заставляет WordPress подключить все необходимые скрипты.

Важно, чтобы при создании экземпляра редактора вы указали использовать tinymce, таким образом файл tinymce.js также будет подключен.

4 окт. 2012 г. 06:11:21
2

После долгих мучений нашел работающее решение, которое нужно вызывать в колбэке после добавления нового элемента:

tinymce.execCommand( 'mceAddEditor', true, element.id );

Странно, что в кодексе вообще нет документации по этому поводу.

5 апр. 2016 г. 10:08:01
Комментарии

tinymce — это внешний ресурс, поэтому они могут считать, что документация самого tinymce покрывает этот вопрос — https://www.tinymce.com/docs/ — но там довольно мало примеров... Также вы обязательно должны включить скрипты tinymce, чтобы этот ответ работал! (самый простой способ — вывести фиктивный PHP wp_editor() с аргументом tinymce, установленным в true :-)

jave.web jave.web
20 апр. 2016 г. 23:34:59

спасибо, друг... у меня тоже сработало — после возврата данных из ajax я просто инициализировал это... ;)

Sagive Sagive
2 июл. 2019 г. 11:55:00
0

Наконец, рабочее решение:

Добавляем действие в WordPress, например My_Action_Name (обратите внимание также на ID textarea My_TextAreaID_22):

add_action('wp_ajax_My_Action_Name', function(){
    wp_editor( $_POST['default_text'], 'My_TextAreaID_22',      $settings = array( 'tinymce'=>true, 'textarea_name'=>'name77', 'wpautop' =>false,   'media_buttons' => true ,   'teeny' => false, 'quicktags'=>true, )   );    exit;
});

Теперь в админ-панели выполняем эту функцию (обратите внимание на использование My_TextAreaID_22 и My_Action_Name):

function start_Ajax_request() { 
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Получаем стандартные настройки WordPress (не могу подтвердить, но если нужно изменить целевой ID, добавьте эту строку:  My_New_Global_Settings.selector = "My_TextAreaID_22";   )
    jQuery.post(ajaxurl,
        { action: "My_Action_Name",     default_text: "Hello World"}, 
        function(response,status){ 
            tinymce.init(My_New_Global_Settings); 
            tinyMCE.execCommand('mceAddEditor', false, "My_TextAreaID_22"); 
            quicktags({id : "My_TextAreaID_22"});
            // tinyMCE.execCommand( 'mceAddEditor', true, element.id );
        }
    );

}   
start_Ajax_request();     // < ---- ВЫПОЛНЯЕМ
20 июн. 2015 г. 22:36:37
2

Вам нужно снова вызвать инициализацию редактора после добавления текстового поля через ajax. Я сделал это следующим образом:

$.fn.tinymce_textareas = function(){
  tinyMCE.init({
    skin : "wp_theme"
    // другие параметры здесь
  });
};

Затем вызовите вашу функцию после ajax-запроса, вот так:

$('#my_new_textarea_container').html(response).tinymce_textareas();
20 мая 2012 г. 20:55:49
Комментарии

Пожалуйста, объясните, как это работает? Это не работает. Я пробовал.

Ahmed Fouad Ahmed Fouad
18 июл. 2012 г. 21:09:50

После добавления ajax-контента, содержащего текстовую область textarea, на которую я хочу применить tinyMCE (response), вызовите функцию tinymce_textareas, которая инициализирует tinyMCE для новых текстовых областей.

Steven Steven
18 июл. 2013 г. 13:46:54
1

Готовое решение от @toscho на github. Он также создал этот отличный результат в ответ на вопрос здесь, подробности смотрите в его ответе.

17 февр. 2014 г. 10:53:01
Комментарии

Для этого требуется библиотека T5 ... это не решение, предназначенное только для WP

random_user_name random_user_name
17 янв. 2015 г. 02:57:54
0

Я реализовал это следующим образом:

  1. Сначала необходимо вызвать wp_editor на главной странице, откуда будет выполняться ajax-запрос. Но его нужно обернуть в скрытый div:

    <div style="display:none">
    <?php
    wp_editor( '', 'unique_id', array(
        'media_buttons' => false,
        'textarea_rows' => 10,
        'teeny' => true,
    ) );
    ?>
    </div>

ID должен быть случайным и уникальным. Настройки должны совпадать с настройками в вашем ajax-редакторе.

  1. Во-вторых, это нужно вызвать в ajax-ответе:

wp_editor( '', '[установите нужный id]', array(те же настройки, что и на главной странице) ); _WP_Editors::editor_js(); //это выводит код инициализации редактора

11 окт. 2016 г. 13:11:05
0

Это будет работать на страницах админки.

Чтобы добавить новый редактор wp editor в контейнер через JS AJAX:

1) Создайте wp_ajax функцию в functions.php, которая будет возвращать wp_editor

2) Создайте jQuery скрипт для запроса нового текстового редактора и добавления его в контейнер, в данном случае при нажатии кнопки

PHP файл

function yourprefix_get_text_editor() {
    $content = ""; // Пусто, так как это новый редактор
    $editor_id = $_POST["text_editor_id"]; // Случайный ID из AJAX вызова JS
    $textarea_name = $_POST["textarea_name"]; // Имя из JS файла
    $settings = array(
        'textarea_name' => $textarea_name
    );
    wp_editor($content, $editor_id, $settings);
    wp_die(); // Обязательный wp_die
}
add_action('wp_ajax_yourprefix_get_text_editor', 'yourprefix_get_text_editor');

JS скрипт (jsfile.js)

jQuery(function($) {
$("someelement").click(function(e) { // Добавление редактора по клику кнопки
    var target = themeajax.ajax_url; // Передается из wp_localize_script
    var editor_id = "editorid"; // Генерируйте это динамически
    var textarea_name = "textareaname" // Генерируйте по необходимости
    var data = {
        'action': 'yourprefix_get_text_editor',
        'text_editor_id': editor_id,
        'textarea_name': textarea_name
    }
    $.post(target, data, function(response) {
        container.append(response); // Используйте свою логику для получения контейнера, куда нужно добавить редактор
        tinymce.execCommand('mceAddEditor', false, editor_id);
        quicktags({id : editor_id});
    });
}
});

Подключение скриптов:

function yourprefix_admin_scripts($hook) {
    wp_enqueue_script('your-slug', get_stylesheet_directory_uri() . '/path/to/jsfile.js', array('jquery'), null, true);
    wp_localize_script('your-slug', 'themeajax', array(
        'ajax_url' => admin_url('admin-ajax.php')
    ));
}
add_action('admin_enqueue_scripts', 'yourprefix_admin_scripts');
8 мар. 2018 г. 23:46:54
3
-2

Используйте этот код, надеюсь, он поможет:

wp_editor( '', 'custom_editor_id' );
\_WP_Editors::enqueue_scripts();
print_footer_scripts();
\_WP_Editors::editor_js();

Подробнее можно узнать здесь.

15 апр. 2015 г. 02:15:54
Комментарии

Пожалуйста, поделитесь сутью того, как этот код может помочь, а затем добавьте ссылку для получения дополнительной информации. Ответы, содержащие только ссылки, становятся недействительными, если ссылка не работает - надеюсь, вы понимаете. :)

Mayeenul Islam Mayeenul Islam
15 апр. 2015 г. 06:34:34

Эта ссылка сейчас не работает, и у меня нет никакого контекста для ответа. (Одна из многих причин, почему ответы "просто со ссылкой" плохи)

Sudar Sudar
6 июл. 2015 г. 19:51:52

Это работает, но есть некоторые проблемы: при переключении между визуальным и текстовым редактором создаются дублирующиеся текстовые области внутри редактора

Drmzindec Drmzindec
28 июл. 2017 г. 17:14:21