Come caricare wp_editor() attraverso AJAX/jQuery

10 mag 2012, 18:30:59
Visualizzazioni: 26.2K
Voti: 25

Ho un tema personalizzato sviluppato che è davvero complesso. Una delle funzionalità prevede diverse aree di contenuto dove gli utenti possono specificare contenuti per schede specifiche. Carico diverse istanze dell'editor WordPress attraverso la funzione wp_editor(). Funziona perfettamente. (Tutto questo avviene sul lato amministrativo, nel tipo di post "Page")

Tuttavia, ho iniziato a fare alcuni miglioramenti, inclusa la possibilità di aggiungere/rimuovere schede dinamicamente (prima, caricavo 6 editor sulla pagina). Gli utenti possono avere da 1 a 7 schede.

Quando gli utenti aggiungono una scheda, è necessario aggiungere un'istanza dell'editor alla pagina. Tuttavia, qualunque cosa io provi, non riesco a farlo caricare e visualizzare correttamente.

Ecco i 2 metodi che ho provato finora:

  1. Creare un file php che include il bootstrap dell'amministrazione, e poi caricare l'editor con wp_editor(). Quindi eseguo un jQuery $.load per chiamare la pagina e includere l'HTML risultante nell'area in cui deve essere visualizzato. Questo non funziona davvero, tuttavia, poiché i pulsanti di formattazione dell'editor scompaiono (è importante notare che, caricando la pagina direttamente, l'editor viene visualizzato e funziona perfettamente)
  2. Ho caricato l'editor sulla pagina, all'interno di un div nascosto, e poi una volta aggiunta una scheda, uso jQuery per spostarlo nella posizione corretta. Questo carica l'editor intatto, ma non è possibile utilizzare nessuno dei pulsanti dell'editor (vengono visualizzati, ma non fanno nulla), e non è possibile posizionare il cursore nell'area di testo (curioso, tuttavia, che passando alla modalità HTML permetta la digitazione e alcune interazioni con i pulsanti della modalità HTML)

Quindi la domanda è: qualcuno ha avuto successo nell'aggiungere editor attraverso chiamate AJAX? Qualche consiglio?

4
Commenti

hai provato a fare una chiamata ajax tramite admin-ajax.php? Se no, crea una funzione con il tuo codice e poi chiamala via admin-ajax.php

Sisir Sisir
10 mag 2012 18:56:02

questo suggerimento ti è stato utile? Se sì, non è una domanda relativa a WordPress. :)

fuxia fuxia
10 mag 2012 19:52:57

@Sisir, se ho capito bene il tuo suggerimento, non ha funzionato. Ho usato questo per chiamare il form Ajax: $('#sph-tabs-section-tab'+newTab).load('/wp-admin/admin-ajax.php?action=sph_add_editor'); e poi ho aggiunto una funzione che restituisce wp_editor(). Viene chiamata senza problemi, ma restituisce comunque solo l'editor senza pulsanti. (stessi identici risultati del punto 1 nell'OP)

Aaron Wagner Aaron Wagner
10 mag 2012 20:44:26

Una volta inizializzato, TinyMCE non può essere spostato nel DOM. Devi rimuoverlo, spostarlo nel DOM e inizializzarlo nuovamente. Codice simile ma per i commenti frontend qui sul mio blog: http://www.techytalk.info/add-tinymce-quicktags-visual-editors-wordpress-comments-form/ Il modulo dei commenti viene spostato quando l'utente fa clic su rispondi/annulla risposta.

User User
6 set 2012 01:46:12
Tutte le risposte alla domanda 8
0

Per far apparire i quicktags, è necessario reinizializzarli all'interno del gestore oncomplete dell'ajax.

quicktags({id : 'editorcontentid'});

Il mio gestore di successo ajax è così:

success: function(data, textStatus, XMLHttpRequest){
            //aggiunge l'editor al DOM
            $('#container').append($(data).html());
            //inizializza i quicktags
            quicktags({id : 'editorcontentid'});
            //inizializza tinymce
            tinymce.init(tinyMCEPreInit.mceInit['editorcontentid']);
        }

Sono riuscito a far caricare l'editor chiamando prima una funzione statica che crea l'editor e lo memorizza come variabile. Eseguo il metodo di creazione dell'editor all'inizializzazione. Questo sembra far sì che WordPress accodare tutti gli script necessari.

È importante che quando crei la tua istanza dell'editor, la configuri per usare tinymce, in questo modo anche il file js di tinymce verrà accodato.

4 ott 2012 06:11:21
2

Dopo aver lottato con il problema, ho trovato la soluzione funzionante, in un callback dopo aver aggiunto un nuovo elemento:

tinymce.execCommand( 'mceAddEditor', true, element.id );

È strano che non ci sia alcuna documentazione a riguardo nel codex.

5 apr 2016 10:08:01
Commenti

tinymce è una risorsa esterna, quindi penso che potrebbero ritenere che la documentazione ufficiale di tinymce la copra - https://www.tinymce.com/docs/ - ma è piuttosto carente di esempi... Inoltre devi includere gli script tinymce affinché questa risposta funzioni! (il modo più semplice è generare un editor PHP fittizio wp_editor() con l'argomento tinymce impostato su true :-)

jave.web jave.web
20 apr 2016 23:34:59

grazie amico... funziona anche per me - dopo aver ricevuto i dati da ajax ho semplicemente inizializzato così... ;)

Sagive Sagive
2 lug 2019 11:55:00
0

Soluzione funzionante finale:

Aggiungi un'azione in WordPress, ad esempio My_Action_Name (nota anche l'ID della textarea My_TextAreaID_22):

add_action('wp_ajax_My_Action_Name', function(){
    wp_editor( $_POST['default_text'], 'My_TextAreaID_22',      $settings = array( 'tinymce'=>true, 'textarea_name'=>'name77', 'wpautop' =>false,   'media_buttons' => true ,   'teeny' => false, 'quicktags'=>true, )   );    exit;
});

Ora, nella Dashboard, esegui questa funzione (nota l'uso di My_TextAreaID_22 e My_Action_Name):

function start_Ajax_request() { 
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Ottieni le impostazioni predefinite di Wordpress (Non posso confermare, ma se hai bisogno di cambiare l'ID target, aggiungi questa riga:  My_New_Global_Settings.selector = "My_TextAreaID_22";   )
    jQuery.post(ajaxurl,
        { action: "My_Action_Name",     default_text: "Hello World"}, 
        function(response,status){ 
            tinymce.init(My_New_Global_Settings); 
            tinyMCE.execCommand('mceAddEditor', false, "My_TextAreaID_22"); 
            quicktags({id : "My_TextAreaID_22"});
            // tinyMCE.execCommand( 'mceAddEditor', true, element.id );
        }
    );

}   
start_Ajax_request();     // < ---- ESEGUI
20 giu 2015 22:36:37
2

Devi richiamare nuovamente l'inizializzazione dell'editor dopo aver aggiunto la tua textarea via AJAX, io l'ho fatto così:

$.fn.tinymce_textareas = function(){
  tinyMCE.init({
    skin : "wp_theme"
    // altre opzioni qui
  });
};

Poi richiama la tua funzione dopo l'AJAX, in questo modo:

$('#my_new_textarea_container').html(response).tinymce_textareas();
20 mag 2012 20:55:49
Commenti

Per favore, potresti spiegare come funziona? Questo non funziona. L'ho provato.

Ahmed Fouad Ahmed Fouad
18 lug 2012 21:09:50

Dopo aver aggiunto il contenuto AJAX che contiene la textarea su cui voglio tinyMCE (response), chiama la funzione tinymce_textareas che inizializza tinyMCE sulle nuove textarea.

Steven Steven
18 lug 2013 13:46:54
1

La soluzione utilizzabile da @toscho su GitHub. Ha creato questo bel risultato anche per una domanda qui, vedi la sua risposta per maggiori dettagli.

17 feb 2014 10:53:01
Commenti

Ciò richiede una libreria per l'uso - T5 ... non è una soluzione esclusiva per WP

random_user_name random_user_name
17 gen 2015 02:57:54
0

L'ho gestito in questo modo:

  1. Per prima cosa devi chiamare wp_editor nella pagina principale, da cui chiami l'ajax. Ma devi racchiuderlo in un div nascosto:

    <div style="display:none">
    <?php
    wp_editor( '', 'unique_id', array(
        'media_buttons' => false,
        'textarea_rows' => 10,
        'teeny' => true,
    ) );
    ?>
    </div>

L'ID deve essere casuale e univoco. Le impostazioni devono essere le stesse delle impostazioni nel tuo editor ajax.

  1. In secondo luogo, devi chiamare questo nella risposta ajax:

wp_editor( '', '[imposta l\'id come necessario]', array(le stesse impostazioni della pagina principale) ); _WP_Editors::editor_js(); //questo stampa il codice di inizializzazione dell'editor

11 ott 2016 13:11:05
0

Questo funzionerà nelle pagine di amministrazione.

Per aggiungere un nuovo editor wp a un contenitore tramite JS AJAX:

1) Creare una funzione wp_ajax in functions.php per restituire l'editor wp

2) Creare uno script jQuery per richiedere un nuovo editor di testo e aggiungerlo a un contenitore, in questo caso, quando si preme un pulsante

File PHP

function yourprefix_get_text_editor() {
    $content = ""; // Vuoto perché è un nuovo editor
    $editor_id = $_POST["text_editor_id"]; // ID casuale dalla chiamata AJAX JS
    $textarea_name = $_POST["textarea_name"]; // Nome dal file JS
    $settings = array(
        'textarea_name' => $textarea_name
    );
    wp_editor($content, $editor_id, $settings);
    wp_die(); // wp_die obbligatorio
}
add_action('wp_ajax_yourprefix_get_text_editor', 'yourprefix_get_text_editor');

Script JS (jsfile.js)

jQuery(function($) {
$("someelement").click(function(e) { // Per aggiungere un editor al click di un pulsante
    var target = themeajax.ajax_url; // Passato da wp_localize_script
    var editor_id = "editorid"; // Genera questo dinamicamente
    var textarea_name = "textareaname" // Generalo come necessario
    var data = {
        'action': 'yourprefix_get_text_editor',
        'text_editor_id': editor_id,
        'textarea_name': textarea_name
    }
    $.post(target, data, function(response) {
        container.append(response); // Usa la tua logica per ottenere il contenitore dove vuoi aggiungere l'editor
        tinymce.execCommand('mceAddEditor', false, editor_id);
        quicktags({id : editor_id});
    });
}
});

Chiamata per accodare gli script:

function yourprefix_admin_scripts($hook) {
    wp_enqueue_script('your-slug', get_stylesheet_directory_uri() . '/path/to/jsfile.js', array('jquery'), null, true);
    wp_localize_script('your-slug', 'themeajax', array(
        'ajax_url' => admin_url('admin-ajax.php')
    ));
}
add_action('admin_enqueue_scripts', 'yourprefix_admin_scripts');
8 mar 2018 23:46:54
3
-2

Usa questo codice, spero ti sia utile:

wp_editor( '', 'custom_editor_id' );
\_WP_Editors::enqueue_scripts();
print_footer_scripts();
\_WP_Editors::editor_js();

Puoi trovare maggiori dettagli qui.

15 apr 2015 02:15:54
Commenti

Per favore condividi un esempio di come questo codice può essere utile, e poi aggiungi il link per maggiori dettagli. Le risposte composte solo da link diventano invalide se il link si rompe - spero tu capisca. :)

Mayeenul Islam Mayeenul Islam
15 apr 2015 06:34:34

Questo link al momento non funziona e non ho alcun contesto dietro la risposta. (Una delle tante ragioni per cui le risposte "solo link" sono negative)

Sudar Sudar
6 lug 2015 19:51:52

Questo funziona ma ha alcuni problemi, quando selezioni testo o modalità visiva crea aree di testo duplicate all'interno dell'editor

Drmzindec Drmzindec
28 lug 2017 17:14:21