Cómo crear un editor de WP usando JavaScript

25 jul 2017, 17:47:53
Vistas: 15K
Votos: 4

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

1
Comentarios

La versión 4.8 introdujo una forma de hacer esto: https://make.wordpress.org/core/2017/05/20/editor-api-changes-in-4-8/ No estoy agregando nada, así que no lo publicaré como respuesta, pero quizás alguien con algunos ejemplos pueda hacerlo.

Jacob Peattie Jacob Peattie
25 jul 2017 17:55:49
Todas las respuestas a la pregunta 4
6

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

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

  1. wp.editor.remove = function( id ) {

Es bastante autoexplicativo. Elimina cualquier instancia de editor creada mediante wp.editor.initialize.

  1. 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 )

25 jul 2017 18:37:41
Comentarios

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

1naveengiri 1naveengiri
25 jul 2017 18:55:35

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

kero kero
25 jul 2017 19:03:56

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.

1naveengiri 1naveengiri
25 jul 2017 19:10:13

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

1naveengiri 1naveengiri
25 jul 2017 19:11:27

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

1naveengiri 1naveengiri
25 jul 2017 19:12:49

@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

Naren Verma Naren Verma
25 ene 2021 17:20:08
Mostrar los 1 comentarios restantes
3

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ñadido fullscreen, 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 uses wp_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.

20 dic 2019 02:34:49
Comentarios

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

Ravi Patel Ravi Patel
7 ago 2020 04:48:34

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

Bjorn Bjorn
13 ago 2020 14:28:28

Eliminar el editor previamente inicializado con wp.editor.remove(editor_id) fue crucial para que funcionara en mi caso, gracias

Tamik Soziev Tamik Soziev
2 nov 2022 23:16:48
0

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

20 sept 2017 09:30:21
1
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

7 abr 2022 20:30:34
Comentarios

¿Hay alguna forma de cargar Gutenberg en lugar de Tinymce?

doraemon doraemon
1 mar 2023 14:43:41