¿Cómo obtener el contenido de un editor TinyMCE cuando se usa en el front-end?
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:
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.$('#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.
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();
}
}

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

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

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

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.

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.

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();
}
});

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í.

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"),
) ); ?>

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í.

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 );
