Come creare un editor WP utilizzando JavaScript

25 lug 2017, 17:47:53
Visualizzazioni: 15K
Voti: 4

Sto cercando di creare dei campi ripetuti e per questo vorrei creare un nuovo editor WP con un ID univoco.

La mia domanda è: esiste un modo per creare wp_editor utilizzando JavaScript? Come quello che otteniamo con la funzione WordPress <?php wp_editor() ?>.

Ho provato a usare:

tinyMCE.init({ mode: "exact", elements: "accordion_icon_description_"+response.success.item_count });

ma genera un editor molto basilare che non è lo stesso dell'editor dei contenuti dei post di WordPress.

1
Commenti

La versione 4.8 ha introdotto un modo per fare questo: https://make.wordpress.org/core/2017/05/20/editor-api-changes-in-4-8/ Non sto aggiungendo nulla quindi non posterò come risposta, ma forse qualcuno con qualche esempio può farlo.

Jacob Peattie Jacob Peattie
25 lug 2017 17:55:49
Tutte le risposte alla domanda 4
6

Grazie al commento di Jacob Peattie posso rispondere utilizzando solo JS. In realtà abbiamo fatto qualcosa di simile, ma prima della versione 4.8 e non era così semplice, quindi alla fine abbiamo utilizzato wp_editor(). Ma ora puoi farlo utilizzando l'oggetto wp.editor in JavaScript. Ci sono 3 funzioni principali:

  1. wp.editor.initialize = function( id, settings ) {

Dove id è

L'id HTML della textarea utilizzata per l'editor. Deve essere compatibile con jQuery. Niente parentesi, caratteri speciali, ecc.

e settings può essere un oggetto

{
    tinymce: {
        // impostazioni tinymce
    },
    quicktags: {
        buttons: '..'
    }
}

con queste impostazioni TinyMCE. Invece di uno qualsiasi dei 3 oggetti (settings stesso, tinymce o quicktags) puoi usare true per utilizzare le impostazioni predefinite.

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

È abbastanza autoesplicativo. Rimuove qualsiasi istanza dell'editor creata tramite wp.editor.initialize.

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

Beh, ottieni il contenuto di qualsiasi editor creato tramite wp.editor.initialize.


L'utilizzo potrebbe essere così

var countEditors = 0;
$(document).on('click', 'button#addEditor', function() {
    var editorId = 'editor-' + countEditors;
    // aggiungi editor in HTML come <textarea> con id editorId
    // dagli la classe wp-editor
    wp.editor.initialize(editorId, true);
    countEditors++;
});
$(document).on('click', 'button.removeEditor', function() {
   // assumendo che l'editor sia sotto lo stesso genitore
   var editorId = $(this).parent().find('.wp-editor');
   wp.editor.remove(editorId);
});

Poiché il contenuto verrà automaticamente inviato, non è necessario in questo esempio. Ma potresti sempre recuperarlo tramite wp.editor.getContent( editorId )

25 lug 2017 18:37:41
Commenti

Ho verificato inizializzando l'editor con l'ID della textbox wp.editor.initialize(editorId, true); ma non funziona.

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

L'editor è già nel DOM, l'ID è corretto? Puoi condividere il tuo codice JS (su pastebin)?

kero kero
25 lug 2017 19:03:56

Sì, la textbox è in un campo meta. Sto verificando in document.ready e ho anche controllato eseguendo il codice nella console del browser restituisce undefined per ogni text box. Quelle che in realtà sono campi meta del post.

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

Non posso condividere l'intero codice perché non avrebbe senso. Fa parte di qualcosa di più grande.

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

Per tua informazione, il mio codice è wp.editor.initialize("accordion_icon_description_1", true);

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

@kero, sto riscontrando anche io lo stesso problema. Puoi aiutarmi a risolverlo? https://wordpress.stackexchange.com/questions/382108/editor-not-displaying-dynamically-after-clicking-on-the-button

Naren Verma Naren Verma
25 gen 2021 17:20:08
Mostra i restanti 1 commenti
3

WP 5.3.2

Attualmente sto sviluppando un plugin con caricamento di pagine Ajax, necessario per ottenere dati da più editor WP che vengono caricati dinamicamente.

NOTA: L'esempio seguente è per l'area wp-admin, se vuoi utilizzarlo per il front-end potresti doverlo estendere.

1. Assicurati che gli script dell'editor siano caricati con:

add_action( 'admin_enqueue_scripts', 'load_admin_scripts');
function load_admin_scripts() {
  // NON caricarlo in ogni pagina di amministrazione, crea una logica per caricarlo solo nelle tue pagine
  wp_enqueue_editor();
}

2. Ottieni l'area di testo dell'editor con Ajax (PHP):

function your_ajax_get_editor_callback() {
  // Nota: ogni editor deve avere un nome e un id univoci
  return '<textarea name="my-wp-editor" id="my-wp-editor" rows="12" class="myprefix-wpeditor">Il valore dal database qui :-)</textarea>';
}

3. Utilizza uno script JS Ajax per caricare e rimuovere gli editor WP nella callback di successo di Ajax.

Sto ancora sperimentando con tutti i plugin tinymce disponibili, consulta la documentazione di TinyMCE e nota che WP ha rinominato alcuni di essi. Controlla wp-includes/js/tinymce/plugins. Nell'esempio seguente ho aggiunto fullscreen, un comodo plugin che è disabilitato di default.

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

    // Salva l'id per la rimozione successiva
    active_editors.push(editor_id);

  });

}

4. Ottieni il contenuto da ogni editor con:

function get_editor_content() {

  // NOTA: nella mia applicazione il codice seguente è all'interno di un'iterazione di campi (loop)

  var editor_id = $(field).attr('id');

  var mce_editor = tinymce.get(editor_id);
  if(mce_editor) {
    val = wp.editor.getContent(editor_id); // La scheda Visuale è attiva
  } else {
    val = $('#'+editor_id).val(); // La scheda HTML è attiva
  }

}

Punti chiave:

  • Usa wp.editor.initialize(editor_id_here) su un <textarea> pulito, non utilizzare wp_editor() per l'output HTML.
  • Assicurati di rimuovere l'editor con wp.editor.remove(editor_id) se non è più presente nel DOM. Se non lo fai, l'inizializzazione dell'editor fallirà quando caricherai l'editor (dinamicamente) per una seconda volta.
  • Ottenere il contenuto dell'editor è diverso per ogni scheda (Visuale / HTML)

NOTA: Gli esempi di codice sopra non sono stati completamente testati e potrebbero contenere alcuni errori. Li ho utilizzati con successo nella mia applicazione. Servono solo per farti partire.

20 dic 2019 02:34:49
Commenti

Grazie, le tue informazioni hanno bisogno di miglioramenti. Ma alla fine ho avuto successo con questo codice.

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

Felice di aver potuto aiutare. Penso che tu abbia abbastanza reputazione per aggiungere i miglioramenti cliccando su modifica così posso rivederli.

Bjorn Bjorn
13 ago 2020 14:28:28

rimuovere l'editor precedentemente inizializzato con wp.editor.remove(editor_id) è stato cruciale per farlo funzionare nel mio caso, grazie

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

Devi prima usare wp_enqueue_editor(); per caricare gli script dell'editor, i fogli di stile e le impostazioni predefinite. Puoi trovare la documentazione qui wp_enqueue_editor()

Devi rimuovere true dalla funzione in questo modo: wp.editor.initialize(editorId);

20 set 2017 09:30:21
1
tinymce.execCommand( 'mceAddEditor', true, element.id );

ha funzionato per me. Grazie alla risposta di Goran Jakovljevic su: Come caricare wp_editor via AJAX

7 apr 2022 20:30:34
Commenti

C'è un modo per caricare Gutenberg invece di Tinymce?

doraemon doraemon
1 mar 2023 14:43:41