Cómo crear un editor de WP usando JavaScript
Estoy intentando crear algún tipo de campos repetidos y para eso, quiero crear un nuevo editor de wp con un ID único.
Así que mi pregunta es, ¿hay alguna forma de crear un wp_editor
usando JavaScript? Igual al que obtenemos con la función de WordPress <?php wp_editor() ?>
.
He intentado usar
tinyMCE .init( { mode : "exact" , elements : "accordion_icon_description_"+response.success.item_count });
pero muestra un editor muy básico que creo no es igual al editor de campos de contenido de WordPress

Gracias al comentario de Jacob Peattie puedo responder esto usando solo JS. En realidad hicimos algo similar, pero antes de la versión 4.8 y no era tan fácil, así que terminamos usando wp_editor()
al final. Pero ahora, puedes hacerlo usando el objeto wp.editor
en JavaScript. Hay 3 funciones principales
wp.editor.initialize = function( id, settings ) {
Donde id
es
El ID HTML del textarea que se usa para el editor. Debe ser compatible con jQuery. Sin corchetes, caracteres especiales, etc.
y settings
es un objeto
{
tinymce: {
// configuraciones de tinymce
},
quicktags: {
buttons: '..'
}
}
con estas configuraciones de TinyMCE. En lugar de cualquiera de los 3 objetos (settings
en sí, tinymce
o quicktags
) puedes usar true
para usar los valores por defecto.
wp.editor.remove = function( id ) {
Es bastante autoexplicativo. Elimina cualquier instancia de editor creada mediante wp.editor.initialize
.
wp.editor.getContent = function( id ) {
Bueno, obtiene el contenido de cualquier editor creado mediante wp.editor.initialize
.
El uso podría verse así
var countEditors = 0;
$(document).on('click', 'button#addEditor', function() {
var editorId = 'editor-' + countEditors;
// agregar editor en HTML como <textarea> con id editorId
// darle la clase wp-editor
wp.editor.initialize(editorId, true);
countEditors++;
});
$(document).on('click', 'button.removeEditor', function() {
// asumiendo que el editor está bajo el mismo padre
var editorId = $(this).parent().find('.wp-editor');
wp.editor.remove(editorId);
});
Como el contenido se publicará automáticamente, no es necesario en este ejemplo. Pero siempre podrías recuperarlo mediante wp.editor.getContent( editorId )

Verifiqué inicializando el editor con el ID del cuadro de texto wp.editor.initialize(editorId, true); pero no está funcionando.

¿El editor ya está en el DOM? ¿El ID es correcto? ¿Puedes compartir tu código JS (en un pastebin)?

Sí, el cuadro de texto está en un campo meta. Lo estoy verificando en document.ready y también comprobé ejecutando el código en la consola del navegador está devolviendo undefined para cada cuadro de texto, incluso para aquellos que son campos meta de post.

No puedo compartir todo el código porque no tendría sentido. Es parte de algo más grande.

Para tu información, mi código es wp.editor.initialize("accordion_icon_description_1", true);

@kero, también estoy teniendo este problema. ¿Puedes ayudarme con este issue? https://wordpress.stackexchange.com/questions/382108/editor-not-displaying-dynamically-after-clicking-on-the-button

WP 5.3.2
Actualmente construyendo un plugin con carga de páginas Ajax, necesitaba obtener datos de múltiples editores de WP que se cargan dinámicamente.
NOTA: El siguiente ejemplo es para el área de wp-admin, si deseas esto para el front-end puede que necesites extenderlo.
1. Asegúrate de que los scripts del editor estén cargados con:
add_action( 'admin_enqueue_scripts', 'load_admin_scripts');
function load_admin_scripts() {
// NO lo cargues en cada página de admin, crea alguna lógica para cargarlo solo en tus páginas
wp_enqueue_editor();
}
2. Obtén el textarea del editor con Ajax (PHP):
function your_ajax_get_editor_callback() {
// Nota: cada editor necesita su propio nombre e id únicos
return '<textarea name="my-wp-editor" id="my-wp-editor" rows="12" class="myprefix-wpeditor">El valor desde la base de datos aquí :-)</textarea>';
}
3. Usa un script JS con Ajax para cargar y eliminar los editores de WP en la devolución de llamada exitosa de Ajax.
Todavía estoy experimentando con todos los plugins disponibles de tinymce, consulta la documentación de TinyMCE y ten en cuenta que WP ha renombrado algunos de ellos. Revisa
wp-includes/js/tinymce/plugins
. En el ejemplo de abajo he añadidofullscreen
, un práctico plugin que está desactivado por defecto.
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,
}
);
// Guarda el id para eliminarlo más tarde
active_editors.push(editor_id);
});
}
4. Obtén el contenido de cada editor con:
function get_editor_content() {
// NOTA: en mi aplicación el código de abajo está dentro de una iteración de campos (bucle)
var editor_id = $(field).attr('id');
var mce_editor = tinymce.get(editor_id);
if(mce_editor) {
val = wp.editor.getContent(editor_id); // La pestaña Visual está activa
} else {
val = $('#'+editor_id).val(); // La pestaña HTML está activa
}
}
Puntos clave:
- Usa
wp.editor.initialize(editor_id_here)
en un<textarea>
limpio, no useswp_editor()
para la salida HTML. - Asegúrate de eliminar el editor con
wp.editor.remove(editor_id)
si ya no está presente en el DOM. Si no haces esto, la inicialización del editor fallará cuando cargues el editor (dinámicamente) por segunda vez. - Obtener el contenido del editor es diferente para cada pestaña (Visual / HTML)
NOTA: Los ejemplos de código anteriores no están completamente probados y pueden contener algunos errores. Los tengo funcionando completamente en mi aplicación. Es puramente para orientarte.

Gracias, tu información necesita mejora. Pero finalmente tuve éxito con este código.

Me alegra haber podido ayudar. Creo que tienes suficiente reputación para agregar las mejoras haciendo clic en editar para que pueda revisarlas.

Necesitas usar primero wp_enqueue_editor();
para cargar los scripts del editor, hojas de estilo y configuraciones predeterminadas. Puedes encontrar esto documentado aquí wp_enqueue_editor()
Necesitas eliminar true de la función así: wp.editor.initialize(editorId);

tinymce.execCommand( 'mceAddEditor', true, element.id );
Esto funcionó para mí. Gracias a la respuesta de Goran Jakovljevic en: Cómo cargar wp_editor mediante AJAX
