Cómo cargar wp_editor() a través de AJAX/jQuery

10 may 2012, 18:30:59
Vistas: 26.2K
Votos: 25

Tengo un tema desarrollado a medida que es realmente complejo. Una de las funcionalidades que tiene son múltiples áreas de contenido donde los usuarios pueden especificar contenido para pestañas específicas. Cargo múltiples instancias del editor de WordPress a través de la función wp_editor(). Funciona perfectamente. (Todo esto en el lado de administración, en el tipo de post "Page")

Sin embargo, comencé a hacer algunas mejoras, incluyendo la capacidad de agregar/eliminar pestañas dinámicamente (antes, cargaba 6 editores en la página). Los usuarios pueden tener de 1 a 7 pestañas.

Cuando los usuarios agregan una pestaña, necesita añadir una instancia del editor a la página. Sin embargo, sin importar lo que intente, no puedo hacer que se cargue y se muestre correctamente.

Aquí están las 2 cosas que he intentado hasta ahora:

  1. Crear un archivo php que tiene incluido el bootstrap de administración, y luego cargar el editor con wp_editor(). Después hago un $.load con jQuery para llamar a la página e incluir el HTML resultante en el área donde necesita mostrarse. Sin embargo, esto no funciona realmente, ya que los botones de formato del editor desaparecen (vale la pena mencionar que al cargar la página directamente, el editor se muestra y funciona perfectamente)
  2. Cargar el editor en la página, dentro de un div oculto, y luego una vez que se agrega una pestaña, usar jQuery para moverlo a su lugar. Esto carga el editor intacto, pero no se pueden usar ninguno de los botones del editor (se muestran, pero no hacen nada), y no puedes poner el cursor en el área de texto (curiosamente, cambiar al modo HTML permite escribir y alguna interacción con los botones del modo HTML)

Entonces la pregunta es, ¿alguien ha tenido éxito agregando editores a través de llamadas AJAX? ¿Algún consejo?

4
Comentarios

¿Intentaste hacer una llamada AJAX a través de admin-ajax.php? Si no, crea una función con tu código y luego llámala mediante admin-ajax.php

Sisir Sisir
10 may 2012 18:56:02

¿Te ayuda esta sugerencia? Si es así, no es una pregunta sobre WordPress. :)

fuxia fuxia
10 may 2012 19:52:57

@Sisir, si estoy leyendo correctamente tu sugerencia, entonces no funcionó. Usé esto para llamar al formulario AJAX: $('#sph-tabs-section-tab'+newTab).load('/wp-admin/admin-ajax.php?action=sph_add_editor'); y luego agregué una función que devuelve wp_editor(). Se llama sin problemas, pero aún solo devuelve el editor sin botones. (exactamente los mismos resultados que el punto 1 en la publicación original)

Aaron Wagner Aaron Wagner
10 may 2012 20:44:26

Una vez inicializado, TinyMCE no puede ser movido en el DOM. Debes eliminarlo, moverlo en el DOM y volver a inicializarlo. Código similar pero para comentarios en el frontend aquí en mi blog: http://www.techytalk.info/add-tinymce-quicktags-visual-editors-wordpress-comments-form/ El formulario de comentarios se mueve cuando el usuario hace clic en responder/cancelar respuesta.

User User
6 sept 2012 01:46:12
Todas las respuestas a la pregunta 8
0

Para que aparezcan los quicktags, necesitas reinstanciarlos dentro de tu manejador oncomplete de ajax.

quicktags({id : 'editorcontentid'});

Mi manejador de éxito de ajax se ve así:

success: function(data, textStatus, XMLHttpRequest){
            //añadir editor al DOM
            $('#container').append($(data).html());
            //inicializar quicktags
            quicktags({id : 'editorcontentid'});
            //inicializar tinymce
            tinymce.init(tinyMCEPreInit.mceInit['editorcontentid']);
        }

He logrado cargar el editor llamando primero a una función estática que crea el editor y lo guarda en caché como variable. Ejecuto el método de creación del editor al inicializar. Esto parece hacer que WordPress encole todos los scripts necesarios.

Es importante que cuando crees tu instancia de editor, la configures para usar tinymce, de esa manera el archivo js de tinymce también se encola.

4 oct 2012 06:11:21
2

Después de luchar con ello, encontré la solución que funciona, en un callback después de agregar un nuevo elemento:

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

Es extraño que no haya absolutamente ninguna documentación dentro del codex.

5 abr 2016 10:08:01
Comentarios

tinymce es un recurso externo, así que creo que podrían pensar que la propia documentación de tinymce lo cubre - https://www.tinymce.com/docs/ - pero bastante pobre en ejemplos... ¡También debes incluir los scripts de tinymce para que esta respuesta funcione! (la forma más simple es generar un editor PHP ficticio con wp_editor() usando el argumento tinymce establecido en true :-)

jave.web jave.web
20 abr 2016 23:34:59

gracias compañero... esto también funciona para mí - después de devolver los datos de ajax simplemente inicializo eso... ;)

Sagive Sagive
2 jul 2019 11:55:00
0

Solución final funcional:

Añadir una acción en WordPress, por ejemplo My_Action_Name (también nota el ID del 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;
});

Ahora, en el panel de administración, ejecutar esta función (nota el uso de My_TextAreaID_22 y My_Action_Name):

function start_Ajax_request() { 
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Obtener CONFIGURACIONES por defecto de WordPress (no puedo confirmar, pero si necesitas cambiar el ID objetivo, añade esta línea:  My_New_Global_Settings.selector = "My_TextAreaID_22";   )
    jQuery.post(ajaxurl,
        { action: "My_Action_Name",     default_text: "Hola Mundo"}, 
        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();     // < ---- EJECUTAR
20 jun 2015 22:36:37
2

Necesitas llamar nuevamente la inicialización del editor después de añadir tu área de texto AJAX, lo hice así:

$.fn.tinymce_textareas = function(){
  tinyMCE.init({
    skin : "wp_theme"
    // otras opciones aquí
  });
};

Luego llama a tu función después de tu AJAX, así:

$('#my_new_textarea_container').html(response).tinymce_textareas();
20 may 2012 20:55:49
Comentarios

Por favor, explica ¿cómo funciona esto? Esto no funciona. Lo he intentado.

Ahmed Fouad Ahmed Fouad
18 jul 2012 21:09:50

Después de agregar el contenido AJAX que contiene el textarea donde quiero tinyMCE (response), llama a la función tinymce_textareas que inicializa tinyMCE en los nuevos textareas.

Steven Steven
18 jul 2013 13:46:54
1

La solución utilizable de @toscho en github. Él construyó este buen resultado también para una pregunta aquí, consulta su respuesta para más detalles.

17 feb 2014 10:53:01
Comentarios

Esto requiere una biblioteca para su uso - T5 ... no es una solución exclusiva de WP

random_user_name random_user_name
17 ene 2015 02:57:54
0

Lo solucioné de la siguiente manera:

  1. Primero necesitas llamar a wp_editor en la página principal, desde donde llamas al ajax. Pero debes envolverlo en un div oculto:

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

El ID debe ser aleatorio y único. Los ajustes deben ser los mismos que los ajustes en tu editor ajax.

  1. Segundo, necesitas llamar esto en la respuesta ajax:

wp_editor( '', '[establece el id como necesites]', array(los mismos ajustes que en la página principal) ); _WP_Editors::editor_js(); //esto imprime el código de inicialización del editor

11 oct 2016 13:11:05
0

Esto funcionará en las páginas de administración.

Para agregar un nuevo editor wp a un contenedor mediante JS AJAX:

1) Crear una función wp_ajax en functions.php para devolver el wp_editor

2) Crear un script jQuery para solicitar un nuevo editor de texto y agregarlo a un contenedor, para este caso, al presionar un botón

Archivo PHP

function yourprefix_get_text_editor() {
    $content = ""; // Vacío porque es un nuevo editor
    $editor_id = $_POST["text_editor_id"]; // ID aleatorio desde la llamada AJAX JS
    $textarea_name = $_POST["textarea_name"]; // Nombre desde el archivo JS
    $settings = array(
        'textarea_name' => $textarea_name
    );
    wp_editor($content, $editor_id, $settings);
    wp_die(); // Obligatorio wp_die
}
add_action('wp_ajax_yourprefix_get_text_editor', 'yourprefix_get_text_editor');

Script JS (jsfile.js)

jQuery(function($) {
$("someelement").click(function(e) { // Para agregar un editor al hacer clic en un botón
    var target = themeajax.ajax_url; // Pasado desde wp_localize_script
    var editor_id = "editorid"; // Generar esto dinámicamente
    var textarea_name = "textareaname" // Generar esto según lo necesites
    var data = {
        'action': 'yourprefix_get_text_editor',
        'text_editor_id': editor_id,
        'textarea_name': textarea_name
    }
    $.post(target, data, function(response) {
        container.append(response); // Usa tu lógica para obtener el contenedor donde quieres agregar el editor
        tinymce.execCommand('mceAddEditor', false, editor_id);
        quicktags({id : editor_id});
    });
}
});

Llamada para encolar scripts:

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 mar 2018 23:46:54
3
-2

Usa este código, espero que te ayude:

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

Más detalles se pueden encontrar aquí.

15 abr 2015 02:15:54
Comentarios

Por favor comparte un resumen de cómo este código puede ayudar, y luego añade el enlace para más detalles. Las respuestas que solo contienen enlaces se vuelven inválidas si el enlace se rompe - espero que lo entiendas. :)

Mayeenul Islam Mayeenul Islam
15 abr 2015 06:34:34

Ese enlace está roto ahora mismo y no tengo ningún contexto detrás de la respuesta. (Una de las muchas razones por las que las respuestas que son "solo un enlace" son malas)

Sudar Sudar
6 jul 2015 19:51:52

Esto funciona pero tiene algunos problemas, cuando seleccionas texto o visual crea áreas de texto duplicadas dentro del editor

Drmzindec Drmzindec
28 jul 2017 17:14:21