AJAX / jQueryを介してwp_editor()をロードする方法


22

カスタム開発されたテーマがあり、本当に複雑です。私が持っていることの1つは、ユーザーが特定のタブのコンテンツを指定できる複数のコンテンツ領域です。wp_editor()関数を介してWordPressエディターの複数のインスタンスを読み込みます。完璧に機能します。(これはすべて「Page」投稿タイプの管理者側にあります)

ただし、タブを動的に追加/削除する機能など、いくつかの改善を開始しました(以前は、6つのエディターをページにロードしていました)。ユーザーは1〜7個のタブを使用できます。

ユーザーがタブを追加する場合、エディターのインスタンスをページに追加する必要があります。ただし、何を試しても、正しくロードして表示することはできません。

これまでに試した2つのことを次に示します。

  1. adminブートストラップを含むphpファイルを作成し、でエディターをロードしwp_editor()ます。次に、jQuery $.loadを実行してページを呼び出し、表示する必要がある領域に結果のHTMLを含めます。ただし、エディターのフォーマットボタンが表示されないため、これは実際には機能しません(ページを直接プルすると、エディターが表示され、完全に機能することに注意してください)
  2. 非表示div内のページにエディターをロードし、タブが追加されたら、jqueryを使用して所定の場所に移動します。これはエディターをそのままロードしますが、エディターボタンを使用することはできず(表示はしますが、何もしません)、テキストエリアにカーソルを置くことはできません(ただし、HTMLモードへの切り替え入力およびHTMLモードボタンとの対話を許可します)

質問は、AJAX呼び出しを介してエディターを追加する運がありましたか?何かアドバイス?


経由でajax呼び出しをしようとしましたadmin-ajax.phpか?コードで関数を作成しない場合は、経由で呼び出しますadmin-ajax.php
-Sisir

、この提案のヘルプは?もしそうなら、それはWordPressの質問ではありません。:)
fuxia

@Sisir、あなたの提案を正しく読んでいるなら、それはうまくいきませんでした。これを使用してAjaxフォームを呼び出し、$('#sph-tabs-section-tab'+newTab).load('/wp-admin/admin-ajax.php?action=sph_add_editor');を返す関数を追加しましたwp_editor()。問題なく呼び出されますが、それでもボタンのないエディターのみを返します。(OPのアイテム1とまったく同じ結果)
アーロンワーグナー

初期化されたTinyMCEは、DOM内を移動することはできません。それを削除し、DOMに移動して再度初期化する必要があります。同様のコードですが、私のブログのフロントエンドコメントの場合:techytalk.info/…ユーザーが返信をクリックするか、返信をキャンセルすると、コメントフォームが移動します。

回答:


7

クイックタグを表示するには、ajax oncompleteハンドラー内でクイックタグを再インスタンス化する必要があります。

quicktags({id : 'editorcontentid'});

私のajax成功ハンドラーは次のようになります。

success: function(data, textStatus, XMLHttpRequest){
            //append editor to dom
            $('#container').append($(data).html());
            //init quicktags
            quicktags({id : 'editorcontentid'});
            //init tinymce
            tinymce.init(tinyMCEPreInit.mceInit['editorcontentid']);
        }

エディターを作成して変数としてキャッシュする静的関数を最初に呼び出すことで、エディターを読み込むことができました。initでエディター作成メソッドを実行します。これにより、wordpressが必要なすべてのスクリプトをエンキューするようになります。

エディターインスタンスを作成するとき、tinymceを使用するように設定することが重要です。この方法で、tinymce jsファイルもエンキューされます。


4

それに苦労した後、新しい要素を追加した後のコールバックで、動作するソリューションを見つけました:

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

奇妙なことに、コーデックスの内部にはドキュメントがありません。


1
tinymceは外部リソースなので、tinymce自身のドキュメントでカバーされていると思うかもしれません-tinymce.com/docs-しかし、例がかなり貧弱です... また、この回答が機能するためにはtincemceスクリプトを含める必要があります!(最も簡単な方法はwp_editor()tinymceargを設定してダミーPHP を1つ出力することですtrue:-)
jave.web

おかげで仲間...これも私のために動作します
-ajax

3

最後に、実用的なソリューション:

wordpressでアクションを追加し、発言しますMy_Action_Name(テキストエリアIDにも注意してください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;
});

次に、ダッシュボードで、この関数を実行します(注、My_TextAreaID_22およびの使用My_Action_Name):

function start_Ajax_request() { 
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Get default Wordpress SETTINGS  ( I cant confirm, but if you will need to change target ID, then add this line:  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();     // < ---- EXECUTE

2

ajax textareaを追加したら、もう一度エディターのinitを呼び出す必要があります。次のようにしました。

$.fn.tinymce_textareas = function(){
  tinyMCE.init({
    skin : "wp_theme"
    // other options here
  });
};

次に、次のように、ajaxの後に関数を呼び出します。

$('#my_new_textarea_container').html(response).tinymce_textareas();

2
これがどのように機能するのか説明してください。これは動作しません。私はそれを試してみました。
アーメドフーアッド

tinyMCEが必要なテキストエリア(response)を含むajaxコンテンツを追加した後、tinyMCEを新しいテキストエリアで初期化するtinymce_textareas関数を呼び出します。
シャハール

1

githubの @toschoの使用可能なソリューション。彼はここでの質問に対してもこの素晴らしい結果を構築しました。詳細については彼の答えをご覧ください。


これには使用するライブラリが必要です
-T5

0

このコードを使用してください。

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

詳細はこちらをご覧ください


このコードがどのように役立つかを要旨を共有してから、詳細を記載したリンクを追加してください。リンクが壊れている場合、リンクのみの回答は無効になります。ご理解ください。:)
Mayeenulイスラム

そのリンクは現在壊れており、答えの背景には文脈がありません。(「リンクだけ」の回答が悪い理由の1つ)
スダー

これは動作しますが、あなたがテキストやビジュアルを選択したときに、それがエディタ内に重複したテキスト領域を作成し、いくつかの問題を持っている
ヨハン・プレトリア

0

私はこの方法でそれを管理しました:

  1. まず、ajaxを呼び出すメインページでwp_editorを呼び出す必要があります。ただし、非表示のdivでラップする必要があります。

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

Idはrundomで一意でなければなりません。設定は、ajaxエディターの設定と同じでなければなりません。

  1. 次に、ajaxレスポンスでこれを呼び出す必要があります。

wp_editor( '', '[set id as you need]', array(the same settings as in the main page) ); _WP_Editors::editor_js(); //this print editor init code


0

これは管理ページで機能します。

JS AJAXによって新しいwpエディターをコンテナーに追加するには:

1)functions.phpでwp_editorを返すwp_ajax関数を作成します

2)jQueryスクリプトを作成して新しいテキストエディタを要求し、この場合、ボタンを押したときにコンテナに追加します

PHPファイル

function yourprefix_get_text_editor() {
    $content = ""; // Empty because is a new editor
    $editor_id = $_POST["text_editor_id"]; // Random ID from AJAX JS call
    $textarea_name = $_POST["textarea_name"]; // Name from JS file
    $settings = array(
        'textarea_name' => $textarea_name
    );
    wp_editor($content, $editor_id, $settings);
    wp_die(); // Mandatory wp_die
}
add_action('wp_ajax_yourprefix_get_text_editor', 'yourprefix_get_text_editor');

JSスクリプト(jsfile.js)

jQuery(function($) {
$("someelement").click(function(e) { // To Add an Editor from a button click
    var target = themeajax.ajax_url; // Passed from wp_localize_script
    var editor_id = "editorid"; // Generate this dynamically
    var textarea_name = "textareaname" // Generate this as you need
    var data = {
        'action': 'yourprefix_get_text_editor',
        'text_editor_id': editor_id,
        'textarea_name': textarea_name
    }
    $.post(target, data, function(response) {
        container.append(response); // Use your logic to get the container where you want to append the editor
        tinymce.execCommand('mceAddEditor', false, editor_id);
        quicktags({id : editor_id});
    });
}
});

エンキュースクリプトの呼び出し:

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');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.