ページがロードされたら、TinyMCEエディタをどのように作成しますか?
AJAXリクエストにwp_editor
呼び出しを入れて表示すると、次のようになります。
ビジュアルタブとテキストタブは、機能しておらず、ツールバーでも、アクティブなTinyMCEインスタンスでもなく、HTMLマークアップだけです。 TinyMCEのJSコンポーネントをインスタンス化する必要がありますが、どうすればいいですか?
また、AJAX response PHPで_WP_Editors::editor_js();
を呼び出してみたところ、console.logを使用してコンソールで応答を確認でき、そこにJSスクリプトが表示されますが、 DOMに挿入されず、実行されることもありません。
TinyMCE 4用に更新されました
私はいくらか進歩しました
隠されたdivに最初のページロードでwp_editorをロードして、それからエディタマークアップをつかむためにAJAX呼び出しをしてください。
PHPにいる間は、wp_editor呼び出しによって作成されたエディターのIDを取得する必要があります。残念ながら、_WP_Editorsクラスの変数は非公開ですが、フィルタを使用することでこれを回避できます。これを行うには、まず出力バッファ内のeditor_jsフックを呼び出します。このJSはAJAXを介して返送されて挿入された場合は機能しませんが、必要な設定を生成し、必要なJSを出力しようとします。
この呼び出しの最後に、_WP_Editorsクラスがフィルターを介してmcesettings配列をページングします。これを使用して、コピーを作成し、エディターIDを次のものから取得できます。
add_action( 'after_wp_tiny_mce', array( $this, 'steal_away_mcesettings' ) );
function steal_away_mcesettings( $mcesettings ) {
$this->mcesettings = $mcesettings;
}
そのため、このフィルタを追加した後は、editor_js関数を呼び出します。
ob_start();
_WP_Editors::editor_js();
ob_end_clean();
これで、$ mcesettingsコピーを使ってIDのリストを埋めることができます。
$ids = array();
foreach ( $this->mcesettings as $editor_id => $init ) {
$ids[] = $editor_id;
}
Ids配列はhtmlと共にAJAXレスポンスで送り返すことができます。
ブラウザに入ったら、HTMLをページに挿入してから、editor_idsを使用して、TinyMCEインスタンスを次のようにインスタンス化できます。
function tinyMCE_bulk_init( editor_ids ) {
var init, ed, qt, first_init, DOM, el, i;
if ( typeof(tinymce) == 'object' ) {
var editor;
for ( e in tinyMCEPreInit.mceInit ) {
editor = e;
break;
}
for ( i in editor_ids ) {
var ed_id = editor_ids[i];
tinyMCEPreInit.mceInit[ed_id] = tinyMCEPreInit.mceInit[editor];
tinyMCEPreInit.mceInit[ed_id]['elements'] = ed_id;
tinyMCEPreInit.mceInit[ed_id]['body_class'] = ed_id;
tinyMCEPreInit.mceInit[ed_id]['succesful'] = false;
}
for ( ed in tinyMCEPreInit.mceInit ) {
// check if there is an adjacent span with the class mceEditor
if ( ! jQuery('#'+ed).next().hasClass('mceEditor') ) {
init = tinyMCEPreInit.mceInit[ed];
try {
tinymce.init(init);
tinymce.execCommand( 'mceAddEditor', true, ed_id );
} catch(e){
console.log('failed');
console.log( e );
}
}
}
}
}
WordPressスタイルに合わせて必要なTinyMCE設定を自分で生成することはできないため、代わりに、最初のページの読み込みで作成したインスタンスからそれらを盗み取り、コピーを作成します。その後、正しい要素IDを使用するようにコピーを変更し、通常どおり続行して、要素にインスタンスがないことを確認します。