Cum să încarci wp_editor() prin AJAX/jQuery

10 mai 2012, 18:30:59
Vizualizări: 26.2K
Voturi: 25

Am o temă care este dezvoltată personalizat și foarte complexă. Una dintre funcționalități este că există mai multe zone de conținut unde utilizatorii pot specifica conținut pentru file specifice. Încarc multiple instanțe ale editorului WordPress prin funcția wp_editor(). Funcționează perfect. (Toate acestea sunt pe partea de administrare, în tipul de postare "Page")

Totuși, am început să fac câteva îmbunătățiri, inclusiv posibilitatea de a adăuga/elimina file în mod dinamic (înainte, încărcam 6 editoare pe pagină). Utilizatorii pot avea între 1-7 file.

Când utilizatorii adaugă o filă, trebuie să adauge o instanță a editorului pe pagină. Cu toate acestea, indiferent ce încerc, nu reușesc să-l încarc și să-l afișez corect.

Iată cele 2 lucruri pe care le-am încercat până acum:

  1. Am creat un fișier PHP care include bootstrap-ul de admin și apoi încarcă editorul cu wp_editor(). Apoi folosesc jQuery $.load pentru a apela pagina și a include HTML-ul rezultat în zona în care trebuie afișat. Totuși, acest lucru nu funcționează cum trebuie, deoarece butoanele de formatare ale editorului dispar (merită menționat că accesând pagina direct, editorul se afișează și funcționează perfect)
  2. Am încărcat editorul pe pagină, într-un div ascuns, și apoi când se adaugă o filă, folosesc jQuery pentru a-l muta în poziția dorită. Acest lucru încarcă editorul intact, dar nu poți folosi niciunul dintre butoanele editorului (se afișează, dar nu fac nimic), și nu poți pune cursorul în zona de text (curios totuși că trecerea în modul HTML permite scrierea și interacțiunea cu butoanele din modul HTML)

Așadar întrebarea este, a reușit cineva să adauge editoare prin apeluri AJAX? Aveți sfaturi?

4
Comentarii

ai încercat să faci un apel ajax prin admin-ajax.php? Dacă nu, creează o funcție cu codul tău și apeleaz-o prin admin-ajax.php

Sisir Sisir
10 mai 2012 18:56:02

această sugestie te ajută? Dacă da, nu este o întrebare despre WordPress. :)

fuxia fuxia
10 mai 2012 19:52:57

@Sisir, dacă înțeleg corect sugestia ta, atunci nu a funcționat. Am folosit asta pentru a apela formularul Ajax: $('#sph-tabs-section-tab'+newTab).load('/wp-admin/admin-ajax.php?action=sph_add_editor'); și apoi am adăugat o funcție care returnează wp_editor(). Este apelată fără probleme, dar în continuare returnează editorul fără butoane. (exact același rezultat ca punctul 1 din OP)

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

Odată inițializat, TinyMCE nu poate fi mutat în DOM. Trebuie să îl eliminați, să îl mutați în DOM și să îl inițializați din nou. Cod similar dar pentru comentariile pe frontend aici pe blogul meu: http://www.techytalk.info/add-tinymce-quicktags-visual-editors-wordpress-comments-form/ Formularul de comentarii este mutat când utilizatorul apasă reply/cancel reply.

User User
6 sept. 2012 01:46:12
Toate răspunsurile la întrebare 8
0

Pentru a face ca quicktags să apară, trebuie să le reinstanțiați în handler-ul oncomplete al cererii AJAX.

quicktags({id : 'editorcontentid'});

Handler-ul meu de succes pentru AJAX arată astfel:

success: function(data, textStatus, XMLHttpRequest){
            //adaugă editorul în DOM
            $('#container').append($(data).html());
            //inițializează quicktags
            quicktags({id : 'editorcontentid'});
            //inițializează tinymce
            tinymce.init(tinyMCEPreInit.mceInit['editorcontentid']);
        }

Am reușit să încărc editorul apelând mai întâi o funcție statică care creează editorul și îl stochează ca variabilă. Rulez metoda de creare a editorului la inițializare. Acest lucru pare să determine WordPress să încarce toate scripturile necesare.

Este important ca atunci când creați instanța editorului, să setați ca aceasta să folosească TinyMCE, astfel încât fișierul JS al TinyMCE să fie încărcat și el.

4 oct. 2012 06:11:21
2

După ce m-am chinuit cu asta, am găsit soluția care funcționează, într-un callback după ce adaugi un element nou:

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

Este ciudat că nu există nicio documentație în codex.

5 apr. 2016 10:08:01
Comentarii

tinymce este o resursă externă, așa că cred că ar putea considera că documentația proprie a tinymce o acoperă - https://www.tinymce.com/docs/ - dar destul de săracă în exemple... De asemenea, trebuie să incluzi scripturile tinymce pentru ca acest răspuns să funcționeze! (cea mai simplă metodă este să afișezi un editor PHP fals wp_editor() cu argumentul tinymce setat la true :-)

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

mersi, prietene... și pentru mine funcționează - după ce returnez datele din ajax, doar le inițializez... ;)

Sagive Sagive
2 iul. 2019 11:55:00
0

Soluția funcțională finală:

Adăugați acțiunea în WordPress, de exemplu My_Action_Name (de asemenea, notați ID-ul 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;
});

Acum, în Panoul de control, executați această funcție (observați utilizarea My_TextAreaID_22 și My_Action_Name):

function start_Ajax_request() { 
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Obține setările implicite WordPress (Nu pot confirma, dar dacă aveți nevoie să schimbați ID-ul țintă, adăugați această linie:  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();     // < ---- EXECUTĂ
20 iun. 2015 22:36:37
2

Trebuie să inițializați din nou editorul după ce adăugați textarea-ul prin Ajax, am făcut astfel:

$.fn.tinymce_textareas = function(){
  tinyMCE.init({
    skin : "wp_theme"
    // alte opțiuni aici
  });
};

Apoi apelați funcția după request-ul Ajax, astfel:

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

Te rog să explici cum funcționează acest lucru? Nu funcționează. Am încercat.

Ahmed Fouad Ahmed Fouad
18 iul. 2012 21:09:50

După adăugarea conținutului ajax care conține textarea pe care vreau să aibă tinyMCE (response), apelează funcția tinymce_textareas care inițializează tinyMCE pe noile textarea-uri.

Steven Steven
18 iul. 2013 13:46:54
1

Soluția funcțională oferită de @toscho pe github. El a realizat acest rezultat elegant și ca răspuns la o întrebare aici, consultați răspunsul său pentru mai multe detalii.

17 feb. 2014 10:53:01
Comentarii

Aceasta necesită o bibliotecă pentru utilizare - T5 ... nu este o soluție exclusivă pentru WP

random_user_name random_user_name
17 ian. 2015 02:57:54
0

Am reușit să implementez astfel:

  1. Mai întâi trebuie să apelezi wp_editor pe pagina principală, de unde inițiezi apelul AJAX. Dar trebuie să-l înfășori într-un div ascuns:

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

ID-ul trebuie să fie generat aleatoriu și unic. Setările trebuie să fie identice cu cele din editorul AJAX.

  1. Apoi, în răspunsul AJAX trebuie să apelezi:

wp_editor( '', '[setează ID-ul după necesitate]', array(aceleași setări ca pe pagina principală) ); _WP_Editors::editor_js(); //acest cod inițializează editorul

11 oct. 2016 13:11:05
0

Acest lucru va funcționa pe paginile de administrare.

Pentru a adăuga un nou editor wp într-un container prin JS AJAX:

1) Creați o funcție wp_ajax în functions.php care să returneze editorul wp

2) Creați un script jQuery pentru a solicita un nou editor de text și a-l adăuga într-un container, în acest caz, la apăsarea unui buton

Fișier PHP

function yourprefix_get_text_editor() {
    $content = ""; // Gol pentru că este un editor nou
    $editor_id = $_POST["text_editor_id"]; // ID generat aleatoriu din apelul AJAX JS
    $textarea_name = $_POST["textarea_name"]; // Nume din fișierul JS
    $settings = array(
        'textarea_name' => $textarea_name
    );
    wp_editor($content, $editor_id, $settings);
    wp_die(); // Obligatoriu wp_die
}
add_action('wp_ajax_yourprefix_get_text_editor', 'yourprefix_get_text_editor');

Script JS (jsfile.js)

jQuery(function($) {
$("someelement").click(function(e) { // Pentru a adăuga un editor la click pe buton
    var target = themeajax.ajax_url; // Trimis prin wp_localize_script
    var editor_id = "editorid"; // Generați acest ID dinamic
    var textarea_name = "textareaname" // Generați acest nume după necesități
    var data = {
        'action': 'yourprefix_get_text_editor',
        'text_editor_id': editor_id,
        'textarea_name': textarea_name
    }
    $.post(target, data, function(response) {
        container.append(response); // Folosiți logica pentru a obține containerul unde doriți să adăugați editorul
        tinymce.execCommand('mceAddEditor', false, editor_id);
        quicktags({id : editor_id});
    });
}
});

Apel pentru încărcarea scripturilor:

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

Folosește acest cod, sper că te va ajuta:

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

Mai multe detalii pot fi găsite aici.

15 apr. 2015 02:15:54
Comentarii

Te rog să împărtășești un fragment care să explice cum poate ajuta acest cod, apoi adaugă linkul pentru detalii suplimentare. Răspunsurile care conțin doar linkuri devin invalide dacă linkul este rupt - sper că înțelegi. :)

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

Acest link este momentan rupt și nu am niciun context pentru răspuns. (Unul dintre numeroasele motive pentru care răspunsurile "doar cu link" sunt nepotrivite)

Sudar Sudar
6 iul. 2015 19:51:52

Această soluție funcționează, dar are unele probleme - atunci când selectezi text sau elemente vizuale, creează zone de text duplicate în cadrul editorului

Drmzindec Drmzindec
28 iul. 2017 17:14:21