Cum să creezi WP Editor folosind JavaScript

25 iul. 2017, 17:47:53
Vizualizări: 15K
Voturi: 4

Încerc să creez niște câmpuri repetitive și pentru asta, vreau să creez un nou editor wp cu un ID unic.

Deci întrebarea mea este: există vreo metodă de a crea wp_editor folosind JavaScript? Similar cu cel pe care îl obținem folosind funcția WordPress <?php wp_editor() ?>.

Am încercat să folosesc:

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

dar afișează un editor foarte simplu care cred că nu este același cu cel al câmpului de editor de conținut din WordPress.

1
Comentarii

Versiunea 4.8 a introdus o metodă de a face acest lucru: https://make.wordpress.org/core/2017/05/20/editor-api-changes-in-4-8/ Nu voi adăuga nimic, așa că nu voi posta ca răspuns, dar poate cineva cu exemple concrete poate face acest lucru.

Jacob Peattie Jacob Peattie
25 iul. 2017 17:55:49
Toate răspunsurile la întrebare 4
6

Mulțumesc comentariului lui Jacob Peattie, pot răspunde la aceasta folosind doar JS. De fapt, am făcut ceva similar, dar înainte de versiunea 4.8 și nu era atât de ușor, așa că am folosit wp_editor() până la urmă. Dar acum, poți face asta folosind obiectul wp.editor în JavaScript. Există 3 funcții principale

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

Unde id este

ID-ul HTML al elementului textarea folosit pentru editor. Trebuie să fie compatibil cu jQuery. Fără paranteze, caractere speciale, etc.

și settings este fie un obiect

{
    tinymce: {
        // setări tinymce
    },
    quicktags: {
        buttons: '..'
    }
}

cu aceste setări TinyMCE. În loc de oricare dintre cele 3 obiecte (settings însuși, tinymce sau quicktags), poți folosi true pentru a utiliza valorile implicite.

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

Este destul de auto-explicativ. Elimină orice instanță de editor creată prin wp.editor.initialize.

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

Ei bine, obține conținutul oricărui editor creat prin wp.editor.initialize.


Utilizarea ar putea arăta astfel

var countEditors = 0;
$(document).on('click', 'button#addEditor', function() {
    var editorId = 'editor-' + countEditors;
    // adaugă editorul în HTML ca <textarea> cu id editorId
    // dă-i clasa wp-editor
    wp.editor.initialize(editorId, true);
    countEditors++;
});
$(document).on('click', 'button.removeEditor', function() {
   // presupunând că editorul este sub același părinte
   var editorId = $(this).parent().find('.wp-editor');
   wp.editor.remove(editorId);
});

Deoarece conținutul va fi postat automat, nu este necesar în acest exemplu. Dar ai putea oricând să-l obții prin wp.editor.getContent( editorId ).

25 iul. 2017 18:37:41
Comentarii

Am verificat prin inițializarea editorului cu ID-ul casetei de text wp.editor.initialize(editorId, true); dar nu funcționează.

1naveengiri 1naveengiri
25 iul. 2017 18:55:35

Editorul este deja în DOM, este ID-ul corect? Poți să împărtășești codul tău JS (într-un pastebin)?

kero kero
25 iul. 2017 19:03:56

Da, caseta de text este în câmpul meta. O verific în document.ready și am verificat și prin executarea codului în consola browserului dă undefined pentru fiecare casetă de text. Cele care sunt de fapt un câmp meta de postare.

1naveengiri 1naveengiri
25 iul. 2017 19:10:13

Nu pot să împărtășesc întregul cod pentru că ar fi lipsit de sens. Aceasta face parte din ceva mai mare.

1naveengiri 1naveengiri
25 iul. 2017 19:11:27

Pentru informația ta, codul meu este wp.editor.initialize("accordion_icon_description_1", true);

1naveengiri 1naveengiri
25 iul. 2017 19:12:49

@kero, și eu întâmpin aceeași problemă. Poți să mă ajuți cu această problemă? https://wordpress.stackexchange.com/questions/382108/editor-not-displaying-dynamically-after-clicking-on-the-button

Naren Verma Naren Verma
25 ian. 2021 17:20:08
Arată celelalte 1 comentarii
3

WP 5.3.2

În prezent construiesc un plugin cu încărcare de pagini Ajax, fiind nevoie să obțin date din mai mulți editori WP care sunt încărcați dinamic.

NOTĂ: Exemplul de mai jos este pentru zona wp-admin, dacă doriți acest lucru pentru front-end, poate fi necesară extinderea.

1. Asigurați-vă că scripturile editorului sunt încărcate cu:

add_action( 'admin_enqueue_scripts', 'load_admin_scripts');
function load_admin_scripts() {
  // NU încărcați pe fiecare pagină de admin, creați o logică pentru a le încărca doar pe paginile dumneavoastră
  wp_enqueue_editor();
}

2. Obțineți textarea editorului cu Ajax (PHP):

function your_ajax_get_editor_callback() {
  // Notă: fiecare editor are nevoie de un nume și un id unic
  return '<textarea name="my-wp-editor" id="my-wp-editor" rows="12" class="myprefix-wpeditor">Valoarea din baza de date aici :-)</textarea>';
}

3. Utilizați un script JS Ajax pentru a încărca și elimina editorii WP pe callback-ul de succes Ajax.

Încă experimentez cu toate pluginurile disponibile tinymce, consultați documentația TinyMCE și rețineți că WP a redenumit unele dintre ele. Verificați wp-includes/js/tinymce/plugins. În exemplul de mai jos am adăugat fullscreen, un plugin util care este dezactivat implicit.

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ți id-ul pentru eliminare ulterioară
    active_editors.push(editor_id);

  });

}

4. Obțineți conținutul de la fiecare editor cu:

function get_editor_content() {

  // NOTĂ: în aplicația mea codul de mai jos este în interiorul unei iterații de câmpuri (buclă)

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

  var mce_editor = tinymce.get(editor_id);
  if(mce_editor) {
    val = wp.editor.getContent(editor_id); // Tab-ul Visual este activ
  } else {
    val = $('#'+editor_id).val(); // Tab-ul HTML este activ
  }

}

Indicații:

  • Utilizați wp.editor.initialize(editor_id_here) pe un <textarea> curat, nu utilizați wp_editor() pentru output HTML.
  • Asigurați-vă că eliminați editorul cu wp.editor.remove(editor_id) dacă acesta nu mai este prezent în DOM. Dacă nu faceți acest lucru, inițializarea editorului va eșua când încărcați editorul (dinamic) pentru a doua oară.
  • Obținerea conținutului editorului este diferită pentru fiecare tab (Visual / HTML)

NOTĂ: Exemplele de cod de mai sus nu sunt testate integral și pot conține unele erori. Le am funcționale complet în aplicația mea. Sunt pur și simplu pentru a vă ajuta să începeți.

20 dec. 2019 02:34:49
Comentarii

Mulțumesc, informațiile tale au nevoie de îmbunătățiri. Dar în final am reușit cu acest cod.

Ravi Patel Ravi Patel
7 aug. 2020 04:48:34

Mă bucur că am putut ajuta. Cred că ai suficientă reputație pentru a adăuga îmbunătățirile prin click pe edit, ca să le pot revizui.

Bjorn Bjorn
13 aug. 2020 14:28:28

eliminarea editorului inițializat anterior cu wp.editor.remove(editor_id) a fost crucială pentru mine ca să funcționeze, mulțumesc

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

Trebuie să folosești mai întâi wp_enqueue_editor(); pentru a afișa scripturile, foile de stil și setările implicite ale editorului. Poți găsi documentația aici wp_enqueue_editor()

Trebuie să elimini valoarea true din funcție astfel: wp.editor.initialize(editorId);

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

A funcționat pentru mine. Mulțumiri răspunsului lui Goran Jakovljevic pe: Cum să încarci wp_editor prin AJAX

7 apr. 2022 20:30:34
Comentarii

Există o modalitate de a încărca Gutenberg în loc de Tinymce?

doraemon doraemon
1 mar. 2023 14:43:41