¿Cómo obtener el contenido de un editor TinyMCE cuando se usa en el front-end?

17 feb 2012, 08:40:30
Vistas: 36.2K
Votos: 8

No estoy seguro por qué no he podido encontrar esto, pero ¿alguien sabe cómo obtener el contenido del editor TinyMCE? Lo estoy usando en el front-end y quiero poder guardar en una base de datos lo que el usuario haya escrito en el TinyMCE, pero no puedo encontrar la mejor manera de capturar ese valor.

Las dos soluciones que he implementado con cierto éxito son:

  1. tinyMCE.activeEditor.getContent(); - Esta parece obtener solo el valor del editor visual, por lo que si estoy en el editor HTML y hago cambios y luego guardo, estos no son detectados.

  2. $('#html_text_area_id').val(); - Esta es lo opuesto, solo parece obtener el valor del editor HTML.

Sé que hay una mejor manera - simplemente no puedo encontrarla...

PD: Sí, voy a implementar medidas de seguridad para asegurarme de que las personas no puedan dañar la base de datos.

2
Comentarios

Cuando inicializas tinyMCE, normalmente lo enlazas a un textarea, así que simplemente usa el ID de ese textarea con el método val() de jQuery

Bainternet Bainternet
17 feb 2012 09:32:41

Sí, ya lo intenté pero solo obtiene el valor del editor HTML. Si estoy en el editor visual, hago cambios e intento guardar, los cambios que hice en el editor visual no se guardan.

Sam Sam
17 feb 2012 22:49:19
Todas las respuestas a la pregunta 6
6
23

Al parecer, WordPress lleva un registro del tipo de editor (visual o HTML) que está activo como una clase que se añade al contenedor del contenido, así que aquí tienes una solución que te dará el contenido más reciente en el editor

function get_tinymce_content(){
    if (jQuery("#wp-content-wrap").hasClass("tmce-active")){
        return tinyMCE.activeEditor.getContent();
    }else{
        return jQuery('#html_text_area_id').val();
    }
}
17 feb 2012 23:12:30
Comentarios

Mmm, idea interesante. Voy a probarlo y reportaré los resultados. ¡Gracias!

Sam Sam
18 feb 2012 01:48:55

Funcionó perfectamente. ¡Gracias por tu ayuda! Si tuviera suficiente reputación, votaría a favor.

Sam Sam
18 feb 2012 19:27:56

Me alegra que te haya funcionado, y puedes aceptar la respuesta como la correcta, eso será suficiente :)

Bainternet Bainternet
18 feb 2012 20:09:25

Me tomó mucho tiempo encontrar una respuesta para esto. También necesitaba una forma de establecer el contenido. En caso de que alguien más también necesite una forma de establecer el contenido, aquí hay un Gist de ambas funciones (get/set): https://gist.github.com/RadGH/523bed274f307830752c. Esto también funciona con IDs personalizados de wp_editor, no solo con el predeterminado.

Radley Sustaire Radley Sustaire
17 jul 2014 21:46:21

Mucha ayuda para mí también ;)

Vignesh Pichamani Vignesh Pichamani
15 oct 2014 14:37:55

Esto no funcionó para mí. Sin embargo, me dio una idea de cómo quizás se puede lograr. En una respuesta separada, usé el concepto de esta respuesta para identificar qué pestaña es la activa pero usando el color de fondo como identificador.

Abel Melquiades Callejo Abel Melquiades Callejo
15 dic 2015 22:43:29
Mostrar los 1 comentarios restantes
0

Ese es el código que agregué a mi javascript, justo antes de enviar el formulario.

// Encuentra y recorre todos los editores TinyMCE.
jQuery('#the-form').find( '.wp-editor-area' ).each(function() {
    var id = jQuery( this ).attr( 'id' ),
        sel = '#wp-' + id + '-wrap',
        container = jQuery( sel ),
        editor = tinyMCE.get( id );

    // Si el editor está en modo "visual" entonces debemos hacer algo.
    if ( editor && container.hasClass( 'tmce-active' ) ) {
        // Guarda el contenido del editor en el textarea:
        editor.save();
    }
});
2 ago 2014 17:54:35
1

Esto funcionó para mí:

if (jQuery("#wp-description-wrap").hasClass("tmce-active")){
    description1 = tinyMCE.activeEditor.getContent( { format : 'html' } );
}else{
    description1 = jQuery('[name="description"]').val();

Donde description es el ID del editor tinymce y el código después del else de la respuesta aceptada no funcionó para mí.

23 mar 2017 08:21:44
Comentarios

Por favor, explica, ¿en qué se diferencia de la respuesta aceptada? ¿Qué información nueva estás proporcionando?

Fayaz Fayaz
23 mar 2017 09:28:59
0

Necesité mucho más código para que funcionara, y también estaba recibiendo un error de JavaScript: Llamada API TinyMCE obsoleta: <target>.onKeyUp.add(..) Esto fue causado por una actualización de WordPress de la versión 3.x a la 4. Así que primero tuve que limpiar la caché de mi navegador.

Primero agregué un callback al filtro de WordPress tiny_mce_before_init en mi archivo functions.php, lo cual me permitió añadir una función de callback en JavaScript que se ejecutaría cuando los editores se inicializaran:

add_filter( 'tiny_mce_before_init', array( $obj, 'filter_cb_mce_before_init' ) );

/**
 * Callback del filtro para añadir escuchas de eventos al editor TinyMCE.
 * @param  array $init Un arreglo de funciones de configuración de JavaScript como cadenas.
 * @return array       Devuelve un nuevo arreglo de cadenas de funciones de JavaScript.
 */
function filter_cb_mce_before_init( array $init ) {
        $init['setup'] = "function(ed){
                if(get_tinymce_content)  //no requerido, lo uso como bandera para verificar si estoy en la página correcta
                    ed.on('change', function(){ get_tinymce_content() });
            }";
        return $init;
    }

A continuación, la función de JavaScript para hacer lo que se desee con el contenido cuando cambie. Añade este JavaScript usando wp_enqueue_scripts a la página que desees.

  /**
   * Obtiene el contenido del editor TinyMCE.
   * @link http://wordpress.stackexchange.com/questions/42652/how-to-get-the-input-of-a-tinymce-editor-when-using-on-the-front-end
   * @return {string} Devuelve el contenido
   */
  function get_tinymce_content(){

    //cambiar al nombre del editor configurado en wp_editor()
    var editorID = 'my_editor_id';

    if (jQuery('#wp-'+editorID+'-wrap').hasClass("tmce-active"))
        var content = tinyMCE.get(editorID).getContent({format : 'raw'});
    else
        var content = jQuery('#'+editorID).val();

    console.log(content);
}

El código funcionó cuando usé lo siguiente para imprimir el editor en cualquier página:

<?php wp_editor( @$event->description, 'my_editor_id', array(
    'media_buttons' => false,
    'textarea_name' => 'data[description]',
    'quicktags'     => array("buttons"=>"link,img,close"),
) ); ?>
5 ene 2015 07:44:19
0

Puedes obtener el contenido dependiendo del modo actual del editor.

function get_tinymce_content()
    {
    if (jQuery(".switch-tmce").css('background-color')=='rgb(245, 245, 245)')
        return tinyMCE.activeEditor.getContent();
    else
        return jQuery('#html_text_area_id').val();
    }

La pestaña Visual tiene una clase switch-tmce que puedes usar para identificarla como una pestaña. Sabrás que está enfocada si tiene el color de fondo más claro. Por lo tanto, también puedes usar eso para determinar cuál de las dos pestañas está activa.

Esta es una solución adaptativa basada en la respuesta de Bainternet. Probablemente hay otras formas mejores de hacerlo, pero esta funcionó bien para mí.

15 dic 2015 22:37:00
0

También puedes usar el evento addeditor:

  /// Se dispara cuando se añade un editor a la colección EditorManager.
  tinymce.on('addeditor', function( event ) {
    var editor = event.editor;
    var $textarea = $('#' + editor.id);
    console.log($textarea.val());
  }, true );

Documentación del evento 'addeditor' de TinyMCE

15 nov 2016 19:16:25